2010-08-05 77 views
1

更新的信息:Apache的崩潰 - PHP

操作系統Windows 7 32位 的Apache 2.2.15 PHP 5.2.13


這是很奇怪的。當我在我的應用程序中找到這個URI時:

/view/course/teid/1/cid/-1/pos/30 

Apache崩潰。

當我去一個非常類似的URI - 像這樣的:

/view/course/teid/1/cid/-1/pos/29 

,一切工作正常。

這是錯誤日誌:

[Thu Aug 05 11:22:14 2010] [notice] Parent: child process exited with status 255 -- Restarting. 

我已經能夠追查導致Apache的崩潰行:

if (true === $aCourseTree->SetNodePassed($node)) { // this line crashes Apache 
    self::writeTreeToDb($aCourseTree, $training, $this->aUtils); 
} 

的方法是在這裏:

public function SetNodePassed(CourseTreeNode $theNode) 
{ 
    $aWasChange = !isset($theNode->Passed) || $theNode->Passed !== true; 
    $theNode->Passed = true; 

    if ($aWasChange && isset($theNode->Parent)) { 
     if (true === $this->AreChildrenPassed($theNode->Parent)) { 
      $this->SetNodePassed($theNode->Parent); 
     } 
    } 
    return $aWasChange; 
} 

這到底是怎麼回事?如果有一些錯誤,它應該只是一個PHP錯誤。爲什麼Apache崩潰?

+0

你確定它不是導致問題的下一行 - 啓動'自我的一個:: writeTreeToDB '? – Mike 2010-08-05 09:36:40

+0

不會。如果我評論該行,它仍然崩潰。當我註釋掉整個條件但是不留下靜態方法時,它就可以工作。 – 2010-08-05 09:38:12

+0

什麼版本的php?what os? – 2010-08-05 09:39:12

回答

1

你如何在你的Apache中運行PHP?

mod_php可以輕易殺死Apache工作進程[1],Apache服務器整體的正確操作過程是嘗試返回儘可能「乾淨」的狀態。一個進程在損壞的內存後清理幾乎是不可能的,但重啓是非常安全和容易的。[2]將系統返回到已知良好的狀態還有很長的路要走。

您可能希望切換到FastCGI實現而不是mod_php;如果你需要更多的理由,這裏有一個非常精心編寫的一套理由:

http://www.majordojo.com/2007/11/is-mod-php-falling-out-of-favor-with-hosting-providers.php

[1] PHP小組要求的Linux發行版的安全團隊來停止調用PHP解釋器崩潰的bug「安全問題」 - 他們經常修正這些錯誤,在PHP和它的庫中可遠程利用的安全漏洞被淹沒在噪音中。

[2]當然,要重新執行它自己,它需要調用內存中可能會損壞的exec()函數之一,但希望Apache主進程中唯一損壞的內存是記分板。所以重新執行應該足夠安全。

0

嘗試包括這在你的PHP腳本的頂部,看看你得到了什麼錯誤

ini_set('error_reporting', E_ALL);