У меня есть два разных файла PHP, которые записываются в один и тот же файл. Каждый скрипт PHP вызывается действием пользователя двух разных HTML-страниц. Я знаю, что можно будет вызывать два файла PHP, но оба файла PHP попытаются записать в файл одновременно? Если да, что произойдет? Кроме того, можно сделать один из PHP неудачным изящно (запись файла просто не сработает, а другой PHP может записать в файл), поскольку одна функция PHP менее важна, чем другая.
Обычный способ обращения к этому состоит в том, чтобы оба сценария использовали flock()
для блокировки:
$f = fopen('some_file', 'a'); flock($f, LOCK_EX); fwrite($f, "some_line\n"); flock($f, LOCK_UN); fclose($f);
Это заставит скрипты ждать друг друга, чтобы выполнить работу с файлом, прежде чем писать на него. Если вам нравится, «менее важный» сценарий может сделать:
$f = fopen('some_file', 'a'); if(flock($f, LOCK_EX | LOCK_NB)) { fwrite($f, "some_line\n"); flock($f, LOCK_UN); } fclose($f);
так что он просто ничего не сделает, если обнаружит, что что-то занято файлом.
Пожалуйста, обратите внимание:
Начиная с PHP 5.3.2, автоматическая разблокировка, когда дескриптор ресурса файла закрыт, была удалена. Разблокирование теперь всегда должно выполняться вручную.
Обновленный обратный код:
if (($fp = fopen('locked_file', 'ab')) !== FALSE) { if (flock($fp, LOCK_EX) === TRUE) { fwrite($fp, "Write something here\n"); flock($fp, LOCK_UN); } fclose($fp); }
т.е. вам нужно вызвать flock (.., LOCK_UN) явно, потому что fclose () больше не делает этого.
Обратите внимание, что posix указывает на атомарный доступ, если файлы открыты как append . Это означает, что вы можете просто добавить к файлу несколько потоков, и они не будут повреждены.
Я проверил это с помощью дюжины потоков и нескольких сотен тысяч строк. Ни одна из строк не была повреждена.
Это может не работать со строками более 1 КБ, поскольку буферизация может превышать.
Это может также не работать на Windows, который не совместим с posix.
Посмотрите на функцию скопления .
FYI: flock работает только на * nix и недоступен в Windows