尝试用WordPress'臭名昭着的伪cron调试一些问题。考虑将这个放在WordPressAnswers上,但我认为这不是关于WP而是更多关于foreach的基本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核心代码,除了我的检查点,虽然由于各种原因,另一个程序员在我们的版本控制系统的最终版本中捣乱不是不可能的。显然是另一个问题!
答案 0 :(得分:2)
假设$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
这可以解释为什么你的循环在第一次迭代时会中断。
答案 1 :(得分:1)
好吧,foreach
不能错。
你的循环只能进行一次迭代的唯一方法就是它break
。这可能只意味着第一个$timestamp
大于$gmt_time
。
(底部附近还有return
可能性,但你已经说过收到一行文字了,所以它不可能那样......)
我猜你想要在未来计划的任务中跳过迭代。为此,只需使用break
更改continue
。