导致PHP崩溃

13

PHP如何引起内存泄漏、缓冲区溢出、堆栈溢出以及类似的错误?PHP是否会引起这样的错误?


1
希望不会出现这种情况。它应该在错误发生之前检测并避免这些错误。 - Gumbo
2
https://dev59.com/VXRA5IYBdhLWcg3wuAcp - Pavunkumar
1
你是指 PHP 引擎,还是在引擎上运行的 PHP 脚本? - Frank Shearar
@Frank PHP脚本运行在引擎之上。 - yretuta
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可以进行保护。例如,在没有退出条件或递归自我生成器的情况下调用递归函数。这些不会导致崩溃,但会引发"内存分配大小已超过..."的致命错误。
更多示例,请参见:
- PHP崩溃PHP Crashers - 使PHP崩溃的十种方法Top 10 ways to crash PHP

4
喜欢那个:shell_exec("killall -11 httpd"); - p4bl0
希望这位用户的回答不会被自动接受,因为它几乎没有回答问题。不过是个好例子。 - Humphrey Bogart

2
你可以通过执行一些在任何语言中都会导致溢出的操作(例如递归调用当前函数,无脑地消耗内存等),或者依靠老旧的PHP解释器来完成这项工作。只需查看 PHP5中有多少内存泄漏被修复(我的最爱:在5.2.6中,他们修复了错误#44069:“使用 . 而不是 .= 进行连接时,内存使用量巨大”)。
总的来说,如果你只想为单个HTTP请求提供服务,那么PHP就是“还行”的(至多)。但你无法真正做到复杂的事情(我曾经尝试实现一个Peer2Peer客户端,服务器在仅10分钟后由于内存短缺而死亡 - 当然可能是我的问题,但我已经花了几天时间找到自己代码中的泄漏 - 毫无结果)。

1

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

然而,您可能会遇到以下问题:

整数溢出,如果您分配了一个太大的数字,它将溢出,并且不会发生任何异常。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接