2014-02-05 112 views
0

我被困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。

任何人都有線索?

此致敬禮。

+0

多久SQL查詢取? – DanFromGermany

+0

它需要約0.0007秒。 –

回答

1

我不知道爲什麼,但問題是由「中心」html標籤引起的。不知何故,中心標籤的存在會減緩響應速度。我剛剛刪除它們,並使用「文本對齊:中心」創建適當的CSS類,問題就沒有了。

我也嘗試避免PHP來回顯HTML。即使這樣,標籤也會再次出現問題。

Here's修復。我只是沒有解釋。

相關問題