2013-10-27 3 views
1

Попытка отладить некоторые проблемы с пресловутым псевдо-кроном WordPress. Мысль о том, чтобы поместить это в WordPressAnswers, но я думаю, что это меньше о WP и более базовом PHP-вопросе о foreach, который, кажется, никогда не прошел свой первый запуск. (Да, определенно посмотрел на кучу подобных вопросов, но никакой любви там, извините.)Почему этот цикл PHP foreach выполняется только один раз?

Вот код с тремя контрольными точками, где я добавил выход для тестирования. Я включаю весь код всего в цикл, просто чтобы быть тщательным, хотя большинство из них, вероятно, не относится к делу. Контрольные точки 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

Какова ценность '$ gmt_time'? – geomagas

+0

устанавливается через microtime (true). в этот момент, за другую контрольную точку выхода выше в моем коде, 1382918286.117 – Sapphireblue

+0

Знал это ... См. мой ответ ниже. – geomagas

ответ

1

Ну, foreach не может быть ошибкой.

Единственный способ, которым ваша петля могла выполнять только одну итерацию, это то, что она break s. И это могло означать только то, что первый $timestamp больше $gmt_time.

(Там же return возможность вблизи дна, но Вы уже сказали, что вы получаете одну строку текста, поэтому он не мог бы пойти таким образом ...)

Я предполагаю, что вы хотите просто пропустить итерацию, если запланированная задача будет в будущем. Для этого просто измените break на continue.

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 

Что бы объяснить, почему ваши разрывы петли на первой итерации.

+0

oh для pete's .... Я думал, что устранил бы это, фактически комментируя этот разрыв в какой-то момент с одинаковыми результатами, но попробовав его снова, да : время вывода пять. я готовлюсь к нисходящей линии на моем Вопросе Позора. Спасибо, оба. (и жаль, что я не могу поддержать ваш ответ.) – Sapphireblue

Смежные вопросы