为什么这个 PHP foreach 循环只执行一次


Why is this PHP foreach loop only executing once?

试图调试WordPress臭名昭著的伪cron的一些问题。考虑过把它放在WordPressAnswers上,但我认为这不是关于WP的,而是一个基本的PHP问题,似乎永远不会超过它的第一次运行。(是的,肯定看了一堆类似的问题,但没有爱,对不起。

这是代码,其中包含 3 个检查点,我在其中添加了用于测试的输出。我将所有代码都包含在循环中,只是为了彻底,尽管其中大部分可能无关紧要。检查点 2 和 3 永远不会为我显示,检查点 1 只显示一次(即在循环的第一次迭代中)。未显示是我输出$crons的地方,并计数($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循环

我会感激我错过的任何东西的额外关注。我 95% 确定这是 WP 核心代码,除了我的检查点,尽管出于各种原因,另一个程序员在我们的版本控制系统的最终运行中在这里胡思乱想并非不可能。显然,这是一个完全不同的问题!

假设$gmt_time是当前的UTC时间,那么时间戳1382968401会更大(在撰写本文时):

$d = new DateTime('@'.'1382968401', new DateTimeZone('UTC'));
echo $d->format('Y-m-d H:i:s'); // output 2013-10-28 13:53:21

这可以解释为什么你的循环在第一次迭代时中断。

嗯,foreach不会错的。

循环只能执行一次迭代的唯一方法是它break s。这只能意味着第一个$timestamp大于$gmt_time

(底部附近还有return的可能性,但你已经说过你收到一行文本,所以它不可能那样......

我猜如果计划任务是将来,您希望跳过迭代。为此,只需更改break continue .