2009-07-16 79 views
5

我最近遇到了一個挑戰我的編程能力的問題,這是一個非常偶然的無限循環。我重寫了一些代碼來乾涸它,並改變了一個被它所稱的確切方法反覆調用的函數;當然是一個基本問題。 Apache決定通過崩潰來解決問題,並且日誌除了「衍生出的子進程」之外什麼都沒有注意到。問題是我當天從未真正完成調試問題,下午出現問題,今天不得不解決問題。如何調試並防止PHP中的無限循環?

最後,我的解決方案很簡單:手動記錄邏輯並查看發生了什麼。當我有一個由兩條獨特的行組成的日誌文件時,這個問題立刻就顯而易見,隨後是兩行,每行重複兩百次。

什麼是保護自己免受無限循環的一些方法?而且,如果它失敗了(它會),追蹤它的最快方法是什麼?它確實是最有效的日誌文件,還是別的?

如果您的答案是最佳做法,您的答案可能是語言不可知的,但我寧願堅持使用PHP特定的技術和代碼。

+1

這個問題並沒有像一般的「我們如何編寫無錯軟件」這個問題一樣讓我感到困惑...... – gahooa 2009-07-16 19:43:49

+0

@gahooa,就是你;我對無錯軟件不感興趣,因爲它永遠不會到達那裏。我只想提出解決這個問題的提示,這讓我在前些日子看不到。 – 2009-07-17 12:12:38

回答

15

您可以使用調試器(如xdebug),並遍歷您懷疑包含無限循環的代碼。

Xdebug - Debugger and Profiler Tool for PHP

您還可以設置

max_execution_time 

限制時間的無限循環會崩潰之前燃燒。

+0

我完全忘記了xdebug。謝謝! – 2009-07-17 12:18:17

0

寫簡單的代碼,所以錯誤會更明顯?我想知道你的無限循環是否是由於人類無法理解的控制結構的一些荒謬的毛球。所以你當然會這樣做了。

所有無限循環都不壞(例如while (!quit))。

+0

這是在100行代碼庫中;在那裏沒有太多的掛我。麻煩在於重寫了一對交織在一起的程序的一個例程,並顛倒了呼叫流程。 `a-> b-> c`成爲'<-> b`。 – 2009-07-17 12:16:17

1

單元測試也可能是一個好主意。您可能想嘗試PHPUnit。

3

我有時會發現最安全的方法是在循環中加入限制檢查。循環結構的類型無關緊要。在這個例子中,我選擇了「而」聲明:

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

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

    ... 
} 

爲$的合理值max_loop_iterations可能是基於:

  • 恆定的值設置在運行時
  • 基於計算值輸入的大小
  • 或者一個計算值基於相對速度運行時

希望噸他的幫助, - N

0

你可以跟蹤執行並轉儲出一個調用圖嗎?無限循環將是顯而易見的,你可以很容易地挑出那些故意(一個巨大的主循環)與事故(當地的阿巴巴......)循環或循環,永遠不會返回到主循環)

我聽說過軟件可以爲大型複雜程序執行此操作,但我找不到截圖。有人追蹤了像3dsmax這樣的程序,並拋出了一個非常漂亮的調用圖。