Почему блокировка такого беспорядка в PHP? - PullRequest
16 голосов
/ 21 октября 2010

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 22 октября 2010

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

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

1 голос
/ 22 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...