我的PHP简单Cron实现代码运行了两次
我的PHP简单Cron实现代码运行了两次,php,wordpress,plugins,cron,Php,Wordpress,Plugins,Cron,我的环境: wordpress-->我的插件 在myplugin中,我使用wp-loaded操作触发我的cronfunc运行 我的cronfunc伪代码: add_action('wp_loaded','cronfunc'); function cronfunc() { if(defined('IN_MY_CRON_FUNC')) return; define('IN_MY_CRON_FUNC',true);
我的环境:
wordpress-->我的插件
在myplugin中,我使用wp-loaded操作触发我的cronfunc运行
我的cronfunc伪代码:
add_action('wp_loaded','cronfunc');
function cronfunc()
{
if(defined('IN_MY_CRON_FUNC'))
return;
define('IN_MY_CRON_FUNC',true);
if nowtime - get_option('last_do_work_time') > 3600:
update_option('last_do_work_time',nowtime);
run cronjob
}
问题是有时cronfunc会运行两次有人告诉我为什么吗?我的插件出现了问题,我所有的统计条目都翻了一番。WordPress似乎在每一页上都做了一些奇怪的双重调用
我从来没有想到确切的原因,但我的解决办法是在插件中编写日志代码,但我从
元素中的single.php
模板中调用日志函数。我似乎无法在手动设置的插件上加载两次。代码如下:
<?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);
}
}
?>
add_action”调用位于何处?@FMaz008:在与cronfunc相同的文件中,这是插件条目文件。根据您的回答,我将代码更改为:function cronfunc(){if(defined('in_My_CRON_FUNC')返回;define('in_My_CRON_FUNC',true);if(get_option('My_CRON_LOCK'))return;update_option('MY_CRON_LOCK',1);if nowtime-get_option('last_do_work_time')>3600:update_option('last_do_work_time',nowtime);run cronjob delete_option('MY_CRON_LOCK');}
我会告诉你这是否行得通。我有个问题。。我从未真正使用过wordpress,但他们不是内置了cron处理吗?你不是在为此调用钩子吧?是的,有wp-cron,我没有使用它。它可以工作,但最后我切换到wp-cron,因为我的实现会减慢用户的速度,这会触发cronjobs运行。
<?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);
}
?>