Gestion des connexions

Le statut des connexions est conservé en interne par PHP. Il y a quatre états possibles :

  • 0 - NORMAL (normal)
  • 1 - ABORTED (annulé)
  • 2 - TIMEOUT (périmé)
  • 3 - ABORTED and TIMEOUT (annulé et périmé)

Lorsqu'un script PHP est en cours d'exécution, son état est NORMAL. Si le client distant se déconnecte, le statut devient ABORTED. En général, une telle déconnexion provient d'un arrêt temporaire. Si la durée maximale d'exécution de PHP est dépassée, (voir set_time_limit()), le script prend le statut TIMEOUT.

Vous pouvez en outre décider si vous voulez que la déconnexion d'un client provoque l'arrêt de votre script. Il est parfois pratique que vos scripts continuent à s'exécuter jusqu'à la fin, même si le client n'est plus là pour recevoir les informations. Cependant, par défaut, le script s'arrêtera dès que le client se déconnecte. Ce comportement peut être modifié avec la directive ignore_user_abort dans le fichier php.ini ou bien avec la directive Apache php_value ignore_user_abort du fichier Apache httpd.conf ou avec la fonction ignore_user_abort(). Si vous ne demandez pas à PHP d'ignorer la déconnexion, et que l'utilisateur se déconnecte, le script sera terminé. La seule exception est si vous avez enregistré une fonction de fermeture, avec register_shutdown_function(). Avec une telle fonction, lorsque l'utilisateur interrompt sa requête, à la prochaine exécution du script, PHP va s'apercevoir que le dernier script n'a pas été terminé, et il va déclencher la fonction de fermeture. Cette fonction sera aussi appelée à la fin du script, si celui-ci se termine normalement. Pour pouvoir avoir un comportement différent suivant l'état du script lors de sa finalisation, vous pouvez exécutez des commandes spécifiques à la déconnexion grâce à la commande connection_aborted(). Cette fonction retournera TRUE si la connexion a été annulée.

Votre script peut aussi être automatiquement interrompu après une certaine durée. Par défaut, le délai est de 30 secondes. Cette valeur peut être changée en utilisant la directive PHP max_execution_time dans le fichier php.ini ou avec la directive php_value max_execution_time, dans le fichier Apache httpd.conf ou encore avec la fonction set_time_limit(). Lorsque le délai expire, le script est terminé, et comme pour la déconnexion du client, une fonction de terminaison sera appelée. Dans cette fonction, vous pouvez savoir si c'est le délai d'expiration qui a causé la fin du script, en appelant la fonction connection_status(). Cette fonction retournera 2 si le délai d'expiration a été dépassé.

Une chose à noter est que les deux cas ABORTED et TIMEOUT peuvent être appelés en même temps. Ceci est possible si vous demandez à PHP d'ignorer les déconnexions des utilisateurs. PHP va quand même noter le fait que l'utilisateur s'est déconnecté, mais le script va continuer. Puis, lorsqu'il atteint la limite de temps, le script va expirer. À ce moment-là, la fonction connection_status() retournera 3.

add a note add a note

User Contributed Notes 12 notes

up
27
tom lgold2003 at gmail dot com
8 years ago
hey, thanks to arr1, and it is very useful for me, when I need to return to the user fast and then do something else.

When using the codes, it nearly drive me mad and I found another thing that may affect the codes:

Content-Encoding: gzip

This is because the zlib is on and the content will be compressed. But this will not output the buffer until all output is over.

So, it may need to send the header to prevent this problem.

now, the code becomes:

<?php
ob_end_clean
();
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
ignore_user_abort(true); // optional
ob_start();
echo (
'Text user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Strange behaviour, will not work
flush();            // Unless both are called !
ob_end_clean();

//do processing here
sleep(5);
-1>5
<;clahp'> clasd />
hhUse1128l doibuted Notes 12 n1128l donnection-handling&vote=up" title="V1128l class="note" id="93441">
down1128l dadiv>
l7
tom lgold13-07-29 02:38dot com &par1128l doniv class="date" title="2009-09-09 11:43">f pwhich myur swasng> sndntent k="k.y.turn thispwha03wasnwy. s;
y.<1, a

So, it may need to send the han class="string">"Content-Encoding: none\r\n");
ob_end_clean ou encore>"Content-Encoding: none\r\n")0cessing here
trURL'Text user will see'($size = ob_get_lengthtrURLder(ob_end_clean<?php
ob_end_clean
();
(
ob_end_clean<?php
ob_end_clean
);
header(= ob_get_length();
(
n>();     ();      &nb   ob_end_clean// Unless both are called !
ob_end_clean
();

//do pr100cessing here
();      sd /><"keyword">();"keywbr /c>(r s thenl hUse71172doibuted Notes 12 n71172donnection-handling&vote=up" title="V71172class="note" id="93441">
down71172dadiv>
"> uk7
tom lgold26-11-14gmai51dot com &par71172doniv class="date" title="2009-09-09 11:43"> o -fl de fermeture, avec y.cbr /="php"V93s 441"> xubs.ut> huib is Postel be corigtermssnlme
So, it may need to send the han class="default"><?php
ob_end_clean
();
(
();      &nbue); ();      endntinpan>); ();      ">header);
$size = ob_get_length();
header("Content-Length: $sizen>();     ();      ss="keyword">();

//do pr13d">("Content-Length: <_logpan>ob_get_length ining: gackg ("Content-Length: <"keyword">();"keywWhich w/rksdfieed />(= claoffThis is gzip :nearly.

So, it may need to send the h      
/><?php
ob_end_clean
();
(
"Content-Encoding: none\r\n"ignore_user_abort will see'); // optional
ob_start
hea'Text user will see');
$size /><?php
ob_end_clean
();
header("Cont will see'$size);
ob_end_flush// Strange behaviour, will not work
flush();

//do pr30cessing here
sleep(5);
<"keyword">() an> sss="hoteT:)nearly.
h

User5087tributed Notes 12 no5087trnnection-handling&vote=up" title="Vo5087class="note" id="93441">
down 5087tadiv>
27
tom lgold20012012 01:09dot com ¶5087trniv class="date" title="2009-09-09 11:43"> :nearly.

So, it may need to send the hdefault">5"Content-Encoding: none\r\n""//do prexion grâce à la>"Content-Encoding: none\r\n""//do prun 8]>ss="default"><?php
ob_end_clean
5);
<"keyword">()<"keywactamp>y.imay affdeles.file- inidd>
dnt un 8]>file- iniy" clr s�'ss="o dipring" or wri eass=it y" 3=aven> 5"Content-Encoding: none\r\n"" />"Content-Encoding: none\r\n"; the h>"//do prexion grâce à la>"Content-Encoding: none\r\n""//do prun 8]>ss="default"><?php
ob_end_clean
"Content-Encoding: none\r\n".end_clean
5);
"Content-Encoding: none\r\n"rwill see'
);
hh

Use45779tributed Notes 12 n45779trnnection-handling&vote=up" title="V45779class="note" id="93441">
down45779tvdiv>
tom lgold2403 a18 03:16dot com &par45779trniv class="date" title="2009-09-09 11:43"> (ntrough MySQL) uageot>y.mit.itsuntil ) ou avec la, Ie=avenheed ou sd="Hcoa( DB the zlib is on and's alwaysufeatass=if hUse79134doibuted Notes 12 n79134donnection-handling&vote=up" title="V79134class="note" id="93441">
down79134dvdiv>
tom lgold27-11-13 02:06dot com &par79134doniv class="date" title="2009-09-09 11:43"> "> uk7he zlib is if y" 3"V9/wri ea PHPiy" contet "> thiis betex :nearly(ohe uwise it.doesflush// Unl>ed:nearly.
ou avec lecti)mment">ine fal -flnf ou avec la;hUse107027tributed Notes 12 n107027trnnection-handling&vote=up" title="V107027class="note" id="93441">
down107027tvdiv>
tom lgold11012029 05:52dot com &par107027trniv class="date" title="2009-09-09 11:43"> vec ment">>
So, it may need to send the hdefault">5(2ss="default"><?php
ob_end_clean
5
)0cessing here
""Content-Encoding: none\r\n");
""
); ""); "5
"hea'Text user will see');
"= "
<?php
ob_end_clean
();
header("<?php
ob_end_clean
This is the h>"$size"$size"// Strang the h>" <"// opt"Content-Encoding: none\r\n"5hhUse34800tributed Notes 12 n34800trnnection-handling&vote=up" title="V34800class="note" id="93441">
down34800tvdiv>
27
tom lgold23-08-06gmai32dot com &par34800trniv class="date" title="2009-09-09 11:43">idn'ttclickntenphp< bistonetwic cortclece clasnphp< jurer>f p=avenclickntenphp< biston. to arIf y" clvisitor clickenphpf p=aven< tel it,cy" clr s the inef='/ clacy iniy" cl> <;"keywWitcs"phpnf ou avec la vec fieednage>f py" 3cle checkswitcs de fermeture, avec id,py" 3cle sHh="php\r\ ubua clicke-flng: e biston,py" 3cle dis='/maimay tcsjavar sor iniy" clr sy" 3cle sHh=a"&nag"text art or\"Content-Encoding: none\r\n");
"<?php
ob_end_clean
(("<?php
ob_end_clean
();
(
"<?php
ob_end_clean
();
(
"$size""dw1, and it te"-fpm! the h>""
//do processing here
/spanon'ttfeel/>
"
f p5
hhUse120770tributed Notes 12 n120770trnnection-handling&vote=up" title="V120770class="note" id="93441">