【问题标题】:Causing PHP to crash导致 PHP 崩溃
【发布时间】:2011-01-24 10:20:09
【问题描述】:

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

【问题讨论】:

  • 希望不会。它应该在此类错误发生之前检测并避免它们。
  • 您是指 PHP 引擎,还是运行在引擎之上的 PHP 脚本?
  • @Frank 运行在引擎之上的 php 脚本

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


【解决方案1】:

通过导致某种无限递归,您可能会导致 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 ... 致命错误。

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

【讨论】:

  • 爱那个:shell_exec("killall -11 httpd");
  • 我希望这个值得的人不会成为自动接受的答案,因为它很难回答这个问题。不过很好的例子。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    您可以在任何语言中执行会导致溢出的事情(例如递归调用当前函数、盲目地占用内存等),或者依靠优秀的旧 PHP 解释器来完成这项工作。看看how many memory leaks were fixed in PHP5 (我最喜欢的:在 5.2.6 中,他们修复了bug #44069:'使用. 而不是.= 连接的巨大内存使用率')。

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

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2018-01-23
      • 2020-12-02
      • 2013-11-11
      • 2015-02-23
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多