Catatan untuk pengguna mod_fcgid (mohon, gunakan dengan resiko Anda sendiri).
Solusi Cepat
Jawaban yang diterima dari Joeri Sebrechts memang fungsional. Namun, jika Anda menggunakan mod_fcgid, Anda mungkin menemukan bahwa solusi ini tidak berfungsi dengan sendirinya. Dengan kata lain, ketika fungsi flush dipanggil, koneksi ke klien tidak ditutup.
The FcgidOutputBufferSize
parameter konfigurasi mod_fcgid mungkin menyalahkan. Saya telah menemukan tip ini di:
- balasan dari Travers Carter dan
- ini posting blog Seumas Mackinnon .
Setelah membaca penjelasan di atas, Anda mungkin sampai pada kesimpulan bahwa solusi cepat adalah menambahkan baris (lihat "Contoh Host Virtual" di bagian akhir):
FcgidOutputBufferSize 0
di file konfigurasi Apache Anda (misalnya, httpd.conf), file konfigurasi FCGI Anda (misalnya, fcgid.conf) atau di file host virtual Anda (misalnya, httpd-vhosts.conf).
Dalam (1) di atas, variabel bernama "OutputBufferSize" disebutkan. Ini adalah nama lama yang FcgidOutputBufferSize
disebutkan di (2) (lihat catatan pemutakhiran di halaman web Apache untuk mod_fcgid ).
Detail & Solusi Kedua
Solusi di atas menonaktifkan buffering yang dilakukan oleh mod_fcgid baik untuk seluruh server atau untuk host virtual tertentu. Ini dapat menyebabkan hukuman kinerja untuk situs web Anda. Di sisi lain, ini mungkin tidak terjadi karena PHP melakukan buffering sendiri.
Jika Anda tidak ingin menonaktifkan buffering mod_fcgid , ada solusi lain ... Anda dapat memaksa buffer ini untuk mengosongkan .
Kode di bawah ini melakukan hal itu dengan mengembangkan solusi yang diusulkan oleh Joeri Sebrechts:
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // just to be safe
ob_start();
echo('Text the user will see');
echo(str_repeat(' ', 65537)); // [+] Line added: Fill up mod_fcgi's buffer.
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
sleep(30);
echo('Text user will never see');
?>
Apa yang pada dasarnya dilakukan oleh baris kode tambahan adalah mengisi buffer mod_fcgi , sehingga memaksanya untuk mengosongkan. Nomor "65537" dipilih karena nilai default FcgidOutputBufferSize
variabel adalah "65536", seperti yang disebutkan di halaman web Apache untuk petunjuk terkait . Oleh karena itu, Anda mungkin perlu menyesuaikan nilai ini jika nilai lain ditetapkan di lingkungan Anda.
Lingkungan Saya
- WampServer 2.5
- Apache 2.4.9
- PHP 5.5.19 VC11, x86, Tanpa Thread Aman
- mod_fcgid / 2.3.9
- Windows 7 Professional x64
Contoh Host Virtual
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>