一种方法是将 php 函数 flock 与一个虚拟文件一起使用,该文件将充当看门狗。
在我们的工作开始时,如果文件引发 LOCK_EX 标志,则可以退出或等待。
PHP 群文档:http://php.net/manual/en/function.flock.php
对于本示例,必须首先创建一个名为 lock.txt 的文件。
示例1,如果另一个孪生进程正在运行,它将正常退出,无需重试,并给出状态消息。
如果文件 lock.txt 不可访问,它会抛出错误状态。
<?php
$fp = fopen("lock.txt", "r+");
if (!flock($fp, LOCK_EX|LOCK_NB, $blocked)) {
if ($blocked) {
// another process holds the lock
echo "Couldn't get the lock! Other script in run!\n";
}
else {
// couldn't lock for another reason, e.g. no such file
echo "Error! Nothing done.";
}
}
else {
// lock obtained
ftruncate($fp, 0); // truncate file
// Your job here
echo "Job running!\n";
// Leave a breathe
sleep(3);
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
}
fclose($fp); // Empty memory
示例 2,FIFO(先进先出):我们希望进程等待队列之后的执行,如果有的话:
<?php
$fp = fopen("lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
ftruncate($fp, 0); // truncate file
// Your job here
echo "Job running!\n";
// Leave a breathe
sleep(3);
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // release the lock
}
fclose($fp);
也可以将 fopen 置于 x 模式,通过在脚本结束时创建和擦除文件。
创建和打开仅供写作;将文件指针放在
文件的开头。如果文件已经存在,则 fopen() 调用
将返回 FALSE 失败
http://php.net/manual/en/function.fopen.php
但是,进入 Unix 环境,为了进行微调,我发现将每个带有 getmypid() 的后台脚本的 PID 列出到数据库或单独的 JSON 文件中更容易。
当一个任务结束时,脚本负责在这个文件中声明他的状态(eq:success/failure/debug infos等),然后删除他的PID。在我看来,这允许以更简单的方式创建管理工具和守护进程。并在必要时使用posix_kill() 从 PHP 中杀死一个 PID。
微服务是使用类 Unix 管道组成的。
服务可以调用服务。
https://en.wikipedia.org/wiki/Microservices
另请参阅: Prevent PHP script using up all resources while it runs?