尝试调试 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
我会很感激我对我所缺少的任何东西的额外关注。我 95% 确定这是 WP 核心代码,除了我的检查点,尽管由于各种原因,另一个程序员在这里围绕我们的版本控制系统进行最终运行并不是不可能的。显然是另一个问题!