我有这个cakePHP应用程序(版本1.2),在加载某个页面时,它开始表现出奇怪的内部服务器错误。
然后我在我的本地Mamp环境中安装了xDebug,发现当访问此页面时应用程序会运行循环。不幸的是我不知道如何解释这个,也许你可以帮助我并指出我的方向(在我开始在这里发布代码之前)。
非常感谢!
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的支持,非常了解。
答案 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?