首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CodeIgniter3和results_array()超时

CodeIgniter3和results_array()超时
EN

Stack Overflow用户
提问于 2016-12-18 02:53:26
回答 2查看 84关注 0票数 0

在使用MySQL库对我的CodeIgniter3数据库进行简单查询时,我遇到了一个问题。我面临的问题,发现瓶颈,并希望听到您的意见。

技术规范:

  • PHP 5.4
  • CodeIgniter 3.1.2
  • MySQL 5.1.73 (via /var/lib/mysql.sock)

表“通知”:

代码语言:javascript
复制
+-------------+--------------+------+-----+------------+----------------+
| Field       | Type         | Null | Key | Default    | Extra          |
+-------------+--------------+------+-----+------------+----------------+
| id          | int(11)      | NO   | PRI | NULL       | auto_increment |
| receiver_id | int(11)      | NO   | MUL | 0          |                |
| content     | varchar(254) | NO   |     | NULL       |                |
| created     | varchar(10)  | NO   |     | 1000000000 |                |
| seen        | set('0','1') | NO   |     | 0          |                |
+-------------+--------------+------+-----+------------+----------------+
5 rows in set (0.01 sec)

来自mysql内部的直接查询:

代码语言:javascript
复制
mysql> select * from notifications order by created desc limit 100;
...
...
100 rows in set (0.01 sec)

CodeIgniter:查询

代码语言:javascript
复制
//  Load User's Notifications
public function LoadNotifications($UserID)
{
    //  Load Replies
    $sql            =   "SELECT id, content, created, seen FROM notifications WHERE receiver_id=$UserID ORDER BY created DESC LIMIT 100";
    $query          =   $this->db->query($sql);
    if( $query->num_rows() == 0 ) return '0';
    $results        =   $query->result_array();
    return $results;
}

我的观察和长期试图找出原因表明,这条线造成了问题:

代码语言:javascript
复制
$results        =   $query->result_array();

CodeIgniter提供了另一种作为对象获取结果的方法,即使用以下命令:

代码语言:javascript
复制
$results        =   $query->result();

正如您可能已经猜到的,PHP占用了HTTP/1.1 504的所有CPU和NginX连接超时,我得到了同样的结果。

  • 我试过记录Mysql_Slow_Queries,但没有发现。
  • 表正在使用InnoDB存储引擎(密钥缓冲区使用了~98%)

请让我知道你的想法,我应该在哪里寻找,也许我到底应该寻找什么。我想大声疾呼,这是一个CodeIgniter错误,但按照协议,需要第二个意见,然后我这样做。

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2016-12-18 04:28:18

答案

看来问题根本不在MySQL方面,而且证据是,我可以在毫秒内查询任意数量的行。

function LoadNotifications($UserID)返回结果之后,当CodeIgniter实际呈现返回的$results数组时,我有如下所示的javascript行:

代码语言:javascript
复制
foreach($results as $notification)
{
  echo $notification["content"] . "<br />";
  echo "<script> some JS code </script>";
}

这个问题是由我使用的内联Javascript混淆库缩微器造成的,它导致同时启动100个混淆实例,以混淆我在循环中拥有的100个<script>行。

底线:

如果您正在使用任何类型的内联PHP解析,例如,可以混淆您的代码或将其传递给第三方软件,那么在返回结果或呈现代码时,请确保不将其包含在中。

正确的方法是生成一个您拥有的数组的输出,退出该循环,然后将最后的输出用于模糊处理或在单个实例中所做的任何操作。

谢谢你,齐德福克斯和丹,你帮我的忙。

票数 0
EN

Stack Overflow用户

发布于 2016-12-19 00:06:41

对于第一个查询,需要在created上建立索引。您可能需要将该列转换为数字数据类型,而不是VARCHAR

对于第二个查询,您需要一个不同的索引,即复合INDEX(receiver_id, created)。您当前的INDEX(receiver_id)不太好。由于它是我推荐的前缀,我建议您移除您的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41205038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档