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.');

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

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

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

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

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

8

Решение

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

  • Получение семафора 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 ] )

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]