Php CodeIgniter数据映射器ORM内存问题

Php CodeIgniter数据映射器ORM内存问题,php,mysql,codeigniter,codeigniter-datamapper,Php,Mysql,Codeigniter,Codeigniter Datamapper,我使用CodeIgniter和DataMapper来管理电子商务商店的关系。这些关系是: 一个产品有许多SKU 一个产品有很多亚马逊产品 sku有许多amazon_产品 我试图从数据库中检索所有数据,并将其格式化以供前端主干使用。我最终希望以以下格式向页面发送json: Array of products Product Array of amazon_products Array of skus Array of amazon_

我使用CodeIgniter和DataMapper来管理电子商务商店的关系。这些关系是:

一个产品有许多SKU 一个产品有很多亚马逊产品 sku有许多amazon_产品

我试图从数据库中检索所有数据,并将其格式化以供前端主干使用。我最终希望以以下格式向页面发送json:

Array of products
    Product
        Array of amazon_products 
        Array of skus
            Array of amazon_products
    Product
        Array of amazon_products 
        Array of skus
            Array of amazon_products
    Product
        Array of amazon_products 
        Array of skus
            Array of amazon_products
目前,我使用以下PHP代码生成此数据:

$products = new Product();
$products->order_by('ext_created_on', 'desc')->get();

$data['products'] = array();

foreach($products as $product){
        $product_array = $product->to_array();
        $product_array['amazon'] = $product->amazon_product->get()->all_to_array();
        foreach($product->sku->get() as $sku){
                $sku_array = $sku->to_array();
                $sku_array['amazon'] = $sku->amazon_product->get()->all_to_array();
                $product_array['skus'][] = $sku_array;
        }
        $data['products'][] = $product_array;

        echo memory_get_usage()."<br>"
}

$data['products'] = json_encode($data['products']);
$products=新产品();
$products->order_by('ext_created_on','desc')->get();
$data['products']=array();
foreach($products as$product){
$product_array=$product->to_array();
$product\U array['amazon']=$product->amazon\U product->get()->all\U to\U array();
foreach($product->sku->get()作为$sku){
$sku_数组=$sku->to_数组();
$sku_数组['amazon']=$sku->amazon_产品->获取()->所有_到_数组();
$product_阵列['sku'][]=$sku_阵列;
}
$data['products'][=$product\U数组;
回显内存获取用法()。“
” } $data['products']=json_encode($data['products']);
当我监控Ubuntu服务器的内存时,它似乎占用了很多内存(约13%)。此外,由于数据库中大约有700种产品,DataMapper正在运行1000次查询以获取所有这些数据。这些查询是否导致内存使用率高?或者在
foreach
循环中是否有我忽略的东西可能导致内存泄漏


get\u memory\u usage()
的输出在第一个产品循环之后是33678176,在最后一个产品循环之后是109580968。

虽然我从未使用过您正在使用的DataMapper库,但您提到有数千个查询正在运行以检索结果。基于此,似乎有比get()更好的方法来检索$product->sku和$sku->amazon\u产品。你第一次上网时没有为你获取所有信息吗?我的想法是get()不会检查可用的结果值,DataMapper中的另一个函数可能会在对数据库进行其他调用之前引用可用的结果集


事实上,我想知道$product->sku是否已经缓存了sku的值。

如果有人遇到这种情况,我可以使用DataMapper的
clear()
方法将内存使用量减少到大约1/3。我只是在外部
foreach
循环的末尾添加了一行
$product->clear()


我还在内部循环的末尾添加了一个
$sku->clear()

感谢您的反馈。第一个get()是获取所有产品。它不包含任何相关模型的信息。为此,我相信我必须从第一个get()循环遍历每个产品,并对其sku属性调用get()。如果你好奇的话,这里是文件:。我也觉得必须有一种更有效的方法来获取这些数据,但我不知道它可能是什么。该库确实有一个
$autopopulate\u有许多
功能,但是,我相信它仍然会运行相同的查询,而无需我手动调用get()。如果您有信心在没有datamapper的情况下编写查询,或者有信心编写自己的查询或尝试其他查询,这可能是另一种选择。我使用MVC,所以我有一个带有php类文件的/models文件夹,每个类文件都有查询数据库和返回数据集的方法。虽然ORM很酷,但它的用户友好性会影响性能。我将使用一个带有方法的类,每个方法从数据库返回一个特定的结果集。这将把数据库查询减少到一小部分,您甚至可以编写自定义联接来将上述大部分合并到一个查询中。