Мой PHP простой код реализации Cron выполняется дважды - PullRequest
0 голосов
/ 18 ноября 2011


Мое окружение:
WordPress -> myplugin
в myplugin Я использую wp -loaded для запуска моего cronfunc для запуска
my 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 будет запускаться дважды!
Кто-нибудь скажет мне почему?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2011

Я не могу заставить его загружаться дважды на установленном вручную плагине. Вот код:

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

РЕДАКТИРОВАТЬ: установить блокировку опции и вернуть, если не получается ... немного небрежно, но только для идеи

0 голосов
/ 18 ноября 2011

У меня была проблема с моими плагинами, когда все мои записи статистики удвоились.Казалось, что WordPress совершил какой-то странный двойной вызов на каждой странице.

Я так и не понял, почему, но мой обходной путь заключался в написании кода регистрации внутри плагина, но я вызываю функцию регистрации изнутришаблон single.php в элементе <entry>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...