php orm 内存泄漏,关于php:CodeIgniter DataMapper ORM内存问题

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

产品有很多缺点

一个产品有很多亚马逊产品

一个SKU有很多亚马逊产品

我正在尝试从数据库中检索所有数据并将其格式化以供前端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().""

}

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

当我监视Ubuntu服务器执行时的内存时,似乎使用了很多内存(约占内存的13%)。另外,由于数据库中大约有700种产品,所以DataMapper正在运行1000个查询来获取所有这些数据。查询是否导致高内存使用?还是在foreach循环中我忽略了某些东西,可能导致内存泄漏?

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

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

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

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

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

感谢您的反馈axiom82。第一个get()方法是获取所有产品。它不包含有关任何相关模型的信息。为此,我相信我必须从第一个get()循环遍历每个产品,并对其sku属性调用get()。如果您感到好奇,请参阅以下文档:datamapper.wanwizard.eu。我也觉得必须有一种更有效的方法来获取这些数据,但林对此表示怀疑。该库确实具有$autopopulate_has_many功能,但是,我相信它仍将运行相同的查询,只是无需我手动调用get()即可。

如果您有信心在没有数据映射器的情况下编写查询,或者有信心编写自己的数据或尝试使用其他数据映射器,那么这可能是另一种选择。我使用MVC,因此我有一个/ models文件夹,其中包含php类文件,每个文件都有用于查询数据库和返回数据集的方法。尽管ORM很酷,但其用户友好性可能会影响性能。同一个带有方法的类一起使用,每个方法从您的数据库返回一个特定的结果集。这样可以将数据库查询减至最少,甚至可以编写自定义联接以将上述大部分内容合并为一个查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值