1

WordPress の悪名高い疑似 cron に関するいくつかの問題をデバッグしようとしています。これをWordPressAnswersに載せることを考えましたが、これはWPに関するものではなく、最初の実行を決して超えないように見えるforeachに関する基本的なPHPの質問だと思います. (はい、確かに似たような質問をたくさん見ましたが、そこには愛がありませんでした。申し訳ありません。)

テスト用の出力を追加した 3 つのチェックポイントを含むコードを次に示します。徹底的にするために、ループ内のすべてのコード全体を含めていますが、そのほとんどはおそらく的外れです。チェックポイント 2 と 3 は表示されず、チェックポイント 1 は一度だけ表示されます (つまり、ループの最初の繰り返しで)。$crons と count($crons) を出力している場所は示されていません。これは、確かに複数の要素があることを確認するためのものです。

foreach ( $crons as $timestamp => $cronhooks ) {
    echo("<br>loop for timestamp " . $timestamp); // checkpoint 1
    if ( $timestamp > $gmt_time ) {
    break;
        }

    foreach ( $cronhooks as $hook => $keys ) {
    echo("<br>loop for hook " . $hook); // checkpoint 2

        foreach ( $keys as $k => $v ) {

            $schedule = $v['schedule'];

            if ( $schedule != false ) {
                $new_args = array($timestamp, $schedule, $hook, $v['args']);
                call_user_func_array('wp_reschedule_event', $new_args);
            }

            wp_unschedule_event( $timestamp, $hook, $v['args'] );

             do_action_ref_array( $hook, $v['args'] );

            // If the hook ran too long and another cron process stole the lock, quit.
            if ( _get_cron_lock() != $doing_wp_cron ) {
                echo("quitting!"); // checkpoint 3
                return;
            }
        }
    }
}

私の5つの要素にもかかわらず、これから得られるすべての出力は次のとおりです。

タイムスタンプ 1382968401 のループ

私が見逃しているものに目を向けてくれてありがとう。私のチェックポイントを除いて、これが WP コア コードであると 95% 確信していますが、さまざまな理由から、別のプログラマーがバージョン管理システムの最終段階でここでいじっていたことは問題外ではありません。明らかに、まったく別の問題です。

4

2 に答える 2

1

まあ、foreach間違ってはいけません。

ループが反復を 1 回だけ実行できる唯一の方法は、それをbreaks にすることです。$timestampこれは、最初の値が より大きいことを意味するだけです$gmt_time

(下の方にもreturn可能性はありますが、1行のテキストを受け取ると言っていたので、その通りにはならなかったはずです...)

スケジュールされたタスクが将来のものである場合は、反復をスキップしたいだけだと思います。そのためには、 で変更breakするだけcontinueです。

于 2013-10-27T23:57:30.100 に答える