访问页面时无限循环

时间:2013-05-28 20:34:28

标签: cakephp loops memory cakephp-1.2 infinite


我有这个cakePHP应用程序(版本1.2),在加载某个页面时,它开始表现出奇怪的内部服务器错误。

然后我在我的本地Mamp环境中安装了xDebug,发现当访问此页面时应用程序会运行循环。不幸的是我不知道如何解释这个,也许你可以帮助我并指出我的方向(在我开始在这里发布代码之前)。

非常感谢!

pic: infinite loop

EDIT - 图中的第14行是指文件mmenu.ctp,其中包含以下请求:

$menus = $this->requestAction('/menus/reto');

MenusController然后包含以下操作:

 MenusController extends AppController {
            var $name = 'Menus';
            var $helpers = array('Html', 'Form');
            function reto(){
                $this->Menu->recursive = 2;
                return $this->Menu->find('all', array('conditions' => array("parent_id" => 0), 'order' => 'Menu.order asc'));
            }
     ...
    }

我希望有所帮助。

编辑2: 哦,我做了更多测试。在正在加载的页面中,有3个requestActions: 1. one从数据库加载导航。 2.和3.调用GalleryController。在两个时候相同的控制器功能,但具有不同的参数。

现在当我要么删除1.或两个图库请求时,网站加载没有任何问题。

可能是,requestAction占用了太多内存? 但是,为什么cakephp开始无限循环对我来说仍然很奇怪。

萤火虫的网络标签没有显示任何有用的信息。它刚刚向我尝试加载的特定网站提出了请求。

编辑3:

感谢您的回复Nunser! 我确实在beforeRender函数中的app_controler文件中添加了菜单功能:

$this->loadModel('Menu');

            if (!isset($this->viewVars['mainMenu'])) 
            {
              $this->set(
                    'mainMenu', $this->Menu->find('all', 
                        array('conditions' => array("parent_id" => 0), 'recursive' => '2', 'order' => 'Menu.order asc')
                        )
                    );

            }

我没有摆脱recursive = 2,因为我需要从菜单表连接到内容表,其中保存了其他信息,例如url ...结果数组必须如下所示:< / p>

[0] => Array
        (
            [Menu] => Array
                (
                    ...

                )
            [Content] => Array
                (

                    [url] => urlhere
                  ...

                )
                [Child] => Array
                (
                    [0] => Array
                        (
                            [Content] => Array
                                (
                                    [url] => url here...
                                )

                        )

                   ...
                )

        )

不知道我怎么能用recursive = -1得到这个。看着Containable,但没有运气。

无论如何,更有趣的是2.和3.GersleriesController的requestAction: 即使我有一个非常基本的控制器,只有在调用

时才返回一个字符串
echo $this->requestAction('/galleries/sidegal');

<?php
    class GalleriesController extends AppController {
        var $name = 'Galleries';
        var $helpers = array('Html', 'Form');

        function sidegal() {
        return 'testString';
        }
            }
?>

我得到一个循环。关于这个的任何想法?

编辑4: Soooo,经过很长一段时间我开始尝试使用我的GalleryModel,这看起来像是第一次:

var $hasMany = array(
        'Gimage' => array(
            'className' => 'Gimage',
            'foreignKey' => 'gallery_id',
            'dependent' => true,
            'conditions' => '',
            'fields' => '',
            'order' => 'Gimage.order asc',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => '' ),
            'Child' => array('className' => 'Gallery',
            'foreignKey' => 'parent_id',
            'order' => 'Child.order asc'
            ),
            );

我发现,'Child'数组会导致问题。所以我改变了Child to Children这个词突然变得有效了。 解决方案如下:

var $hasMany = array(
            'Gimage' => array(
                'className' => 'Gimage',
                'foreignKey' => 'gallery_id',
                'dependent' => true,
                'conditions' => '',
                'fields' => '',
                'order' => 'Gimage.order asc',
                'limit' => '',
                'offset' => '',
                'exclusive' => '',
                'finderQuery' => '',
                'counterQuery' => '' ),
                'Children' => array('className' => 'Gallery',
                'foreignKey' => 'parent_id',
                'order' => 'Children.order asc'
                ),
                );

我很高兴它现在有效。 感谢您对Nunser的支持,非常了解。

1 个答案:

答案 0 :(得分:0)

Uff,那里的递归警报。

因此,您有一个包含子菜单的菜单,并且您尝试将菜单设为parent_id = 0,而$recursive = 2使用了{/ p}}

Menu where parent_id = 0
    Submenus of this menu where parent_id = menu_id
        Parent menu of this submenu where parent_id = 0
            ...forever and ever

看那里的递归?这是因为您将递归设置为2.请参阅docs。您获得了很多甚至不需要的信息。作为一般规则,尝试将递归设置为-1并使用Containable Behavior检索数据,相信我,即使查询可能有点麻烦,您要检索的数据也将是根据你的协会,相当少。在正确使用可包容和递归之前,我遇到了蛋糕的内存问题。

嗯,无论如何,到了这一点。 如果在reto() 希望菜单包含parent_id = 0,那么请执行

$this->Menu->recursive = -1;
return $this->Menu->find('all', array('conditions' => array("parent_id" => 0), 'order' => 'Menu.order asc'));

并且循环将消失。

如果您想要菜单和首先撕开子菜单,请尝试

 $this->Menu->recursive = -1;
 return $this->Menu->find('all', array('conditions' => array("parent_id" => 0),
                                       'recursive' => -1, //just to be sure
                                       'contain' => 'Menu',
                                       'order' => 'Menu.order asc'));

或类似的东西(我没有使用1.2,所以语法可能有点不同)。

哦,作为关于你上一次编辑的旁注:requestAction造成了很多延迟,并且在MVC框架中不受欢迎。尝试删除它。我不认为 会导致循环问题,但会考虑选项。如果您使用它进行导航,为什么不在AppController的beforeRender中添加相同的菜单功能,将数组设置为视图变量,只显示它,而不是每次都执行requestAction?