【发布时间】:2015-04-22 22:56:32
【问题描述】:
我试图了解使用 PHP 中的群来同步文件读/写的正确方法。
我有两个 php 脚本。
testread.php:
<?
$fp=fopen("test.txt","r");
if (!flock($fp,LOCK_SH))
echo "failed to lock\n";
else
echo "lock ok\n";
while(true) sleep(1000);
?>
和 testwrite.php:
<?
$fp=fopen("test.txt","w");
if (flock($fp,LOCK_EX|LOCK_NB))
{
echo "acquired write lock\n";
}
else
{
echo "failed to acquire write lock\n";
}
fclose($fp);
?>
现在我运行 testread.php 并让它挂在那里。然后我在另一个会话中运行 testwrite.php。正如预期的那样,flock 在 testwrite.php 中失败了。但是,当 testwrite.php 退出时,文件 test.txt 的内容会被清除。事实上,即使文件已被另一个进程锁定,fopen 也总是会成功。如果文件以“w”模式打开,文件内容将被删除而不管锁定。那么这里的羊群有什么意义呢?它并不能真正保护任何东西。
【问题讨论】:
-
flock 需要一个必须由 fopen 返回的文件句柄。