PHP 请求输出需要很长时间才能收到

问题描述 投票:0回答:1

我被困了三天,试图找出这个问题的原因。让我们来看看详细信息:

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。

有人有线索吗?

致以诚挚的问候。

php ajax apache
1个回答
1
投票

我不知道为什么,但问题是由“center”html 标签引起的。不知何故,中心标签的存在减慢了响应速度。我刚刚删除了它们并使用“text-align: center”创建了适当的 css 类,问题就消失了。

我也尝试避免使用 PHP 来回显 HTML。即使这样,标签也会再次引起问题。

这是修复方法。我只是没有解释。

© www.soinside.com 2019 - 2024. All rights reserved.