Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.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
Php 我可以做些什么来优化以下函数或其他一些事情来减少内存消耗?_Php_Mysql_Memory Management_Recursion_Query Optimization - Fatal编程技术网

Php 我可以做些什么来优化以下函数或其他一些事情来减少内存消耗?

Php 我可以做些什么来优化以下函数或其他一些事情来减少内存消耗?,php,mysql,memory-management,recursion,query-optimization,Php,Mysql,Memory Management,Recursion,Query Optimization,我正在处理业务目录之类的事情,需要在类别列表中显示类别的递归父类 我正在为此使用以下函数: public function get_recursive_parents($category_id){ $categories = array(); $res = $this->db->from('categories')->where('cat_id',$category_id)->get()->row_array();

我正在处理业务目录之类的事情,需要在类别列表中显示类别的递归父类

我正在为此使用以下函数:

    public function get_recursive_parents($category_id){
        $categories = array();
        $res = $this->db->from('categories')->where('cat_id',$category_id)->get()->row_array();
        $cat_id = $res['parent_id'];
        $categories[] = $res;
        while($cat_id){
            $res = $this->db->from('categories')->where('cat_id',$cat_id)->get()->row_array();
            $categories[] = $res;
            $cat_id = $res['parent_id'];
        }
        return $categories;
    }
我正在使用这个功能,因为它是在管理网站上,在管理网站上有点慢也可以,而且管理将是唯一的一个,所以我可以给它更多的内存。但我认为限制内存超过300米一次调用是太多了,仍然得到这个:

Fatal error: Allowed memory size of 367001600 bytes exhausted (tried to allocate 72 bytes) in /var/www/usmanproject/salesfinder/system/database/DB_active_rec.php on line 2007 
有没有办法优化上述功能?或者我需要做一些特定的索引或算法优化,或任何其他可能的方式?或者我只是停止显示类别的所有父级和超级父级(即客户要求查看层次结构)?或者需要增加内存,因为我已经在一个目录上工作了,在管理站点上也很慢,所以我猜他们只是在使用更多的内存

如有任何建议,将不胜感激


这是那个表模式,它有父对象id,所以它是递归关系

   CREATE TABLE IF NOT EXISTS `categories` (
  `cat_id` int(11) NOT NULL AUTO_INCREMENT,
  `cat_name` varchar(255) DEFAULT NULL,
  `cat_title` varchar(255) DEFAULT NULL,
  `cat_desc` varchar(255) DEFAULT NULL,
  `cat_text` text,
  `parent_id` int(11) NOT NULL,
  `cat_img` varchar(255) DEFAULT NULL,
  `sort_id` int(11) NOT NULL DEFAULT '1',
  `last_level` tinyint(4) NOT NULL,
  PRIMARY KEY (`cat_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=221 ;
尝试使用下面的代码

public function get_recursive_parents($category_id,$categories=array())
{
    if($category_id!="")
    {
        $new_ar1=array();
        $fe = $this->db->from('categories')->where('cat_id',$category_id)->get()->row_array();
        array_push($new_ar1,$fe["parent_id"]);
        return $new_ar1;
    }
    else
    {
        $res = $this->db->from('categories')->get()->row_array();
        array_push($categories,$res['parent_id']);
        $categories[$res['parent_id']]=array();

        array_push($categories[$res['cat_id']],get_recursive_parents($res['parent_id'],$categories));
    }

    return $new_ar;
}
调用函数

get_recursive_parents($category_id);

希望它能帮助您解决问题,实际上有一条记录的
parent\u id
指向它自己的
cat\u id
,这是主键。这就指向了它自己,在这种情况下,递归并没有结束。我使用了while循环,在这种情况下,它将变成无穷大

但是在调试期间,我发现这篇文章很有帮助,
它提供了更好的方法来处理同样的事情。在我的场景中,如本文所述,自连接非常有用。

您使用的是哪个框架?@ripa我使用的是CodeIgniterok。在函数中任何时候都不能调用get_recursive_parents()。这不是递归调用。@ripa我通过while循环进行递归工作,我可以作为递归函数进行递归,但这不是问题,问题是查询,这个循环最多运行4次,整个函数最多运行10次。所以这个查询最多可以在这个页面上运行40次,同时一次最多有一条记录。因此,它最多可以返回40条记录,但需要40个查询。某种存储过程在这里能更好地工作并解决问题吗?