Как я могу использовать file_put_contents () с FILE_APPEND | LOCK_EX безопасность? - PullRequest
11 голосов
/ 19 января 2012

Я использую:

file_put_contents("peopleList.txt", $person, FILE_APPEND | LOCK_EX);

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

В руководстве по PHP говорится, что в случае неудачи он вернет ложное значение.

Если не удастся установить блокировку файла, произойдет сбой или попытка продолжится, пока не удастся?Если произойдет сбой, когда не будет получена блокировка, каков будет лучший способ обеспечения записи данных?

Возможно, зацикливание функции в цикле while до тех пор, пока она не вернет false (cringe) илипросто предоставить пользователю (посетителю веб-сайта) какой-то графический интерфейс, запрашивая повторную попытку?

Ответы [ 2 ]

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

На самом деле мой предыдущий ответ был немного устаревшим. flock() блокируется до получения запрошенной блокировки :

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

Так что, поскольку file_get_contents() использует это, я бы предположил, что это то же самое. Тем не менее, имейте в виду, что это зависит от операционной системы.

Немного важнее то, что вам не нужно блокировать файл в описанном вами сценарии по причинам N.B. уже объяснил. Если вы не используете CLI SAPI, я не могу думать о распространенном сценарии, вы должны беспокоиться о блокировке файлов.

0 голосов
/ 25 января 2012

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

if ($result === false) { print "failed to lock"; }

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

...