2

cronjob を使用して、1 分ごとに実行される php スクリプトを実行しています

コピーのみが実行されていることも確認する必要があるため、この 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で「Mutex クラス」を見たところですが、それが安定しているか、誰かが試したかどうかはわかりません。

4

4 に答える 4

1

ミューテックスを処理するためのシンプルなインターフェイスを提供する私のライブラリninja-mutexを使用することをお勧めします。現在、ロックを処理するために 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!');
}
于 2013-05-12T14:29:14.293 に答える