13

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

4

3 回答 3

12

通过导致某种无限递归,您可能会导致 PHP 崩溃。

例如,递归要求自身的文件会导致堆栈溢出:

require __FILE__;  

或者魔术方法中的递归__sleep()应该是反序列化一个对象,而是调用serialize()

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

serialize(new sleepCrasher());

或者创建新实例 的类析构函数:

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 ...致命错误。

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

于 2010-03-06T12:07:14.490 回答
2

您可以在任何语言中执行会导致溢出的操作(例如递归调用当前函数、无意识地占用内存等),或者依靠良好的旧 PHP 解释器来完成这项工作。看看在 PHP5 中修复了多少内存泄漏(我最喜欢:在 5.2.6 中,他们修复了错误 #44069:'使用连接.而不是'的巨大内存使用.=)。

总而言之,如果您只想提供单个 http 请求,那么 PHP 是可以的(最多)但是你不能用它来做复杂的事情(我曾经尝试实现一个 Peer2Peer 客户端,服务器在 10 分钟后就因内存不足而死了——当然可能是我的一个错误,但我花了几天时间来寻找漏洞我自己的代码 - 无济于事)。

于 2010-03-15T19:53:50.250 回答
1

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

您将如何遇到以下问题:

整数溢出,如果分配的数字太大会溢出,不会出现异常。

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

于 2010-03-14T13:30:38.610 回答