导致PHP崩溃

时间:2010-03-06 10:30:24

标签: php memory-leaks stack-overflow buffer-overflow

PHP如何导致内存泄漏,缓冲区溢出,堆栈溢出以及此类任何其他错误? PHP甚至会导致这样的错误吗?

3 个答案:

答案 0 :(得分:12)

通过引起某种无限递归,可能导致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受到保护的递归方案。例如,调用没有退出条件的递归函数或递归自我生成生成器。这些不会导致崩溃,但会导致Allowed memory size of ...致命错误。

有关更多示例,您可能希望看到:

答案 1 :(得分:2)

你可以做任何会导致任何语言溢出的东西(比如递归调用当前函数,盲目地吃内存等)或者依靠优秀的旧PHP解释器来完成这项工作。只需查看how many memory leaks were fixed in PHP5(我最喜欢的是:在5.2.6中,他们修复了bug #44069:'使用.而不是.='进行串联的大量内存使用情况。)

如果您只想提供单个http请求,那么总的来说,PHP ok (最多)。但你真的不能用它做复杂的东西(我曾经尝试过实施一个Peer2Peer客户端,服务器在10分钟后死于内存不足 - 当然可能是我的错误,但我花了几天时间发现泄漏我自己的代码 - 无济于事。)

答案 2 :(得分:1)

PHP是一种解释型语言,因此所有php脚本都受到保护,免受内存泄漏,缓冲区溢出和堆栈溢出的影响。

你怎么会遇到这样的问题:

整数溢出,如果指定的数字太大,它将溢出,并且不会发生异常。

内存不足,使用的内存多于php.ini中配置的内存大小