sem_release(): не удалось освободить ключ 0xc: неверный аргумент

Я использую семафор для синхронизации некоторых частей в моем приложении.

При освобождении семафора (sem_release) я получаю это предупреждение:

sem_release (): не удалось освободить ключ 0xc: неверный аргумент

Во-первых, я не знаю, выпустил ли семафор, но так как я не получаю "true" в результате, я думаю, что он не выпускается.

Версия PHP: 5.6.30

ipcs -V => ipcs от util-linux 2.25.2

Вот семафор:

key        semid      owner      perms      nsems 
0x0000000c 4124122    myUser      666        3

Вот часть кода (класс Synchronization):

...
if ( !( $this->semaphoreId = sem_get( $this->id, 1 ) ) )
    throw new RuntimeException( 'Error getting Semaphore.');
...

if ( !sem_acquire( $this->semaphoreId ) )
   throw new RuntimeException( 'Error acquiring Semaphore.');
...
if ( !sem_release( $this->semaphoreId ) )
    throw new RuntimeException( 'Error releasing Semaphore.');

PS Я получаю эту ошибку только в моей производственной среде, и я не могу воспроизвести / отладить в моей тестовой среде.

Я искал в интернете это сообщение об ошибке, но ничего не нашел.

Кто-нибудь знает, что означает это сообщение?

Отредактировано:

  1. Сообщение об ошибке не появляется каждый раз при запуске скрипта.
  2. Я действительно иногда получаю сообщение об ошибке "Ошибка получения семафора" с аналогичным предупреждением "sem_acquire(): не удалось получить ключ 0xc: идентификатор удален", НО не в одно и то же время (день), я получаю "Ошибка освобождения семафора"
  3. Класс выше используется повсеместно с различными ключами для синхронизации части кода приложения. У меня нет никаких проблем с другими ключами. И да, этот ключ "12"/"0xc" используется ТОЛЬКО в одном месте и от одного и того же пользователя.
  4. Проблемы с разрешением не должны возникать, потому что при проверке разрешения семафора "0xc" будет "666"

1 ответ

Не могли бы вы выполнить шаги с самого начала:

  • Получение семафора resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )
  • Приобретение семафора bool sem_acquire ( resource $sem_identifier [, bool $nowait = false ] )

и добавьте проверки работоспособности, чтобы убедиться, что вышеуказанная функция возвращает ожидаемое значение.

Не могли бы вы также проверить, работает ли другая часть вашего приложения под тем же пользователем, чтобы избежать проблем с разрешениями.

Другие вопросы по тегам