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 Я получаю эту ошибку только в моей производственной среде, и я не могу воспроизвести / отладить в моей тестовой среде.
Я искал в интернете это сообщение об ошибке, но ничего не нашел.
Кто-нибудь знает, что означает это сообщение?
Отредактировано:
- Сообщение об ошибке не появляется каждый раз при запуске скрипта.
- Я действительно иногда получаю сообщение об ошибке "Ошибка получения семафора" с аналогичным предупреждением "sem_acquire(): не удалось получить ключ 0xc: идентификатор удален", НО не в одно и то же время (день), я получаю "Ошибка освобождения семафора"
- Класс выше используется повсеместно с различными ключами для синхронизации части кода приложения. У меня нет никаких проблем с другими ключами. И да, этот ключ "12"/"0xc" используется ТОЛЬКО в одном месте и от одного и того же пользователя.
- Проблемы с разрешением не должны возникать, потому что при проверке разрешения семафора "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 ] )
и добавьте проверки работоспособности, чтобы убедиться, что вышеуказанная функция возвращает ожидаемое значение.
Не могли бы вы также проверить, работает ли другая часть вашего приложения под тем же пользователем, чтобы избежать проблем с разрешениями.