Remarque pour les utilisateurs de mod_fcgid (veuillez l'utiliser à vos risques et périls).
Solution rapide
La réponse acceptée de Joeri Sebrechts est en effet fonctionnelle. Cependant, si vous utilisez mod_fcgid, vous constaterez peut-être que cette solution ne fonctionne pas d'elle-même. En d'autres termes, lorsque la fonction de vidage est appelée, la connexion au client ne se ferme pas.
Le FcgidOutputBufferSize
paramètre de configuration de mod_fcgid peut être à blâmer. J'ai trouvé cette astuce dans:
- cette réponse de Travers Carter et
- ce billet de blog de Seumas Mackinnon .
Après avoir lu ce qui précède, vous pouvez arriver à la conclusion qu'une solution rapide serait d'ajouter la ligne (voir «Exemple d'hôte virtuel» à la fin):
FcgidOutputBufferSize 0
soit dans votre fichier de configuration Apache (par exemple, httpd.conf), votre fichier de configuration FCGI (par exemple, fcgid.conf) ou dans votre fichier d'hôtes virtuels (par exemple, httpd-vhosts.conf).
Dans (1) ci-dessus, une variable nommée "OutputBufferSize" est mentionnée. C'est l'ancien nom du FcgidOutputBufferSize
mentionné dans (2) (voir les notes de mise à jour dans la page Web Apache pour mod_fcgid ).
Détails et une deuxième solution
La solution ci-dessus désactive la mise en mémoire tampon effectuée par mod_fcgid soit pour l'ensemble du serveur, soit pour un hôte virtuel spécifique. Cela peut entraîner une baisse des performances de votre site Web. D'un autre côté, cela peut ne pas être le cas puisque PHP effectue lui-même la mise en mémoire tampon.
Si vous ne souhaitez pas désactiver la mise en mémoire tampon de mod_fcgid , il existe une autre solution ... vous pouvez forcer ce tampon à se vider .
Le code ci-dessous fait exactement cela en s'appuyant sur la solution proposée par 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');
?>
Ce que la ligne de code ajoutée fait essentiellement est de remplir le tampon de mod_fcgi , le forçant ainsi à se vider. Le nombre "65537" a été choisi car la valeur par défaut de la FcgidOutputBufferSize
variable est "65536", comme mentionné dans la page Web Apache pour la directive correspondante . Par conséquent, vous devrez peut-être ajuster cette valeur en conséquence si une autre valeur est définie dans votre environnement.
Mon environnement
- WampServer 2.5
- Apache 2.4.9
- PHP 5.5.19 VC11, x86, non compatible avec les threads
- mod_fcgid / 2.3.9
- Windows 7 Professionnel x64
Exemple d'hôte virtuel
<VirtualHost *:80>
DocumentRoot "d:/wamp/www/example"
ServerName example.local
FcgidOutputBufferSize 0
<Directory "d:/wamp/www/example">
Require all granted
</Directory>
</VirtualHost>