Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cakephp 访问页面时的无限循环_Cakephp_Loops_Memory_Cakephp 1.2_Infinite - Fatal编程技术网

Cakephp 访问页面时的无限循环

Cakephp 访问页面时的无限循环,cakephp,loops,memory,cakephp-1.2,infinite,Cakephp,Loops,Memory,Cakephp 1.2,Infinite,我有一个cakePHP应用程序(版本1.2),它在加载某个页面时开始出现奇怪的内部服务器错误 然后,我在本地Mamp环境中安装了xDebug,并发现当访问此页面时,应用程序会进入一个循环。不幸的是,我不知道如何解释这一点,也许您可以帮我指出方向(在我开始在这里发布代码之前) 非常感谢 编辑 -图中第14行是指文件mmenu.ctp,其中包含以下请求: $menus = $this->requestAction('/menus/reto'); 然后,菜单控制器包含以下操作: 阶级 我希望

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

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

非常感谢

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

$menus = $this->requestAction('/menus/reto');
然后,菜单控制器包含以下操作:

阶级

我希望这有帮助

编辑2: 好的,我做了更多的测试。在正在加载的页面中,有3个requestActions: 1。从数据库加载导航。 二,。和3。调用GalleryController。两次都使用相同的控制器函数,但参数不同

现在,当我要么摆脱1。或两个画廊的要求,网站加载没有任何问题

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

firebug的net选项卡没有显示任何可用信息。它只是说明了我试图加载的特定站点的请求

编辑3:

谢谢你的回复,纳瑟! 我确实在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')
                        )
                    );

            }
但是我没有摆脱递归=2,因为我需要从菜单表连接到内容表,在内容表中保存其他信息,例如url。。。结果数组必须如下所示:

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

                )
            [Content] => Array
                (

                    [url] => urlhere
                  ...

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

                        )

                   ...
                )

        )
我不知道如何用递归=-1得到这个。调查了一下,但没有运气

无论如何,更有趣的是2。和3。向GalleriesController请求操作: 即使我有一个非常基本的控制器,在调用时只返回一个字符串

echo $this->requestAction('/galleries/sidegal');

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

        function sidegal() {
        return 'testString';
        }
            }
?>
然后我发现“Child”数组会导致问题。所以我把Child这个词改成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'
                ),
                );
我很高兴它现在起作用了。
感谢您的支持,非常感谢。

Uff,这里有递归警报

因此,您有一个包含子菜单的菜单,您试图获取
parent\u id=0
的菜单,但是使用
$recursive=2
,您将获得

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。看。你得到了很多你根本不需要的信息。一般来说,请尝试将递归设置为-1并检索数据,相信我,即使查询可能会有点麻烦,您检索的数据也会大大减少对关联的依赖。在正确使用containable和递归之前,我遇到了关于cake的内存问题

好吧,无论如何,说到点子上了。 如果在
reto()
中,您只希望菜单具有
parent\u 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?

您是否在视图中执行requestAction(图中第14行)导致问题?如果是这样,你能发布相应的操作代码吗?使用Firebug的“Net”选项卡查看所有重定向。URL应该给你一些提示,告诉你在代码中搜索什么。是的,Nunser,在mmenu.ctp中有这样一个请求。我马上会更新上面的代码,我会查看Firbug的Net选项卡。谢谢你们,请发帖并回答你们的解决方案,然后接受它,所以其他试图帮助你们知道这个问题已经解决的人:)我该怎么做?我无法按此页底部的“回答您的问题:)
$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'));