php - 在最后一个完成之前不要运行 cron php 任务

标签 php linux bash concurrency cron

我有一个 php-cli 脚本,由 cron5 分钟 运行一次。因为这个时间间隔很短,多个进程同时运行。这不是我想要的,因为此脚本必须在文本文件中写入一个每次递增的数字 id。碰巧 writers 同时在这个文本文件上写,写的值是不正确的。

我曾尝试使用 php 的 flock 函数来阻止在文件中写入,当另一个进程正在写入文件但它不起作用时。

$fw = fopen($path, 'r+');
if (flock($fw, LOCK_EX)) {
    ftruncate($fw, 0);
    fwrite($fw, $latestid);
    fflush($fw);
    flock($fw, LOCK_UN);
}
fclose($fw);

所以我想解决这个问题的方法是创建一个 bash 脚本来验证是否有这个 php 脚本 的实例正在运行,如果是的话它应该等待直到它完成。但我不知道该怎么做,有什么想法吗?

最佳答案

我使用 bash 脚本 的解决方案是这样的:

exec 9>/path/to/lock/file
if ! flock -n 9  ; then
    echo "another instance is running";
    exit 1
fi
# this now runs under the lock until 9 is closed (it will be closed automatically when the script ends)  

文件描述符 9>/var/lock/file 中创建,并且 flock 将退出正在尝试运行的新进程,除非没有正在运行的脚本的其他实例。

How can I ensure that only one instance of a script is running at a time (mutual exclusion)?

关于php - 在最后一个完成之前不要运行 cron php 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23970981/

相关文章:

php - 如何通过使用 join 2 次或更多次随机选择 2 行

php - exec ('ping' ) 在开发服务器中工作但不在生产中

macos - 如何修复终端在 OS X Lion 上不加载 ~/.bashrc

bash - 将多个命令通过管道传输到单个命令,没有 EOF 信号等待

java - 在 Android 应用程序的 mysql DB 中存储图像的最佳选择?

php - Symfony2 中的 Zend Framework 1 应用程序 - session 问题

Linux命令行打开任意目录

bash - 函数内的参数替换

php - 根据日期从多个表中选择行

c - 如何在 SDK 的交叉编译器中访问 -ldl