2010-04-26 33 views
6

我想检查某个进程已经在使用中的临时文件demo.lock运行:检查如果PHP进程已经运行

demo.php:

<?php 
    $active=file_exists('demo.lock'); 
    if ($active) 
    { 
     echo 'process already running'; 
    } 
    else 
    { 
     file_put_contents ('demo.lock', 'demo'); 
     sleep(10); //do some job 
     unlink ('demo.lock'); 
     echo 'job done'; 
    } 
?> 

但是它不似乎没有用:如果我打开demo.php两次,它总是显示“工作已完成”,也许是因为它认为它是相同的过程?有没有办法做到这一点?我也用getmypid()尝试了类似的结果。

谢谢

+0

我会建议你使用一个命名的互斥体这样的事情,但我不知道这些是在PHP可用.. – 2010-04-26 16:12:36

+0

还,你的操作系统是什么? – zneak 2010-04-26 16:20:54

+0

我已经在Windows和Linux机器上尝试过它,结果相同 – Borgtex 2010-04-27 07:50:14

回答

0

好吧,发送一些头文件和刷新似乎对我来说(不知道为什么),所以现在当我加载页面显示“开始”,如果我在完成该过程之前点击浏览器上的刷新按钮,警告消息:

<?php 

$file = @fopen("demo.lock", "x"); 
if($file === false) 
{ 
    echo "Unable to acquire lock; either this process is already running, or permissions are insufficient to create the required file\n"; 
    exit; 
} 

header("HTTP/1.0 200 OK"); 
ob_start(); 
echo "Starting"; 
header('Content-Length: '.ob_get_length(),true); 
ob_end_flush(); 
flush(); 

fclose($file); // the fopen call created the file already 
sleep(10); // do some job 
unlink("demo.lock");  
?> 

感谢所有的答案和建议,到目前为止

2

适合我。

确保脚本可以在目录中创建一个文件。取消注释“取消链接”行并运行脚本并检查目录中是否存在锁定文件。如果你没有看到它,那么这是一个目录权限问题。

+0

对我来说似乎很奇怪,它也不起作用。但是,如果权限错误,PHP应该发出警告。 – zneak 2010-04-26 16:20:25

+0

您是否尝试过评论“取消链接”这一行? (对不起,这是@Borgtex)@zneak也许他没有看到警告/错误... – zaf 2010-04-26 16:22:39

+0

权限是正确的,在一次运行中,该文件被创建,然后删除,它似乎没有任何问题。问题是,当我在浏览器中运行这个文件,并让我们说5秒后,我再次调用另一个选项卡中,第二个实例,而不是显示警告消息(因为第一个已经运行,该文件已被创建)再次完成整个过程。如果我创建一个名为demo2.php的精确副本并且一个接一个地运行,它将按预期工作;演示等待10秒,demo2立即显示警告 – Borgtex 2010-04-27 07:39:32

2

假设一个“正常,容易”的环境,不能确定你的具体情况有什么问题,因为它适用于我,但至少你的代码中有竞争条件。如果你在同一时间启动两个进程,并且发现demo.lock不存在?

您可以使用fopenx模式来防止这种情况发生。 X模式尝试创建文件;如果它已经存在,它就会失败,并生成一个E_WARNING错误(因此闭锁操作符)。由于文件系统操作在驱动器上是原子的,因此可以保证一次只有一个进程可以保存文件。

<?php 

$file = @fopen("demo.lock", "x"); 
if($file === false) 
{ 
    echo "Unable to acquire lock; either this process is already running, or permissions are insufficient to create the required file\n"; 
    exit; 
} 

fclose($file); // the fopen call created the file already 
sleep(10); // do some job 
unlink("demo.lock"); 
echo "Job's done!\n"; 

?> 

我在这里测试过它,它似乎工作。

+0

+1原子测试和设置 – oedo 2010-04-26 16:28:04

+0

感谢您的建议的,我看到使用的fopen如何增加检查安全的另一个层面。但是,我仍然有同样的问题;这就像二审等待第一个结束和删除文件,再次 – Borgtex 2010-04-27 07:47:06

+0

@Borgtex创建:那么你的问题,我百思不得其解。我看不出为什么会失败。 :/呃,至少我希望我有用。 – zneak 2010-04-27 22:10:05

相关问题