开发者

php script will only run one at a time

开发者 https://www.devze.com 2023-02-13 00:00 出处:网络
I have a script that I want to make sure only one is running, I am doing: $fp = fopen(\"lock.txt\", \"w\");

I have a script that I want to make sure only one is running, I am doing:

$fp = fopen("lock.txt", "w");
if (flock($fp, LOCK_EX|LOCK_NB)) { // 开发者_开发技巧do an exclusive lock
   //Processing code

   flock($fp, LOCK_UN);
}else{
   echo "Could not lock file!";
}

fclose($fp);

The problem is when I start the second script, it just stays there waiting. If I then stop the first script, the second script will then print "Could Not lock this file". Why doesn't the second script just stop immediately and report that message?

If it ran the second script, it would know that the file is locked and should exit. When I watch my processes I can see the second script sat there ... it's just wating.

Thanks.

EDIT: I have just tried a quick and dirty database lock i.e set a running field to -1 and check for it when the script opens. But that doesn't work. I have also tried using sockets as described: here . It seems like the second file won't even run ... Should I even be worried?


$fp = fopen("lock.txt", "w");
$block = 0;
if (flock($fp, LOCK_EX|LOCK_NB, $block)) { // do an exclusive lock
   sleep(5);
   flock($fp, LOCK_UN);
   echo "Could lock file!";
}else{
   echo "Could not lock file!";
}

fclose($fp);

works for me. Try adding the 3'rd parameter


Edit: You may have some session locking problems: when you call session_start() it will block(put further requests in a waiting state) any other requests to your script until the original script that started the session has finished. To test this, try either accessing with 2 different browsers, or avoid calling session_start() in this script.

0

精彩评论

暂无评论...
验证码 换一张
取 消