我被困3天試圖弄清楚這個問題的原因是什麼。讓我們來看看細節:PHP請求輸出需要很長時間才能收到
jquery ajax調用加載一個名爲HELPER的php文件,當加載時包含另一個名爲F1的php文件,該文件創建html表格通過mysqli查詢。 Ajax獲取響應並將該字符串粘貼到HTML DIV中。響應是一個html表格。 Web服務器是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
的timmings:
PHP START:0.92秒 PHP END:0.98秒 JS接收到的數據:49.50秒 JS處理的數據:49.56秒
我做了一些挖掘和它看起來就像apache/httpd進程(通過頂層命令的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千字節。
的timmings:
PHP START:0.78秒 PHP END:0.81秒 JS接收到的數據:1.13秒 JS處理的數據:1.19秒
我已經嘗試過:
- 使用ob_start()和ob_end_flush()。
- 將apache mpm prefork SendBufferSize設置爲更高的值,但我認爲這是一個長鏡頭,因爲較長的響應(50KB)沒有問題。
- 使用echo而不是sprintf。
任何人都有線索?
此致敬禮。
多久SQL查詢取? – DanFromGermany
它需要約0.0007秒。 –