我在以下场景中无法正确使用flock(),希望你能帮我解决问题。
下面这段代码分别放入两个不同的PHP脚本中:一个是test1.php,另一个是test2.php。该代码的目的是创建一个文件,只有一个进程(正确使用flock()代码的进程)可以写入它。许多不同的PHP脚本会尝试获取对该文件的独占锁定,但任何时候只有一个脚本可以访问,并且当它们未能获取锁定时,所有其他脚本都应该优雅地失败。
测试方式非常简单。将“test1.php”和“test2.php”放置在服务器上的Web可访问目录中。然后利用Firefox等浏览器先执行第一个脚本,接着立即从不同的浏览器选项卡中执行第二个脚本。如果代码从两个不同的PHP脚本(如“test1.php”和“test2.php”)运行,则似乎可以工作。但是,当从相同的“test1.php”脚本或“test2.php”脚本运行代码两次时,第二个运行的脚本将不会立即返回失败。
我唯一能想到的原因是,flock()将所有具有相同文件名的PHP进程视为同一进程。如果是这种情况,那么当从两个不同的浏览器选项卡中运行“test1.php”或“test2.php”时,PHP将看到它们是同一进程,因此不会失败。但对我来说,PHP不应该像这样设计,所以我想知道是否有其他人能够为我解决这个问题。
提前感谢!
下面这段代码分别放入两个不同的PHP脚本中:一个是test1.php,另一个是test2.php。该代码的目的是创建一个文件,只有一个进程(正确使用flock()代码的进程)可以写入它。许多不同的PHP脚本会尝试获取对该文件的独占锁定,但任何时候只有一个脚本可以访问,并且当它们未能获取锁定时,所有其他脚本都应该优雅地失败。
测试方式非常简单。将“test1.php”和“test2.php”放置在服务器上的Web可访问目录中。然后利用Firefox等浏览器先执行第一个脚本,接着立即从不同的浏览器选项卡中执行第二个脚本。如果代码从两个不同的PHP脚本(如“test1.php”和“test2.php”)运行,则似乎可以工作。但是,当从相同的“test1.php”脚本或“test2.php”脚本运行代码两次时,第二个运行的脚本将不会立即返回失败。
我唯一能想到的原因是,flock()将所有具有相同文件名的PHP进程视为同一进程。如果是这种情况,那么当从两个不同的浏览器选项卡中运行“test1.php”或“test2.php”时,PHP将看到它们是同一进程,因此不会失败。但对我来说,PHP不应该像这样设计,所以我想知道是否有其他人能够为我解决这个问题。
提前感谢!
<?
$file = 'command.bat';
echo "Starting script...";
flush();
$handle = fopen($file, 'w+');
echo "Lets try locking...";
flush();
if(is_resource($handle)){
echo "good resource...";
flush();
if(flock($handle, LOCK_EX | LOCK_NB) === TRUE){
echo "Got lock!";
flush();
sleep(100);
flock($fp, LOCK_UN);
}else{
echo "Failed to get lock!";
flush();
}
}else{
echo "bad resource...";
flush();
}
exit;
非常感谢您对以上内容的帮助!
谢谢, 丹尼尔
sleep
需要的是秒而不是毫秒。可能更多是浏览器缓存问题,因为页面仍然返回相同的文本,因为它被客户端缓存了。 - developerwjk