我有一个脚本正在运行多次,导致验证花费更长的时间,并允许该脚本的多个实例。 它应该每天运行一次,但是昨天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 票数:1

听起来很混乱,虽然您不希望运行脚本的18个实例。 您应该修复调用这些脚本实例的代码。

但是,您可以在脚本本身中实现此检查。 为确保脚本仅运行一次,应使用flock() 我举一个例子:

将其添加到您的代码的顶部 ,该代码应一次仅运行一次:

// 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);

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

  ask by William Bruce translate from so

未解决问题?本站智能推荐:

关注微信公众号