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