Mod_fcgid kullanıcıları için not (lütfen kendi sorumluluğunuzda kullanın).
Hızlı Çözüm
Joeri Sebrechts'in kabul edilen yanıtı gerçekten işlevseldir. Ancak mod_fcgid kullanırsanız , bu çözümün kendi kendine çalışmadığını görebilirsiniz. Diğer bir deyişle, flush işlevi çağrıldığında, istemciye olan bağlantı kapanmaz.
FcgidOutputBufferSize
Yapılandırma parametresi mod_fcgid suçlu olabilir. Bu ipucunu şurada buldum:
- Travers Carter'ın bu yanıtı ve
- Seumas Mackinnon'un bu blog yazısı .
Yukarıdakileri okuduktan sonra, hızlı bir çözümün satırı eklemek olacağı sonucuna varabilirsiniz (sondaki "Örnek Sanal Konak" bölümüne bakın):
FcgidOutputBufferSize 0
Apache yapılandırma dosyanızda (örn. httpd.conf), FCGI yapılandırma dosyanızda (örn. fcgid.conf) veya sanal ana bilgisayar dosyanızda (örn. httpd-vhosts.conf).
Yukarıdaki (1) 'de, "OutputBufferSize" adlı bir değişkenden bahsedilmektedir. Bu, FcgidOutputBufferSize
(2) ' de bahsedilenin eski adıdır ( mod_fcgid için Apache web sayfasındaki yükseltme notlarına bakın ).
Ayrıntılar ve İkinci Bir Çözüm
Yukarıdaki çözüm, mod_fcgid tarafından ya tüm sunucu ya da belirli bir sanal konak için gerçekleştirilen arabelleğe almayı devre dışı bırakır . Bu, web siteniz için bir performans düşüşüne neden olabilir. Öte yandan, PHP kendi başına arabelleğe alma işlemini gerçekleştirdiği için durum pek de doğru olmayabilir.
Mod_fcgid'in arabelleğini devre dışı bırakmak istemiyorsanız , başka bir çözüm daha var ... bu arabelleği boşaltmaya zorlayabilirsiniz .
Aşağıdaki kod, Joeri Sebrechts tarafından önerilen çözüme dayanarak bunu yapar:
<?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');
?>
Eklenen kod satırının esasen yaptığı şey mod_fcgi'nin tamponunu doldurmak ve böylece onu temizlemeye zorlamaktır. "65537" sayısı FcgidOutputBufferSize
, Apache web sayfasında karşılık gelen yönerge için belirtildiği gibi değişkenin varsayılan değeri "65536 " olduğu için seçildi . Bu nedenle, ortamınızda başka bir değer ayarlanmışsa bu değeri buna göre ayarlamanız gerekebilir.
Ortamım
- WampServer 2.5
- Apache 2.4.9
- PHP 5.5.19 VC11, x86, İş Parçacığı Güvenli Değil
- mod_fcgid / 2.3.9
- Windows 7 Profesyonel x64
Örnek Sanal Konak
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>