Как избежать блокировки файлов при сбое процесса / сервера PHP? - PullRequest
5 голосов
/ 19 января 2012

Я новичок в PHP.Я понимаю, что могу использовать flock(), чтобы заблокировать файл и избежать состязаний, когда два пользователя достигают одного и того же php-файла, добавляя содержимое в блокируемый файл.

Однако что произойдет, если произойдет сбой php-процесса?Что происходит со следующим пользователем, ожидающим блокируемый файл?Что произойдет, если сервер выйдет из строя (кто-то потянет за вилку)?Блокировка автоматически снята?Будет ли файл оставаться заблокированным после перезагрузки сервера?

Чтобы сделать его коротким, обеспечивает ли PHP правильную обработку таких критических ситуаций (т. Е. Блокировка не была явно снята)?Если нет, то как следует справляться с этими ситуациями?Как излечиться от этих?

1 Ответ

5 голосов
/ 19 января 2012

Блокировки обрабатываются ОС.Следовательно:

  • если происходит сбой процесса, все удерживаемые им блокировки снимаются (вместе с любым другим типом удерживаемого ресурса)
  • если происходит сбой системы, блокировки не имеют смысла, поскольку онине «переносить» к следующей перезагрузке

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

Однако , если настройка вашего веб-сервера такова, что каждый запрос не обрабатывается новым процессом, то, если один запрос ненормально завершается (скажем, поток прерывается), блокировка будет сохраняться и блокировать все дальшезапросы на блокировку, быстро приводящие к взаимоблокировке веб-сервера.Это одна из многих причин, по которым вы действительно не должны использовать настройки, которые не обеспечивают изоляцию на уровне процесса среди запросов ( отказ от ответственности: я не эксперт по веб-серверу - я могу ошибаться в «не должен»)часть, хотя я сомневаюсь в этом ).

...