Nasıl hata ayıklama ve PHP sonsuz döngüler, karşı korumak için?

5 Cevap php

Geçenlerde benim programlama yeteneklerini meydan bir sorunla karşı koştu ve bir çok kaza sonsuz döngü oldu. Ben o kadar kuru bazı kod yeniden yazılmış ve defalarca denilen kesin yöntemlerle çağrılan bir işlev değişmişti; bir ilköğretim sorun, kesinlikle. Apache kırarak sorunu çözmek için karar verdi ve log "kökenli çocuk süreç" ama hiçbir şey kaydetti. Sorun aslında o gün sorunu hata ayıklama bitmiş, asla öğleden sonra kadar kırpılmış oldu, ve bugün bunu çözmek zorunda.

Sonunda, benim çözüm basitti: elle mantık giriş ve ne oldu bakın. Ben her biri yaklaşık iki yüz kere tekrarlandı iki çizgi izledi, iki eşsiz hatları oluşan bir günlük dosyası vardı sorun hemen belli oldu.

Sonsuz döngü karşı kendimizi korumak için bazı yolları nelerdir? O (ve olacak) başarısız olduğunda, onu izini en hızlı yolu nedir? Gerçekten günlük en etkili dosya, ya da başka bir şey mi?

Bir iyi uygulama olsaydı cevap agnostik dil olabilir, ama ben daha ziyade PHP özel teknikleri ve kod ile sopa istiyorum.

5 Cevap

Böyle xdebug gibi bir hata ayıklayıcı kullanabilirsiniz, ve sonsuz döngü içeren şüpheli kodunuzu yürüyebiliyordu.

Xdebug - Debugger and Profiler Tool for PHP

Ayrıca ayarlayabilirsiniz

max_execution_time

zamanı sınırlamak için sonsuz döngü çökmesini önce yanacak.

Bazen güvenli yöntem döngü içinde bir sınır kontrol dahil bulmak. Loop yapısının türü önemli değildir. Bu örnekte ben bir 'süre' deyimi seçti:

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

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

  ...
}

$ Max_loop_iterations için makul bir değer dayalı olabilir:

  • zamanında ayarlanan bir sabit değer
  • bir girişin boyutuna göre hesaplanan değerleri
  • ya da belki bir hesaplanmış değeri göreli zamanı hızına bağlı

Hope this helps, - N

Birim testler çok iyi bir fikir olabilir. Sen phpunit denemek isteyebilirsiniz.

basit kod yazmak, bu yüzden hatalar daha belirgin olacak? Senin sonsuz döngü hiçbir insan muhtemelen anlayabiliyorum bazı denetim yapıları saçma iplik-topu nedeniyle merak ediyorum. Böylece tabii bunu f'ed.

bütün sonsuz döngüler kötü değil (örneğin while (!quit)).

Eğer yürütme iz ve bir çağrı grafik atabilirsin? Sonsuz döngüler açık olacak ve kolayca bir kaza vs (mainloop geri döner asla yerel abababa ... döngü veya döngü) amaç üzerinde olanlar (büyük mainloop) dışarı alabilirsiniz

Ben büyük ve karmaşık programlar için yapar yazılım duydum, ama ben sizin için bir ekran görüntüsü bulamadı. Birisi 3dsmax gibi bir program takip ve gerçekten güzel bir çağrı grafik dışarı dökülüyor.