2

Joomla サイトの構築を手伝っています (Joomla 1.5.26 を使用)。ページの 1 つが本当に大きいです。その結果、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; を置き換えます。echo strlen($result); を使用 動作します。文字列の長さは 257759 です。
  • echo substr($結果, 0, 103396); 部分的なコンテンツを印刷しています。
  • echo substr($結果, 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の検索結果も何もありません. このような経験をした方、解決策をご存知の方はいらっしゃいますか? 読んでくれてありがとう!

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 は 1 回の呼び出しでそのような大きなデータを処理できないようです。どうにかしてそれを分割することで、必要な場所に移動できるはずです。

于 2013-02-20T09:01:28.600 に答える
0

これをCLIでテストしましたが、PHP5.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

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 に答える
0

それかもしれませんか?

このようなものを試してください

php_flag output_buffering On

または、Joomlaでgzipをオンにしてみてください!

または、nginxをリバースプロキシまたはスタンドアロンサーバーとして使用します:^)

于 2013-02-21T00:45:05.667 に答える
0

私は自分で問題を解決したようです。それはやや予想外のことでした - HTML フォーマットの欠陥です。注文ページのテンプレートを使用し、その中にすべての注文商品を表示するループがあります。製品数が少ないときはすべてうまくいきましたが、40 個の製品で同じことをしようとすると、ページが壊れてしまいました。ただし、ステータス コード 200 でサーバーの応答が空になる理由はまだわかりません。

回答ありがとうございます。

于 2013-02-21T06:29:25.083 に答える