2010-03-06 285 views
13

PHP如何導致內存泄漏,緩衝區溢出,堆棧溢出和其他類似的錯誤? PHP甚至會導致這樣的錯誤?導致PHP崩潰

+1

希望沒有。它應該在它們發生之前檢測並避免這樣的錯誤。 – Gumbo 2010-03-06 10:40:14

+2

http://stackoverflow.com/questions/849549/detecting-memory-leaks-in-large-php-stacks – Pavunkumar 2010-03-06 10:45:02

+1

你的意思是PHP的引擎,或PHP腳本運行在引擎之上? – 2010-03-06 12:00:53

回答

11

通過造成一些有點無限的遞歸,你可以導致PHP崩潰。

例如,遞歸需要本身應該導致堆棧溢出文件:

require __FILE__; 

或者在應該反序列化對象的魔法__sleep()方法的遞歸,但呼籲serialize()代替:

class sleepCrasher 
{ 
    public function __sleep() 
    { 
     serialize($this); 
    } 
} 

serialize(new sleepCrasher()); 

或者創建一個新class destructor實例:

class destructorCrasher 
{ 
    public function __destruct() 
    { 
     new destructorCrasher(); 
    } 
} 

// Calling __destruct() manually is just for the sake of example, 
// In real scenarios, PHP's garbage collector will crash PHP for you. 
(new destructorCrasher())->__destruct(); 

除了作爲一個遞歸__toString()

class toStringCrasher 
{ 
    public function __tostring() 
    { 
     return strval($this); 
    } 
} 

strval(new toStringCrasher()); 

有PHP是針對保護的其他遞歸場景。例如,調用一個沒有退出條件的遞歸函數或遞歸自產生成器。這些不會導致崩潰,而是一個致命的錯誤。

更多的例子,你可能想看看:

+4

愛說一句:'了shell_exec(「killall -11的httpd」);' – p4bl0 2010-03-14 13:36:37

+0

我希望這個傢伙的身價,這並不成爲自動接受的答案,因爲它很難回答題。不錯的例子。 – 2010-03-15 21:27:26

1

PHP是一種解釋型語言,因此所有的PHP腳本從內存泄漏,緩衝區溢出保護堆棧溢出。

如何以往你會遇到的問題,例如:

整數溢出,如果你分配一個編號過大就會溢出,並不會發生異常。

出的內存,使用比在php.ini配置內存大小的內存

2

你可以做到這一點會引起任何語言溢出(如遞歸調用當前功能,盲目吃內存等方面的東西。)或依靠良好的PHP解釋器來完成這項工作。只需看看how many memory leaks were fixed in PHP5(我的最愛:在5.2.6中,他們修復了bug #44069:'使用.而不是.='連接的巨大內存使用情況')。

總的來說PHP是ok(最多)如果你只想提供一個http請求。但是你不能真正做到複雜的東西(我曾經嘗試過實現一個Peer2Peer客戶端,服務器在10分鐘後死於內存短缺 - 當然可能是我的一個錯誤,但我花了幾天的時間發現泄漏我自己的代碼 - 無濟於事)。