Что происходит, когда два сценария хотят писать одновременно в файл с LOCK_EX? - PullRequest
1 голос
/ 17 октября 2019

Что произойдет, если скрипт PHP захочет:

file_put_contents("testfile", $s, FILE_APPEND | LOCK_EX);

, в то время как другой скрипт уже делает то же самое с тем же файлом (с LOCK_EX тоже)?

Это маловероятно2 сценария хотят писать точно в течение одной и той же миллисекунды (для файла <100 КБ), но давайте представим, что это происходит. </p>

Если бы функция file_put_contents заметила, что она заблокирована, подождите, скажем, 10 мс, а затемПовторите попытку или PHP-скрипт потерпит неудачу, а записываемые данные будут потеряны?

1 Ответ

2 голосов
/ 17 октября 2019

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

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

Обычно вы не нуждаетесь в LOCK_EX, если используете FILE_APPEND. Каждый вызов write() является атомарным, и когда файл открывается в режиме добавления, файловая система гарантирует, что каждый процесс записывает в новый конец файла, а не в позицию EOF при открытии файла.

...