在PHP中回显大字符串导致根本没有输出

时间:2013-02-20 08:59:46

标签: php echo

我正在帮助建立一个Joomla网站(使用Joomla 1.5.26)。其中一个页面非常大。因此,PHP只是停止工作而没有任何错误,所有以前打印的字符串都被忽略。根本没有输出。我们将display_errors设置为TRUE,将error_reporting设置为E_ALL。

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

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

    echo $result;
}

一些信息:

  • 替换echo $ result; with echo strlen($ result);作品。字符串的长度是257759。
  • echo substr($ result,0,103396);正在打印部分内容。
  • echo substr($ result,0,103397);导致完全没有输出。
  • echo 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模块运行。

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

5 个答案:

答案 0 :(得分: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无法在一次调用中处理如此大的数据。以某种方式打破它应该让你到达你需要去的地方。

答案 1 :(得分:0)

尝试使用print_r而不是echo

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

    print_r($result);
}

答案 2 :(得分: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设置吗?

答案 3 :(得分:0)

可能是that

尝试这样的事情

php_flag output_buffering On

或者尝试在Joomla中打开gzip!

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

答案 4 :(得分:0)

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

感谢所有人的答案!