CodeIgniter3和results_array()超时

时间:2016-12-18 02:53:27

标签: php codeigniter

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

技术规格:

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

表格'

+-------------+--------------+------+-----+------------+----------------+
| 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中直接查询:

mysql> select * from notifications order by created desc limit 100;
...
...
100 rows in set (0.01 sec)

使用CodeIgniter查询:

//  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;
}

我的观察和长时间试图找到原因表明这一行引起了问题:

$results        =   $query->result_array();

CodeIgniter提供了另一种方法来获取结果作为对象,而不是使用此命令:

$results        =   $query->result();

正如您可能已经猜到的那样, PHP 使用 HTTP / 1.1 504

来消耗所有CPU和NginX连接超时时得到相同的结果
  • 我试图记录Mysql_Slow_Queries,没有找到。
  • 表使用InnoDB存储引擎(密钥缓冲区使用~98%)

PHP CPU Usage on CodeIgniter Query

请让我知道您的想法,我应该在哪里寻找,或者我应该寻找什么。我想大声说这是一个CodeIgniter错误,但遵循协议,在我做之前需要第二个意见。

提前致谢

2 个答案:

答案 0 :(得分:0)

<强>答案

似乎问题根本不在MySQL端,而且证据是我可以在几毫秒内查询任何数量的行。

function LoadNotifications($UserID)返回结果后,当CodeIgniter实际呈现返回的$results数组时,我有一个这样的javascript行:

foreach($results as $notification)
{
  echo $notification["content"] . "<br />";
  echo "<script> some JS code </script>";
}

问题是由我使用的内联Javascript混淆库CI_Minifier引起的,它导致100个混淆实例同时启动,以混淆我在循环中的那些100 <script>行。

底线:

如果您使用任何类型的内联PHP DOM解析,例如可以模糊您的代码或将其传递给第三方软件,请确保在返回时包含该内容结果或渲染代码。

正确的方法是生成您拥有的任何数组的输出,离开该循环,然后管道最终输出以进行模糊处理或在单个实例中执行的任何操作。

感谢@zedfoxus和@Dan帮助我的尝试。

答案 1 :(得分:0)

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

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