【发布时间】:2014-02-05 13:11:14
【问题描述】:
我被困了 3 天,试图找出导致此问题的原因。让我们进入细节:
一个 jquery ajax 调用加载一个名为 HELPER 的 php 文件,加载时包含另一个名为 F1 的 php 文件,该文件通过 mysqli 查询创建 html 表。 Ajax 获取响应并将字符串粘贴到 html DIV 中。响应是一个 html 表。网络服务器是apache2.2。
问题是,代码运行不到 1 秒,但响应大约需要 50 秒。响应只有 20 KB。
Some simple HTML table code.
<?php
if (!$res = $sql->query("A QUERY")) { die('custom error 46'); }
if (!$res->num_rows > 0) { die('custom error 47'); }
$myStr = '';
while ( $row = $res->fetch_object() ) {
if ($row->summary == "1") {
$mysum = " class='qtfck-table-summary'";
$myIsSum = "Sim";
} else {
$mysum = "";
$myIsSum = "";
}
if(intval($row->id_centrodecusto) > 0) {
$mycc = "<input type='checkbox' name='" . $row->id_task . "' value='" . $row->id_centrodecusto . "' CHECKED />";
} else {
$mycc = "<input type='checkbox' name='" . $row->id_task . "' value='' />";
}
$myj = " style='padding-left:" . intval($row->depth) * 10 . "px'";
$myStr = "<tr%s><td>%s</td><td><center>%s</center></td><td><center>%s</center></td><td%s>%s</td><td><center>%s</center></td><td><center>%s</center></td></tr>";
echo sprintf($myStr,$mysum,$row->wbs,$row->depth,$myIsSum,$myj,$row->name,$row->uniqueid,$mycc);
}
?>
Html Table closure
时间安排:
PHP 开始时间:0.92 秒 PHP 结束:0.98 秒 JS 收到数据:49.50 秒 JS 处理数据:49.56 秒
我进行了一些挖掘,看起来 apache/httpd 进程(通过 top 命令的 shell)正在发疯,在整整 50 秒的等待期间占用了 100% 的 CPU 负载。
但这里有一些有趣的事情。如果我更改 sprintf 函数生成的字符串,并设置一些随机字符串,则完全没有问题。
Some simple HTML table code.
<?php
if (!$res = $sql->query("A QUERY")) { die('custom error 46'); }
if (!$res->num_rows > 0) { die('custom error 47'); }
$myStr = '';
while ( $row = $res->fetch_object() ) {
if ($row->summary == "1") {
$mysum = " class='qtfck-table-summary'";
$myIsSum = "Sim";
} else {
$mysum = "";
$myIsSum = "";
}
if(intval($row->id_centrodecusto) > 0) {
$mycc = "<input type='checkbox' name='" . $row->id_task . "' value='" . $row->id_centrodecusto . "' CHECKED />";
} else {
$mycc = "<input type='checkbox' name='" . $row->id_task . "' value='' />";
}
$myj = " style='padding-left:" . intval($row->depth) * 10 . "px'";
echo "<TR><TD>eZ6OnMCZgygePZeUQHcqbOmHQDxhDF4KzfkgOd198xhPFV2rRezlIqBdJLY2TcNlO0PLUmK6CQI9PQMZgkLrcoeYIYhM0x9xK4yQXIFb5SLdq32</TD><TD>UTuQPG9WCbOswuJMdkkckMoAW49C71IN9qKdk8OAdRRV3ZuCYxM5GEZKrXXrwE7cWHKTcXTiO4KwGjh1ejENvduZvEVkwA3zoHbWkzEjtFa1GMaNzD2rqswEDSoQix2CLziBNiHD8zliSWu5rvU8wd6dodWBvubvog</TD></TR>";
}
?>
Html Table closure
对此请求的响应大小为 50 KB。
时间安排:
PHP 开始时间:0.78 秒 PHP 结束:0.81 秒 JS 接收到的数据:1.13 秒 JS 处理数据:1.19 秒
我已经尝试过的:
- 使用 ob_start() 和 ob_end_flush()。
- 将 apache mpm prefork SendBufferSize 设置为更高的值,但我认为这是一个很长的尝试,因为更长的响应 (50KB) 没有问题。
- 使用 echo 代替 sprintf。
有人知道吗?
最好的问候。
【问题讨论】:
-
SQL 查询需要多长时间?
-
大约需要 0.0007 秒。