PHP:如何检查PHP脚本是否已经在运行?

PHP:如何检查PHP脚本是否已经在运行?,php,Php,我使用一个php脚本来读取应用程序跳出地址接收到的电子邮件,并对它们进行处理。该脚本计划与cron作业一起运行,但我无法控制它,也没有在服务器上写入文件的权限(因此几乎消除了文件锁定机制)。是否有其他方法可以确保在任何给定时间只运行一个脚本实例?服务器正在运行linux。我想您可以试试这个: // we use ourselves as the lock file if (false === ($f = fopen(__FILE__, 'r'))) { die("Could not op

我使用一个php脚本来读取应用程序跳出地址接收到的电子邮件,并对它们进行处理。该脚本计划与cron作业一起运行,但我无法控制它,也没有在服务器上写入文件的权限(因此几乎消除了文件锁定机制)。是否有其他方法可以确保在任何给定时间只运行一个脚本实例?服务器正在运行linux。

我想您可以试试这个:

// we use ourselves as the lock file
if (false === ($f = fopen(__FILE__, 'r'))) {
    die("Could not open lock file");
}
if (false === flock($f, LOCK_EX)) {
    die("Could not obtain lock");
}
// do your stuff
flock($f, LOCK_UN);
fclose($f);

使用建议锁不需要写访问权限;当然,这是假设在您的配置中启用了
flock()

这有点脏,但是

if(file_exists("block.bin")) {
  //already running
}

file_put_contents("block.bin", 1);

 //do stuff

unlink("block.bin");

您不允许写入
/tmp
?认真地
sys\u get\u temp\u dir()
给了你什么,你能在那里写吗?Memcache,Redis,地狱-如果你必须的话,甚至MySQL。您没有访问任何数据存储引擎的权限吗?
posix_mkfifo
是一个选项吗?与memcached、APC和co相比,它的优势在于默认情况下是启用的。你知道,我甚至没有想过使用数据库作为锁定机制……你有mysql访问权限吗?而是将块作为行存储在表中。你也可以使用APC,或者memcached,我试过了,可以运行2个或更多的实例(使用sleep,因为在流量很少的情况下脚本速度非常快)。flock似乎工作得很好。此外,他们似乎在等待对方,因为第二个实例只有在第一个实例完成睡眠后才睡觉(可能与usleep tho有关,我很少使用它)以上评论的更多信息:似乎等待发生在flock($f,LOCK_EX)线上,因此,不是完全阻止第二个实例,而是延迟它?@Bogdan是的,LOCK_EX和LOCK_UN之间的任何内容都可以被视为关键部分。@Bogdan如果你想在有锁时退出脚本,你可以使用
LOCK_EX | LOCK_NB