我正在使用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。
答案 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的值。