単純な Apache 2.4 mod_php を Web サーバーとしてセットアップしました。 php.ini の error_log ディレクティブは設定されていないため、デフォルト値の 0 が使用されます。動作はここ (https://www.php.net/manual/en/function.error-log.php) で説明されており、最終結果を要約すると、SAPI (mod_php) モジュールのログ ハンドラーに転送されていることがわかります。 。ログは処理のために Apache に転送され、次に、設定した ErrorLog ディレクティブに基づいてファイルにログが記録されます。
問題は、Apache エラー ログに示されているように、php 側のログ ステートメントが 8192 バイトを超える場合、正確に 8192 バイトの文字列に切り詰められることです。 8192 バイトの制限は少しわかりにくいため、strace をワーカー スレッドにアタッチしてシステム コールを確認すると、書き込み長が 8192 バイトの書き込み呼び出しが 1 回だけ行われることがわかりました。 PHPにはログ制限コントロール/ディレクティブがあることは知っていますが、それらはerror_logステートメントに影響を与えません。これも確認しました。付け加えておきますが、現在の php ログの長さ制限は 1024 (デフォルト) ですが、それでも Apache エラー ログには 8192 バイトが記録されます。
この動作を、パラメーター message_type が 3 であるファイルに error_log を送信する場合と比較すると、完全な文字列が 8192 バイトのチャンクに書き込まれていることがわかります。 これに関する strace ログを添付します:
リーリーmessage_type が 0 の場合、唯一の違いは書き込み呼び出しが 1 つだけであることです。
誰かがこれについての説明と、この 8192 バイト制限を回避する方法を提供してもらえますか?
P粉5672810152024-02-04 10:50:33
すでに述べたように、二度確認してください
リーリーhttps://www .php.net/manual/en/errorfunc.configuration.php#ini.log-errors-max-len
マニュアルで述べたように、これはすべてバイト単位で行われるため、他のファイルを確認する必要があります。 https://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes
nginx/php-fpm も調整する必要があります:
/etc/php-fpm.conf で、log_limit = NumberInBytes の値を変更して、php-fpm を再起動できます。
他のエラーを回避または確認するには、次のこともできます。 php.ini の error_log ディレクティブの設定を解除します。 nginxの標準エラーに記録するには その後、自分のエラー ログにログインします。設定も便利です php-fpm php-fpm.conf で catch_workers_output = yes を設定します こうすることで、標準エラーは破棄されません。