2010-03-06 208 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分钟后死于内存短缺 - 当然可能是我的一个错误,但我花了几天的时间发现泄漏我自己的代码 - 无济于事)。