Я не могу заставить его загружаться дважды на установленном вручную плагине. Вот код:
<?php
/*
Plugin Name: test
Plugin URI: http://localhost
Description: nothing really
Version: 00.001
Author: somebody
Author URI: http://localhost
*/
add_action('wp_loaded','cronfunc');
function cronfunc() {
$myFile = (pathinfo(__FILE__));
$myFile = $myFile['dirname']."/testFile.txt";
$now = microtime(true);
if ( $now - get_option('last_do_work_time') > 3 ) { #I set to 3 seconds to test
$fh = fopen($myFile, 'a+') or die("can't open file");
fwrite($fh, microtime(true)." - ".$now - get_option('last_do_work_time')."-\n");
fclose($fh);
update_option('last_do_work_time',$now);
}
}
?>
Сохранено как test.php, помещено в папку с плагинами и активировано. Это случается много или просто время от времени? Возможно, что они проходят IF, прежде чем обновляться снова. В этом случае вам может потребоваться заблокировать параметр и подождать или пропустить, если он уже запущен. Вам может понадобиться использовать семафоры или создать что-то подобное с помощью базы данных ... возможно, вы могли бы использовать опции wordpress для определения типа мьютекса или чего-то еще. DEFINE () не поможет, потому что если он будет выполняться снова рядом, они не будут влиять друг на друга.
вот, вероятно, плохой способ сделать это, но пока что это может сработать:
<?php
/*
Plugin Name: test
Plugin URI: http://localhost
Description: nothing really
Version: 00.001
Author: somebody
Author URI: http://localhost
*/
function wplock_release($id='check_cronfunc') {
delete_option($id);
}
# not the best, but might work
function wplock_aquire($id='check_cronfunc') {
$guid = com_create_guid(); #maybe just need uniqid or something, but just testing stuff
# check if anyone else has lock and set, not sure if we can force lines inside php
if ( get_option($id) !== false
|| !update_option($id,$guid)
|| get_option($id) != $guid )
{
return false;
}
register_shutdown_function(wplock_release($id)); # probably don't need this
return true; # maybe just return true or something
}
add_action('wp_loaded','cronfunc');
function cronfunc() {
$myFile = (pathinfo(__FILE__));
$myFile = $myFile['dirname']."/testFile.txt";
$now = microtime(true);
if ( wplock_aquire() ) {
if ( $now - get_option('last_do_work_time') < 3 ) { # less than 3 seconds
wplock_release();
return;
}
wplock_release();
} else {
return;
}
$fh = fopen($myFile, 'a+') or die("can't open file");
fwrite($fh, microtime(true)." - ".$now - get_option('last_do_work_time')."-\n");
fclose($fh);
update_option('last_do_work_time',$now);
}
?>
РЕДАКТИРОВАТЬ: установить блокировку опции и вернуть, если не получается ... немного небрежно, но только для идеи