2

我正在帮助建立一个 Joomla 站点(使用 Joomla 1.5.26)。其中一页真的很大。结果,PHP 停止工作而没有任何错误,并且所有先前打印的字符串都被忽略。根本没有输出。我们将 display_errors 设置为 TRUE 并将 error_reporting 设置为 E_ALL。

我找到了 PHP 中断的确切行。它在库/joomla/application/component/view.php:196

function display($tpl = null)
{
    $result = $this->loadTemplate($tpl);
    if (JError::isError($result)) {
        return $result;
    }

    echo $result;
}

一些信息:

  • 替换 echo $result; 回声 strlen($result); 作品。字符串的长度为 257759。
  • echo substr($result, 0, 103396); 正在打印部分内容。
  • echo substr($result, 0, 103397); 结果根本没有输出。
  • 回声 substr($result, 0, 103396) 。“一个”; 结果根本没有输出。因此,将字符串拆分为块不是解决方案。

我在脚本执行期间检查了服务器性能。CPU 使用率为 100%,但剩余内存充足。PHP 内存限制为 1024M。output_buffering 是 4096,但我尝试将其设置为不合理的高数字 - 死在完全相同的位置。服务器运行 Apache 2.2.14-5ubuntu8.10 和 PHP 5.3.2-1ubuntu4.18。PHP 作为 fast_cgi 模块运行。

我从来没有经历过这样的事情,谷歌搜索也没有结果。你们有没有人经历过类似的事情并知道解决方案?谢谢阅读!

4

5 回答 5

2

也许尝试爆炸字符串并循环遍历每一行。

你也可以试试这个,在php.net - echo上找到:

<?php
function echobig($string, $bufferSize = 8192)
{
   // suggest doing a test for Integer & positive bufferSize
   for ($chars = strlen($string)-1, $start = 0;$start <= $chars; $start += $bufferSize) {
       echo substr($string, $start, $bufferSize);
   }
}
?>

基本上,echo 似乎无法在一次调用中处理如此大的数据。以某种方式打破它应该让你到达你需要去的地方。

于 2013-02-20T09:01:28.600 回答
0

可能是这样吗?

尝试这样的事情

php_flag output_buffering On

或者尝试在 Joomla 中打开 gzip!

或者使用 nginx 作为反向代理或独立服务器:^)

于 2013-02-21T00:45:05.667 回答
0

我已经在 CLI 上对此进行了测试,它适用于 PHP 5.4.11 和 5.3.15:

$str = '';                                                                           
for ($i=0;$i<257759;$i++) {                                                          
    $str .= 'a';                                                                     
}                                                                                    
echo $str;

PHP 本身工作正常,但输出缓冲区对于 Apache/fast_cgi 来说太大了,这似乎是一个合理的假设。我会进一步调查 Apache 配置。您有任何特殊的 Apache 设置吗?

于 2013-02-20T09:18:11.503 回答
0

看来我自己解决了这个问题。这有点出乎意料 - HTML 格式错误。我们为订单页面使用模板,里面有一个显示所有订购产品的循环。当有几个产品时,一切都很好,但是当我尝试对 40 个产品做同样的事情时,页面确实中断了。但是我仍然不明白为什么服务器响应为空,状态码为 200。

谢谢大家的解答!

于 2013-02-21T06:29:25.083 回答
0

如何尝试使用print_r而不是echo

function display($tpl = null)
{
    $result = $this->loadTemplate($tpl);
    if (JError::isError($result)) {
        return $result;
    }

    print_r($result);
}
于 2013-02-20T09:11:44.980 回答