php - 确保 php 脚本的一份副本在后台运行

标签 php background cron mutex

我正在使用 cronjob 运行 php 脚本,该脚本每 1 分钟执行一次

我还需要确保仅运行副本,因此如果此 php 脚本在 2 分钟后仍在运行,则 cronjob 不应运行另一个版本。

目前我有 2 个选择,我希望看到您的反馈以及您是否还有其他选择

选项 1:在 php 脚本启动时创建一个 tmp 文件,并在 php 脚本完成时将其删除(并检查该文件是否存在) ---> 对于我来说,此选项的问题是如果我的 php 脚本崩溃无论出于何种原因,它都不会再次运行(tmp 文件不会被删除)

选项 2:运行如下所示的 bash 脚本来控制 php 脚本执行 ---> 很好,但正在寻找可以在 php 中完成的操作

#!/bin/bash
function rerun {
        BASEDIR=$(dirname $0)
        echo $BASEDIR/$1
        if ps -ef | grep -v grep | grep $1; then
            echo "Running"
            exit 0
    else
            echo "NOT running";
            /usr/local/bin/php $BASEDIR/$1 &
            exit $?
    fi

}  
rerun myphpscript.php

PS:我刚刚在 http://www.php.net/manual/en/class.mutex.php 看到了“互斥类”但不确定它是否稳定以及有人尝试过。

最佳答案

您可能想使用我的库 ninja-mutex它提供了处理互斥体的简单接口(interface)。目前可以使用flock、memcache、redis或mysql来处理锁。

下面是一个使用 memcache 的示例:

<?php
require 'vendor/autoload.php';

use NinjaMutex\Lock\MemcacheLock;
use NinjaMutex\Mutex;

$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211);
$lock = new MemcacheLock($memcache);
$mutex = new Mutex('very-critical-stuff', $lock);
if ($mutex->acquireLock(1000)) {
    // Do some very critical stuff

    // and release lock after you finish
    $mutex->releaseLock();
} else {
    throw new Exception('Unable to gain lock!');
}

关于php - 确保 php 脚本的一份副本在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16389228/

相关文章:

php - 将 txt 文件的每一行读取到新的数组元素

background - 在 :hover element 上设置背景的高度和宽度

python - 非特定时间一天一次的crontab?

php - 如何阻止 PHP 向 MYSQL 数据库添加空白行/字段

PHP excel 在一个单元格中

html - 在 HTML 中用两种不同颜色将单元格表拆分为两个三 Angular 形

Powershell Start-Job 无法运行

linux - 如何将脚本的输出保存到日志中

python - 如何在 Python 中获得类似 Cron 的调度程序?

php - 多维数组导致 PHP 插入查询中出现 mysql 错误