Intereting Posts

Синхронные записи файлов PHP

У меня есть два разных файла 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