После поиска через Google кажется, что каждый использует текстовый файл, чтобы показать пример блокировки файла с помощью flock ()
то я попробовал
<?php $dom = new DOMDocument("1.0"); $fp = $dom->load('bt.xml'); //$fp = fopen("bt.xml", "w"); if (flock($fp, LOCK_EX | LOCK_NB)) { echo "Got lock!\n"; sleep(10); flock($fp, LOCK_UN); } else { print "Could not get lock!\n"; }?>
но он дает ошибку
Предупреждение: flock () ожидает, что параметр 1 будет ресурсом, boolean задан в /var/www/html/testphp/lock1.php в строке 6 Не удалось получить блокировку!
Функция flock () принимает дескриптор файла в качестве своего первого параметра и операцию блокировки в качестве второго параметра. Файловые дескрипторы, которые вы уже знаете, и операции просты: LOCK_SH запрашивает общую блокировку, LOCK_EX запрашивает эксклюзивную блокировку, а LOCK_UN освобождает блокировку. Вызов flock () вернет true, если блокировка файла была успешно восстановлена, или false, если она не удалась. Так, например, flock () можно использовать следующим образом:
<?php $fp = fopen( $filename,"w"); // open it for WRITING ("w") if (flock($fp, LOCK_EX)) { // do your file writes here flock($fp, LOCK_UN); // unlock the file } else { // flock() returned false, no lock obtained print "Could not lock $filename!\n"; } ?>
Механизм блокировки файлов в PHP автоматически делает очереди процессов для своих блокировок по умолчанию. Например, сохраните этот следующий скрипт как flock.php:
<?php $fp = fopen("foo.txt", "w"); if (flock($fp, LOCK_EX)) { print "Got lock!\n"; sleep(10); flock($fp, LOCK_UN); } ?>
Этот скрипт пытается заблокировать файл foo.txt, поэтому вам нужно будет создать этот файл. Скрипт блокирует его с помощью LOCK_EX, что означает, что никакая другая программа не может заблокировать этот файл. Как только блокировка будет получена, сценарий будет спать в течение десяти секунд, затем разблокирует файл и завершает работу. Если блокировка не может быть получена, потому что у другого приложения есть блокировка, скрипт ждет при вызове flock (), чтобы блокировка была освобождена, а затем сама блокирует и продолжает.
Чтобы проверить это, откройте две команды и дважды запустите сценарий. Первый запуск скрипта немедленно получит блокировку и напечатает «Got lock!», А затем спящий на десять секунд. Если во время первого спящего сценария вы запускаете второй скрипт, он будет ждать («блокировать») вызов flock () и ждать завершения первого скрипта. Когда первый скрипт заканчивается, второму скрипту удастся получить его блокировку, распечатайте «Got lock!». затем спать еще на десять секунд, пока он окончательно не прекратится.
Иногда нежелательно, чтобы ваши сценарии ожидали, что файл будет разблокирован, и в этой ситуации вы можете добавить дополнительную опцию ко второму параметру, используя побитовый оператор OR, |. Если вы перейдете в LOCK_NB ORed с вашим обычным вторым параметром, PHP не будет блокироваться при запросе блокировки файла. Это означает, что если блокировка файла недоступна, функция flock () будет немедленно возвращаться к false, а не зависать, ожидая, когда блокировка станет доступной.
Вот как это выглядит в коде:
<?php $fp = fopen("foo.txt", "w"); if (flock($fp, LOCK_EX | LOCK_NB)) { echo "Got lock!\n"; sleep(10); flock($fp, LOCK_UN); } else { print "Could not get lock!\n"; } ?>
На этот раз первый скрипт получит блокировку и печать «Got lock!», Тогда как второй не сможет получить блокировку, немедленно вернуться и напечатать «Не удалось заблокировать!».