Я использую:
file_put_contents("peopleList.txt", $person, FILE_APPEND | LOCK_EX);
писать в конец файла и следить за тем, чтобы никто другой (или скрипт) не записывал одновременно один и тот же файл.
В руководстве PHP говорится, что он вернет ложное значение, если оно не будет выполнено.
Если он не может получить блокировку в файле, будет ли он терпеть неудачу или продолжать попытки, пока это не удастся? Если это не удается, когда невозможно получить блокировку, какой был бы лучший способ обеспечить, чтобы данные были написаны?
Возможно, зацикливание функции в цикле while до тех пор, пока она не вернет false (cringe) или просто предоставит пользователю (посетителю сайта) какой-то графический интерфейс с запросом повторить попытку?
Собственно, мой предыдущий ответ был немного устаревшим. flock()
до тех пор, пока не будет получен запрошенный замок :
PHP поддерживает переносимый способ блокировки полных файлов консультативным способом (что означает, что все программы доступа должны использовать один и тот же способ блокировки или не работать). По умолчанию эта функция блокируется до тех пор, пока не будет получен требуемый замок; это можно контролировать (на платформах, отличных от Windows) с опцией LOCK_NB, описанной ниже.
Так как file_get_contents()
использует его, я бы предположил, что это то же самое. Тем не менее, следует предупредить, что он зависит от операционной системы.
Чуть более важно, вам не нужно блокировать файл в описанном вами сценарии, по причинам, которые NB уже объяснил. Если вы не используете CLI SAPI, я не могу придумать общий сценарий, о котором вы должны беспокоиться о блокировке файлов.
Если функция не получает блокировку для файла, она возвращает ошибку, которую вы можете использовать.
if ($result === false) { print "failed to lock"; }
Теперь, если вы хотите попытаться получить блокировку несколько раз, просто используйте цикл, чтобы продолжать пытаться писать в файл.