如何确保我只有一个通过Apache运行的PHP脚本实例?

时间:2011-08-10 22:47:23

标签: php apache

我有一个index.php脚本,我在Google Code网站上用作提交后的网址。此脚本克隆目录并构建可能需要一些工作的项目。我想避免让这个脚本并行运行多次。

如果另一个脚本已经在会话中,是否有一种机制可以用来避免执行该脚本?

3 个答案:

答案 0 :(得分:23)

您可以flock使用LOCK_EX获取对文件的独占锁定。

E.g:

<?php
$fp = fopen('/tmp/php-commit.lock', 'r+');
if (!flock($fp, LOCK_EX | LOCK_NB)) {
    exit;
}

// ... do stuff

fclose($fp);
?>

对于5.3.2之后的PHP版本,您需要使用手动释放锁定     flock($ fp,LOCK_UN);

答案 1 :(得分:1)

仅当您保存正在运行的脚本的状态时,如果其他脚本当前处于活动状态,则检查脚本何时启动。

例如,要保存脚本正在运行,您可以执行以下操作:

$state = file_get_contents('state.txt');

if (!$state) {
   file_put_contents('state.txt', 'RUNNING, started at '.time());

   // Do your stuff here...

   // When your stuff is finished, empty file
   file_put_contents('state.txt', '');
}

答案 2 :(得分:1)

运行需要多长时间。

可以使用memcache

<?php
$m = new Memcache(); // check the constructor call

if( $m->get( 'job_running' ) ) exit;

else $m->set( 'job_running', true );



//index code here

//at the end of the script

$m->delete( 'job_running' );

?>

如果任务失败,您需要从memcache中清除。 Flock也是一个不错的选择......实际上可能更好。