PHP如何导致内存泄漏,缓冲区溢出,堆栈溢出以及此类任何其他错误? PHP甚至会导致这样的错误吗?
答案 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中配置的内存大小