限制多个php脚本实例

时间:2013-04-16 22:59:49

标签: php validation multiple-instances

我有一个多次运行的脚本,因为验证需要更长的时间,并允许多个脚本实例。它应该每天运行一次,但昨天script_start()大约在同一时间运行18次。

add_action('init', 'time_validator');

function time_validator() {
    $last = get_option( 'last_update' );        
    $interval = get_option( 'interval' );
    $slop = get_option( 'interval_slop' );

    if ( ( time() - $last ) > ( $interval + rand( 0, $slop ) ) ) {
        update_option( 'last_update', time() );
        script_start();
    }
}

1 个答案:

答案 0 :(得分:1)

听起来很乱,你已经检测到18个脚本运行的实例,尽管你不想这样做。您应该修复调用这些脚本实例的代码。

但是,您可以将此检查实现到脚本本身。要确保脚本只运行一次,您应该使用flock()。我'举个例子:

将此添加到代码的 top 中,该代码应该一次只运行一次:

// open the lock file
$fd = fopen('lock.file', 'w+');

// try to obtain an exclusive lock. If another instance is currently 
// obtaining the lock we'll just exit. (LOCK_NB makes flock not blocking)
if(!flock($fd, LOCK_EX | LOCK_NB)) {
    die('process is already running');
} 

......以及关键代码的结束:

// release the lock
flock($fd, LOCK_UN);
// close the file
fclose($fd);

所描述的方法对竞争条件是安全的,它确实确保关键部分只运行一次。