首页 » Ecstore » Ecstore待评论商品模块内存错误的bug

Ecstore待评论商品模块内存错误的bug

8014 1

今天,遇上一用户反馈,未评论商品页面打开直接报错,于是测试员跟进测了一下,找到错误的页面,报错内存不足。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 29741 bytes) in /app/wap/lib/theme/base.php on line 0

大致确认了一下发生的场景,只在新用户上发生,并且包含wap端。理论上新用户这边是没有订单的,所以这块返回的值应该是空的,怎么说都不可能内存不足才对。记得刚上系统的时候,肯定是作为新用户正常打开过这个模块的,那么现在怎么会报错了呢?更蛋疼的是报错的这个行数和文件,文件在app目录,说明这个文件没有二开过,用的是官网的原文件,0这个就有点玄乎了。

本地调试,查找原因之后发现是官方原文件写的有点随意了,缺少一些判断,拿到的数据太多,所以内存不够了。具体涉及到的文件一共2个,先来看下app/b2c/controller/site/member.php的nodiscuss方法:

//获取会员已发货的商品日志
$sell_logs = $this->app->model('sell_logs')->getList('order_id,product_id,goods_id',array('member_id'=>$this->app->member_id));
......
foreach((array)$sell_logs as $key=>$log_row){
     if($data && $data[$log_row['order_id']][$log_row['product_id']] == $log_row['product_id']){
          unset($sell_logs[$key]);
     }else{
          $filter['order_id'][] = $log_row['order_id'];
          $filter['product_id'][] = $log_row['product_id'];
          $filter['item_type|noequal'] = 'gift';
     }
}
......
$nogift = $orderItemModel->getList('order_id,product_id',$filter);

可以看出先查询用户有没有发货的商品,如果没有记录的话,由于没有预先定义$filter的默认值,那么$filter为空,$filter作为参数查询的时候,$nogift的值为所有的orderitem的记录集,所以为什么一开始用Ecstore时并没有这样的错误的答案也就显而易见了。再来看另一个关键的文件/app/base/db/connections.php的select方法,它是getList的最终实现:

$rs = $this->exec($sql, $skipModifiedMark, $db_lnk);
if($rs['rs']){
    $data = array();
    while($row = mysql_fetch_assoc($rs['rs'])){

这里mysql_fetch_assoc()引起的内存报错。众所周知,PHP的数组大小是和设置的内存有关,所以这边rs[‘rs’]由于太大了,抛出错误了。

文章评分2次,平均分5.0

本文原始地址:https://www.tiandiyoyo.com/2016/07/member_nodiscuss_bug_on_ecstore/
本站所有文章,除了特别注明外,均为本站原创,转载请注明出处来自www.tiandiyoyo.com

您可能还会对以下文章感兴趣:

评论前先开启评论开关:


1 Comment

  1. 郑永 :

    好吧,工作笔记记录得金津津有味。

载入分页评论...