Saya mempunyai persediaan apache 2.4 + mod_php yang mudah sebagai pelayan web. Arahan error_log dalam php.ini tidak ditetapkan, jadi ia mengambil nilai lalai 0. Tingkah laku diterangkan di sini (https://www.php.net/manual/en/function.error-log.php) dan untuk meringkaskan hasil akhir, saya melihat bahawa ia dimajukan kepada pengendali Log modul SAPI (mod_php) . Log dimajukan ke Apache untuk diproses, yang seterusnya mencatatkannya ke fail berdasarkan arahan ErrorLog yang saya tetapkan.
Masalahnya sekarang ialah apabila penyataan log di sebelah php panjang melebihi 8192 bait, ia dipenggal kepada rentetan tepat 8192 bait seperti yang ditunjukkan dalam log ralat Apache. Had 8192 bait agak mengelirukan, jadi apabila melampirkan strace pada benang pekerja dan melihat panggilan sistem, saya mendapati ia hanya melakukan satu panggilan tulis dengan 8192 bait sebagai panjang untuk menulis. Saya tahu php mempunyai kawalan/arahan had log tetapi ia tidak mempunyai sebarang kesan pada pernyataan error_log, saya juga mengesahkan ini. Hanya untuk menambah, had panjang log php semasa saya ialah 1024 (lalai) tetapi ia masih mencatatkan 8192 bait dalam log ralat apache.
Membandingkan tingkah laku ini dengan menghantar error_log ke fail dengan parameter message_type 3, saya dapat melihat bahawa rentetan lengkap ditulis dalam ketulan 8192 bait. Log strace dilampirkan untuk ini:
fstat(64, {st_mode=S_IFREG|0777, st_size=25009583, ...}) = 0 lseek(64, 0, SEEK_CUR) = 0 lseek(64, 0, SEEK_CUR) = 0 write(64, "<text to be logged>"..., 8192) = 8192 write(64, "<continued text ...>"..., 8192) = 8192 write(64, "<continued text ...>"..., 8192) = 8192
Jika message_type ialah 0, satu-satunya perbezaan ialah hanya terdapat satu panggilan tulis.
Bolehkah seseorang memberikan sedikit penjelasan tentang perkara ini dan cara mengatasi had 8192 bait ini?
Seperti yang telah disebutkan, semak dua kali
https://www .php.net/manual/en/errorfunc.configuration.php#ini.log-errors-max-len
Seperti yang dinyatakan dalam manual, ini semua berlaku dalam bait, jadi kami perlu menyemak fail lain. https://www.php.net/manual/ en/faq.using.php#faq.using.shorthandbytes
nginx/php-fpm juga perlu dilaraskan:
https://forums.freebsd.org/threads/howto-stop-nginx-php-fpm-from-truncating-your-stack-trace-error-message.56543/
Dalam /etc/php-fpm.conf anda boleh menukar nilai log_limit = NumberInBytes dan kemudian mulakan semula php-fpm
Untuk mengelakkan atau menyemak ralat lain, anda juga boleh Nyahset arahan error_log dalam php.ini untuk log masuk ke ralat standard nginx kemudian akan log masuk ke log ralatnya sendiri.
Tetapan juga berguna php-fpm configure catch_workers_output = ya dalam php-fpm.conf Dengan cara ini ralat standard tidak dibuang.