我的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);
}
?>