如何避免PHP对象嵌套/创建限制?

如何避免PHP对象嵌套/创建限制?,php,crash,object,Php,Crash,Object,我有一个用PHP手工制作的ORM,它似乎遇到了对象限制,导致PHP崩溃。下面是一个会导致崩溃的简单脚本: <? class Bob { protected $parent; public function Bob($parent) { $this->parent = $parent; } public function __toString() { if($this->parent)

我有一个用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]);
}    
?>

即使从命令行运行此命令,也会导致问题。有些盒子可以容纳40000多个物体。我在Linux/Apache上试过(失败),但我的应用程序在IIS/FastCGI上运行。在FastCGI上,这会导致著名的“FastCGI进程意外退出”错误

显然,20k对象有点高,但如果对象具有数据和嵌套的复杂性,则崩溃的对象要少得多

快速CGI不是问题所在——我已经尝试过从命令行运行它。我试着将内存设置为非常高的6000 MB和非常低的24MB。如果我把它设置得足够低,我会得到“分配内存大小xxx字节耗尽”错误


我认为这与被调用的函数的数量有关——某种嵌套预防。我不认为我的ORM的筑巢有那么复杂,但也许是这样。我有一些非常清楚的例子,如果我只加载一个对象,它就会死掉,但如果它工作,加载时间不到3秒

有趣的是,在我的环境中,似乎在解构对象时会出现segfault——循环运行正常后放置的代码。只有当PHP开始关闭时,才会发生segfault

您可以,但您可能会发现PHP的维护人员不会特意支持这类事情。我至少看到过一个关于内存泄漏的bug报告,其中的官方响应基本上是“Wontfix:在呈现页面后释放内存,所以这并不重要”——这实际上意味着不支持在快速呈现网页和终止的简单情况下使用

经过5年的全职PHP开发,我得出了一条简单的规则:如果PHP崩溃,不要这样做。PHP有它的局限性,如果你不突破这些局限性,你会发现自己是最成功的


这意味着在PHP中避免
create_function()
有趣的是,在我的环境中,似乎在解构对象时会发生segfault——循环运行正常后放置的代码。只有当PHP开始关闭时,才会发生segfault

您可以,但您可能会发现PHP的维护人员不会特意支持这类事情。我至少看到过一个关于内存泄漏的bug报告,其中的官方响应基本上是“Wontfix:在呈现页面后释放内存,所以这并不重要”——这实际上意味着不支持在快速呈现网页和终止的简单情况下使用

经过5年的全职PHP开发,我得出了一条简单的规则:如果PHP崩溃,不要这样做。PHP有它的局限性,如果你不突破这些局限性,你会发现自己是最成功的

这意味着在PHP中避免使用
create_function()
“医生,我这样做会痛!”——“那就不要那样做。”“医生,我这样做会痛!”——“那就不要那样做。”