通过谷歌搜索后,似乎每个人都使用文本文件来显示如何使用 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是资源,第6行/var/www/html/testphp/lock1.php中给出的布尔值无法锁定!
答案 0 :(得分:2)
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()调用时等待释放锁,然后自行锁定并继续。
要对此进行测试,请打开两个命令提示并运行该脚本两次。第一个脚本运行将立即获得锁定并打印“获得锁定!”,然后睡眠十秒钟。如果在第一个脚本处于休眠状态时启动第二个脚本,它将在flock()调用上等待(“阻塞”)并等待第一个脚本完成。第一个脚本完成后,第二个脚本将成功获取其锁定,打印出“已锁定!”然后再睡十秒钟直到它最终终止。
有时不希望让脚本等待文件解锁,在这种情况下,您可以使用按位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!”,而第二个脚本将无法获得锁定,立即返回,并打印“无法锁定!”