PHP如何导致内存泄漏、缓冲区溢出、堆栈溢出和任何其他此类错误?PHP会导致这样的错误吗?
发布于 2010-03-06 20:07:14
通过导致某种无限递归,您可能会导致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 ...致命错误。
有关更多示例,您可能希望查看以下内容:
发布于 2010-03-16 03:53:50
你可以在任何语言中做会导致溢出的东西(比如递归地调用当前函数,无意识地消耗内存,等等)。或者依靠老式的PHP解释器来完成这项工作。只要看看how many memory leaks were fixed in PHP5 (我最喜欢的:在5.2.6中,他们修复了bug #44069:“使用.而不是.=进行连接的巨大内存使用量”)。
总而言之,如果你只想为一个http请求提供服务,PHP是可以的(最多)。但你不能真的用它做复杂的事情(我曾经尝试实现一个Peer2Peer客户端,服务器在10分钟后就死于内存不足-当然,这可能是我的一个错误,但我花了几天的时间在我自己的代码中发现了漏洞-但没有用)。
发布于 2010-03-14 21:30:39
PHP是一种解释型语言,因此所有的php脚本都受到保护,不会出现内存泄漏、缓冲区溢出和堆栈溢出。
你会遇到这样的问题:
整数溢出,如果您分配的数字太大,它将溢出,并且不会发生异常。
内存不足,使用的内存多于在php.ini中配置的内存大小
https://stackoverflow.com/questions/2392157
复制相似问题