Не конкретный кодовый вопрос, а вопрос общего кодирования. Я пытаюсь использовать семафор в рабочем проекте, чтобы ограничить количество пользователей, которые могут обращаться к определенным процессам в одно и то же время.
По моему мнению, следующее:
$iKey = ftock($sSomeFileLocation,'sOneCharacterString'); //Generate the key if($sem_id = sem_get($iKey)){ //1 user allowed if(sem_acquire($sem_id)){ //Do the limited process here sem_release($sem_id); } }
Проблема, которую я вижу здесь, заключается в том, что если уже есть один пользователь, у которого есть ключ семафора, следующий пользователь просто ждет, пока первый пользователь не будет выполнен, а не просто выйдет из строя. Кто-нибудь знает, каким образом, если число max_acquire было достигнуто, sem_acquire (или аналогичный) вернет false?
благодаря
Нет, это невозможно в соответствии с реализацией, используемой PHP.
Согласно man-странице semop()
, она должна иметь флаг IPC_NOWAIT
где-то, но не похожа на реализацию PHP.
Фактически, глядя на исходный код PHP для пакета sysvsem , вы можете ясно видеть, что он будет продолжать блокировать, даже если сигналы прерывают заблокированный процесс (строка 320). Хотя это может быть не оптимальным, это прекрасно, если вы понимаете ограничения.
Что касается вашего варианта использования, могут быть другие реализации (например, блокировка файлов против файловой системы), что было бы так же полезно для большинства случаев использования и иметь возможность делать именно то, что вам нужно …
Начиная с PHP 5.6.1, он поддерживает параметр $ nowait для sem_acquire:
bool sem_acquire ( resource $sem_identifier [, bool $nowait = false ] )
Кстати, второй параметр ftok () в PHP должен быть одной символьной строкой, а не строкой, состоящей из нескольких символов, как в вашем случае. Например
$project = "c"; $key = ftok(__FILE__, $project);