2

いくつかのアクション イベントをスケジュールした直後に、WordPress の cron タスクを実行しようとしています。通常、WordPress Cron は、スケジュールされたタスクをトリガーするために少なくとも別のページの読み込みを行います。さっそくやろうとしています。以下のコードに示すように、私はほとんどそれを行うことができました。

/* Plugin Name: Sample Cron Immediate Execution  */

add_action('admin_menu', 'sample_cron_immediate_execution');
function sample_cron_immediate_execution() {
    add_options_page(
        'Sample Cron Immediate Execution', 
        'Sample Cron Immediate Execution', 
        'manage_options',
        'sample_cron_immediate_execution', 
        'sample_cron_immediate_execution_admin');
}
function sample_cron_immediate_execution_admin() {
    ?>
    <div class="wrap">
    <?php
        wp_schedule_single_event(time(), 'my_action1');
        wp_schedule_single_event(time(), 'my_action2');
        $cron_url = site_url( 'wp-cron.php?doing_wp_cron=0');
        wp_remote_post( $cron_url, array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
        echo 'cron tasks should be executed by now.';
    ?>
    </div>
    <?php
}

add_action('my_action1', 'myeventfunc1'); 
function myeventfunc1() {
    sleep(10); // assuming it's a heavy task 
    sample_log(date('l jS \of F Y h:i:s A'), __DIR__ . '/myevent1_log.html');
}

add_action('my_action2', 'myeventfunc2');    
function myeventfunc2() {
    sleep(10); // assuming it's a heavy task 
    sample_log(date('l jS \of F Y h:i:s A'), __DIR__ . '/myevent2_log.html');
}

function sample_log($time, $file) {
    file_put_contents($file, $time . '<br />', FILE_APPEND);
}

問題は、タスクの 1 つが重い場合、WordPress が の 1 回の呼び出しですべてのタスクを完了しないように見えることですwp-cron.phpdoing_wp_cronコア ファイルのコードを表示すると、$_GET の値が関係していると推測しています。

コメントの1つは言う

グローバル $doing_wp_cron ロックを使用するか、GET ロックを使用します。ロックがない場合は、新しいロックを取得しようとします。

これが何についてなのか、私は完全には理解していません。私がやりたいのは、タスクの重さに関係なく、別のページを開く必要なく、複数のスケジュールされたタスクをすぐに実行することです。

情報ありがとうございます。

4

4 に答える 4

8

ネイティブ スケジューラを再構築する理由 これはうまくいくはずです:

function my_job() {
    // heavy lifting
}
add_action( 'my_hook', 'my_job' );

wp_schedule_single_event( time(), 'my_hook', array( 'my_arg' ) );
spawn_cron();
于 2014-08-26T23:18:01.087 に答える
5

これでうまくいくはずです。

<?php
    /* Plugin Name: Sample Cron Immediate Execution  */

    add_action('admin_menu', 'sample_cron_immediate_execution');
    function sample_cron_immediate_execution() {
        add_options_page(
            'Sample Cron Immediate Execution', 
            'Sample Cron Immediate Execution', 
            'manage_options',
            'sample_cron_immediate_execution', 
            'sample_cron_immediate_execution_admin');
    }
    function sample_cron_immediate_execution_admin() {
        ?>
        <div class="wrap">
        <?php
            $cron_url = site_url( '?custom_cron=myeventfunc1');         
            wp_remote_post( $cron_url, array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
            $cron_url = site_url( '?custom_cron=myeventfunc2');         
            wp_remote_post( $cron_url, array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
            echo 'cron tasks should be executed by now.';
        ?>
        </div>
        <?php
    }

    add_action('init', 'run_customcron');
    function run_customcron() 
    {
        if (isset($_GET['custom_cron']))
        {
            call_user_func($_GET['custom_cron']);
        }
    }

    function myeventfunc1() {
        sleep(10); // assuming it's a heavy task 
        sample_log(date('l jS \of F Y h:i:s A'), __DIR__ . '/myevent1_log.html');
    }

    function myeventfunc2() {
        sleep(10); // assuming it's a heavy task 
        sample_log(date('l jS \of F Y h:i:s A'), __DIR__ . '/myevent2_log.html');
    }

    function sample_log($time, $file) {
        file_put_contents($file, $time . '<br />', FILE_APPEND);
    }
于 2012-10-02T23:22:11.423 に答える
1

タイムアウトを 30 秒に変更してみてください。

wp_remote_post( $cron_url, array( 'timeout' => 30, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
于 2012-10-01T12:45:34.187 に答える
-1

1 つのイベントだけをスケジュールし、それをすぐに実行したい場合に、なぜ cron を使用する必要があるのか​​よくわかりません。なぜアクションを実行しないのでしょうか?

do_action('my_action1');
do_action('my_action2');

Wordpress は、ページにアクセスするたびに期限切れの cron を自動的に実行するため、手動で wp-cron を呼び出す理由がわかりません。

あなたについて

タスクの 1 つが重い場合、WordPress は wp-cron.php の 1 回の呼び出しですべてのタスクを完了しないようです

PHP はデフォルトで、スクリプト (Wordpress cron を含む) の実行に 30 秒以上かかると強制終了することを知っておいてください。たとえば、5 つの cron がスケジュールされていて、それぞれの実行にちょうど 9 秒かかるとします。最初の 3 つは実行されますが、最後の 2 つは実行されません (PHP は 4 番目を開始するとすぐに終了します)。set_time_limitサーバーがWordPress cron内で非常に大きなcURLリクエストを実行できるようにするために、PHPの機能を使用して良好な結果を得ました。

さらにいくつかのこと:

  • cron は非同期であると想定されています。同期しようとしているため、ページの読み込みが大幅に遅れる可能性があります。
  • add_action電話する前に必ず電話してくださいdo_action
于 2012-10-03T17:57:24.687 に答える