如何使用flock锁定xml文件

时间:2012-12-20 08:06:38

标签: php locking

通过谷歌搜索后,似乎每个人都使用文本文件来显示如何使用 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中给出的布尔值无法锁定!

1 个答案:

答案 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!”,而第二个脚本将无法获得锁定,立即返回,并打印“无法锁定!”