Как отладить, и защитить от, бесконечные циклы в PHP?

Взаимно блокируемые функции не блокируют. Они являются атомарными, означая, что они могут завершиться без возможности контекстного переключения во время инкремента. Таким образом, нет никакого шанса мертвой блокировки, или ожидать.

я сказал бы, что необходимо всегда предпочитать его блокировке и инкременту.

Энергозависимый полезно, если Вам нужны записи в одном потоке, который будет считан в другом, и если Вы хотите, чтобы оптимизатор не переупорядочил операции на переменной (потому что вещи происходят в другом потоке, который оптимизатор не знает о). Это - ортогональный выбор к тому, как Вы увеличиваете.

Это - действительно хорошая статья, если Вы хотите читать больше о коде без блокировок и правильном способе приблизиться к записи ее

http://www.ddj.com/hpc-high-performance-computing/210604448

6
задан 2 revs, 2 users 100% 5 August 2009 в 18:58
поделиться

5 ответов

Вы можете использовать отладчик, такой как xdebug, и пройтись по вашему коду, который, как вы подозреваете, содержит бесконечный цикл.

Xdebug - Инструмент отладчика и профилировщика для PHP

Вы также можете установить

max_execution_time

, чтобы ограничить время записи бесконечного цикла до сбоя.

15
ответ дан 8 December 2019 в 12:22
поделиться

Иногда я считаю, что самый безопасный метод - это включить проверку предела в цикл. Тип конструкции цикла не имеет значения. В этом примере я выбрал оператор while:

$max_loop_iterations = 10000;
$i=0;
$test=true;
while ($test) {

  if ($i++ == $max_loop_iterations) {
    echo "too many iterations...";
    break;
  }

  ...
}

Разумное значение для $ max_loop_iterations может быть основано на:

  • постоянном значении, установленном во время выполнения
  • , вычисленном значении, основанном на размере ввода
  • или, возможно, вычисленное значение, основанное на относительной скорости выполнения

Надеюсь, это поможет, - N

3
ответ дан 8 December 2019 в 12:22
поделиться

написать простой код, чтобы ошибки были более очевидными? Интересно, не является ли ваш бесконечный цикл следствием какого-то нелепого клубка управляющих структур, который ни один человек не может понять. Таким образом, вы, конечно, нашли это.

все бесконечные циклы неплохи (например, while (! Quit) ).

0
ответ дан 8 December 2019 в 12:22
поделиться

Модульные тесты тоже могут быть хорошей идеей. Вы можете попробовать PHPUnit.

1
ответ дан 8 December 2019 в 12:22
поделиться

можно ли отследить выполнение и выгрузить граф вызовов? бесконечные циклы будут очевидны, и вы можете легко выбрать те, которые созданы специально (огромный основной цикл) против случайности (локальный цикл abababa ... цикл или цикл, который никогда не возвращается в основной цикл)

Я слышал о программное обеспечение, которое делает это для больших сложных программ, но я не смог найти для вас снимок экрана. Кто-то отследил такую ​​программу, как 3dsmax, и выгрузил действительно красивый граф вызовов.

0
ответ дан 8 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: