PHP 如何导致内存泄漏、缓冲区溢出、堆栈溢出和任何其他此类错误?PHP甚至会导致这样的错误吗?
3 回答
通过导致某种无限递归,您可能会导致 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 ...
致命错误。
有关更多示例,您可能希望查看:
您可以在任何语言中执行会导致溢出的操作(例如递归调用当前函数、无意识地占用内存等),或者依靠良好的旧 PHP 解释器来完成这项工作。看看在 PHP5 中修复了多少内存泄漏(我最喜欢:在 5.2.6 中,他们修复了错误 #44069:'使用连接.
而不是'的巨大内存使用.=
)。
总而言之,如果您只想提供单个 http 请求,那么 PHP 是可以的(最多)。但是你不能用它来做复杂的事情(我曾经尝试实现一个 Peer2Peer 客户端,服务器在 10 分钟后就因内存不足而死了——当然可能是我的一个错误,但我花了几天时间来寻找漏洞我自己的代码 - 无济于事)。
PHP 是一种解释型语言,因此所有 php 脚本都受到保护,不会出现内存泄漏、缓冲区溢出和堆栈溢出。
您将如何遇到以下问题:
整数溢出,如果分配的数字太大会溢出,不会出现异常。
内存不足,使用的内存超过 php.ini 中配置的内存大小