CodeIgniter DataMapper ORM内存问题

时间:2014-06-18 22:22:08

标签: php mysql codeigniter codeigniter-datamapper

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

产品有很多skus 产品有许多amazon_products sku有很多amazon_products

我正在尝试从数据库中检索所有数据并将其格式化为前端的Backbone使用。我最终希望以下列格式将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']);

当我执行此操作时监视我的Ubuntu服务器的内存时,似乎使用了很多(大约13%的内存)。此外,由于数据库中大约有700个产品,因此DataMapper运行1000个查询来获取所有这些数据。查询导致高内存使用吗?或者我在foreach循环中忽略了一些可能导致内存泄漏的内容?

get_memory_usage()的输出在第一个产品循环后为33678176,在最后一个产品循环后为109580968。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

虽然我从未使用过您正在使用的DataMapper库,但您提到有数千个查询正在运行以便检索结果。基于此,似乎有一个比get()更好的方法来检索$ product-&gt; sku和$ sku-&gt; amazon_product。您在第2行的第一个get()是否没有为您获取所有信息?我的想法是get()不检查可用的结果值,并且在对数据库进行额外调用之前,DataMapper中的另一个函数可能会引用可用的结果集。

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