【发布时间】:2010-04-06 00:29:29
【问题描述】:
我在 PHP 中有一个手工制作的 ORM,它似乎遇到了对象限制并导致 php 崩溃。这是一个会导致崩溃的简单脚本:
<?
class Bob
{
protected $parent;
public function Bob($parent)
{
$this->parent = $parent;
}
public function __toString()
{
if($this->parent)
return (string) "x " . $this->parent;
return "top";
}
}
$bobs = array();
for($i = 1; $i < 40000; $i++)
{
$bobs[] = new Bob($bobs[$i -1]);
}
?>
即使从命令行运行它也会导致问题。有些盒子可以容纳超过 40,000 个物体。我已经在 Linux/Apache 上尝试过(失败),但我的应用程序在 IIS/FastCGI 上运行。在 FastCGI 上,这会导致著名的“FastCGI 进程意外退出”错误。
显然 20k 个对象有点高,但如果对象有数据和嵌套复杂性,它会崩溃的对象要少得多。
快速 CGI 不是问题 - 我已经尝试从命令行运行它。我尝试将内存设置为非常高的值 - 6,000MB 和非常低的值 - 24MB。如果我将它设置得足够低,我会得到“分配的内存大小 xxx 字节用尽”错误。
我认为这与被调用的函数的数量有关 - 某种嵌套预防。我不认为我的 ORM 的嵌套有那么复杂,但也许确实如此。我有一些非常清楚的案例,如果我再加载一个对象,它就会死掉,但如果它有效,它会在 3 秒内加载。
【问题讨论】: