Keskispass quand un script tourne et que le client se deconnecte...

Keskispass quand un script tourne et que le client se deconnecte... - PHP - Programmation

Marsh Posté le 01-04-2008 à 18:44:29    

Bonjour tout le monde.
 
Voici un code php simple :

Code :
  1. <?php
  2. set_time_limit(3600 * 24);
  3. jallouedesressources();
  4. while(true) {
  5. echo "wello php world!\n";
  6. }
  7. jedesallouedesressources();
  8. ?>


 
Un client affichant une page contenant ce code va se voir retourner du "hello php world" pendant 24h...
Maintenant que ce passe t il si le client se déconnecte avant ?
 
Ce que je souhaiterai c'est que lorsque le client se déconnecte, je sorte de la boucle et j'appelle la fonction jedesallouedesressources();.
Pour cela j'ai trouvé la fonction php : connection_status() qui retourne 1 si le client se déconnecte.
J'adapte mon code comme ceci :

Code :
  1. <?php
  2. set_time_limit(3600 * 24);
  3. jallouedesressources();
  4. while(true) {
  5. echo "wello php world!\n";
  6. if (connection_status() !== 0) break;
  7. }
  8. jedesallouedesressources();
  9. ?>


 
Et ca marche :D Sauf... Quand la connexion se coupe (donc pas de TCP FIN) et part en timeout...
Mon idée était donc de remplacer echo "hello php world" par :

Code :
  1. $stdout = fopen("php://output", "wb" );
  2. (...)
  3. $sw = array($stdout);
  4. $sr = $se = NULL;
  5. $r = stream_select($sr, $sw, $se, 3); // 3sec avant timeout
  6. if ($r === 0) { // timeout en écriture sur l'output donc buffer plein donc connexion tcp en timeout
  7. break;
  8. }
  9. fwrite($stdout, "hello php world!" );


 
 
Sauf que PHP me renvoie une erreur : cannot represent a stream of type Output as a select()able descriptor  :kaola:  
 
Et là je seche....

Reply

Marsh Posté le 01-04-2008 à 18:44:29   

Reply

Marsh Posté le 02-04-2008 à 10:00:40    

Upounet du matin :)

Reply

Marsh Posté le 02-04-2008 à 13:20:25    

:hello:
 
jpourrais pas du tout t'aider mais,  
 
je viens de voir ton premier code,  

Code :
  1. <?php
  2. set_time_limit(3600 * 24);
  3.  
  4. while(true) {
  5. echo "wello php world!\n";
  6. }
  7. ?>


 
il fait quoi exactement ce set_time_limit() ?
 
il va exectuer la boucle pendant 24h ? et donc envoyer qqs milliards de "hello world" ?

Reply

Marsh Posté le 02-04-2008 à 13:39:29    

Exactement.
J'ai volontairement simplifié mon code pour en faire un exemple et j'ai oublié de dire que le code contient aussi cette ligne ignore_user_abort(true); qui permet au script de continuer son exécution si le client se déconnecte.


Message édité par azubal le 02-04-2008 à 13:40:38
Reply

Marsh Posté le 02-04-2008 à 14:17:44    

Mais, après le timout, ton script va être arrêté, mais il ne va pas désallouer tes ressources, si ?


Message édité par kao98 le 02-04-2008 à 14:17:57

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 02-04-2008 à 15:28:40    

Au timeout le script est interrompu là ou il était, donc dans la boucle. Ce qui est après la boucle ne sera pas exécuté.
 
J'aurai du mettre un set_time_limit(0) qui signifie "pas de timeout".

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed