Подтвердить что ты не робот

Почему блокирование такого беспорядка в PHP?

Пользователь SO спросил вопрос, на который ответ эффективно "использовал механизм блокировки".

Во время исследования моего ответа я обнаружил, что в PHP, по-видимому, нет простого механизма межзадач-надежного блокирования. flock() имеет большое толковое предупреждение:

В некоторых операционных системах flock() реализуется на уровне процесса. При использовании API многопоточного сервера, такого как ISAPI, вы не сможете полагаться на flock() для защиты файлов от других скриптов PHP, работающих в параллельных потоках одного и того же экземпляра сервера!

Обсуждение в этом вопросе глубоко вникает в проблему, но появляется только с довольно сложными решениями: использование RAM-диска или Memcache.

Единственное, что выглядит наполовину хорошим, это mySQL GET_LOCK().

Итак, мой вопрос: действительно ли так оно и есть? В PHP нет простой, простой, кросс-платформенной безопасной системы блокировки? Тот, который является атомарным и освободит блокировку, если процесс владельца погибнет и не потребует огромных усилий по настройке?

4b9b3361

Ответ 1

Не согласен с ответом Wernight. Да, веб-материал очень уместен, но ограничивающим фактором является то, как ведет себя ОС.

Во всех ОС, поддерживаемых PHP, существует только 2 варианта блокировки файлов - блокировка или неблокирование. В конечном итоге PHP должен использовать механизм блокировки файлов ОС, чтобы избежать конфликтов с кодом, отличным от PHP, для доступа к тем же файлам. Если вы используете блокирующие блокировки, то PHP script может быть заблокирован на неопределенный срок, ожидая освобождения блокировки, а не хорошего сценария для веб-приложения. OTOH, если вы делаете неблокирующий вызов блокировки, и он терпит неудачу - что вы будете делать дальше - вы просто ждете случайного количества времени и позволяете всем вашим скриптам PHP пытаться захватить блокировку?

Единственный практический способ решить эту проблему - это запрограммированный запрос блокировки, который время от времени - но AFAIK там нет ОС, изначально предоставляющих этот объект. Я сам написал такой код - для выделенного веб-сервера, поэтому не было никаких проблем с доступом к другим программам, однако я ожидаю, что можно будет распространиться на общесистемную систему обязательной блокировки с использованием inotify.

Ответ 2

PHP не предназначен как постоянный процесс, а скорее как краткосрочный прожиточный поток в том смысле, что он часто создается и уничтожается. В зависимости от реализации, более одного PHP-процесса могут работать одновременно с одним и тем же кодом.

Я считаю, что различные PHP-реализации (mod_php, PHP CLI и т.д.) затрудняют блокировку и потоки в PHP.