Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/03/2011, 12h24   #1
Invité de passage
 
Inscription : janvier 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 21
Points : 4
Points : 4
Par défaut parallélisme de scripts ?

Bonjour à tous,

Voilà un problème m'ennuie depuis un petit moment et porte sur le nombre "d'instances" d'un script que peut exécuter un utilisateur à la fois.

Je prends l'exemple d'un script très simple qui comporte ce code :

Code :
1
2
3
4
5
 
<?php
sleep(10);
echo "coucou";
?>
Je lance ce script dans un premier onglet de mon navigateur. A la moitié (5sec), je relance le même dans un second onglet et donc de façon parallèle au premier. En faisant ceci, je m'aperçois que le script du 2è onglet dure 15 secondes et non 10 secondes, autrement dit, il ne débute que lorsque le premier a été traité !

Il n'y a pas ce problème lorsque j'utilise 2 navigateurs différents, les scripts sont parallèles....

Finalement, ma question, c'est que j'aimerais savoir d'où cela vient, est-ce au niveau d'Apache ? de PHP ? Est-ce que j'me trompe ou est-ce que c'est "problème" connu ?

Merci bien...
DiPSoMaNiE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 12h36   #2
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Si tu as une exécution parallèle sur 2 navigateurs différents, je pense que le problème vient du navigateur.

Pour info, FF a de nombreux paramètres réglables dans about:config

Par exemple :
network.http.max-connections
network.http.max-connections-per-server
network.http.max-persistent-connections-per-proxy
network.http.max-persistent-connections-per-server
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 12h51   #3
Invité de passage
 
Inscription : janvier 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 21
Points : 4
Points : 4
Citation:
Envoyé par Fladnag Voir le message
Si tu as une exécution parallèle sur 2 navigateurs différents, je pense que le problème vient du navigateur.

Pour info, FF a de nombreux paramètres réglables dans about:config

Par exemple :
network.http.max-connections
network.http.max-connections-per-server
network.http.max-persistent-connections-per-proxy
network.http.max-persistent-connections-per-server
J'ai le problème pour tous les navigateurs (IE, FF et chrome) quand je lance le script en parallèle via leurs onglets ou via une nouvelle fenêtre. Pourtant ils sont tous configurés assez haut dans le nombre maximum de connexions http, en tout cas loin d'être limité à 1 seule connexion

Mais effectivement, le parallélisme est bien là si je lance le script en parallèle dans 2 navigateurs différents en même temps, ils durent chacun 10 secondes.
Dans le même navigateur, le 2è script ne démarre qu'à partir de la fin du premier. Je ne comprends pas
DiPSoMaNiE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 13h15   #4
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
Ok

Lors d'une communication entre un navigateur et un site web, plusieurs choses se passent :

* Le navigateur ouvre un port (local) pour communiquer avec le site web
* Le navigateur envoie une requete HTTP sur le port 80 du site web

* Le serveur web (en général Apache) recoit la requete HTTP.
* Comme il doit servir au plus vite les autres requetes, il créé un nouveau thread qui se charge de répondre a la requete et revient dans une boucle d'attente sur le port 80.

Il est possible (bien que je n'ai jamais entendu parler de ca, mais je suis pas un pro de la configuration apache ^^) que l'une des hypotheses suivantes soient vraies :
* Le serveur web associe un thread par couple client/port. Tant que le 1er n'est pas libéré, la requete suivante ne peux avoir lieu.
* Le serveur web ouvre une ressource (log, session, etc...) lors d'une connection d'un client (client identifié par IP, numéro de port, etc...) et la maintient ouverte jusqu'a la fin de la requete

Dans tout les cas, ca me parait quand même étrange ton histoire.
Je vois mal Apache configuré pour ne pas paralleliser les appels.
Quand tu charges une page, tu télécharges les différents éléments de la page HTML en parallèle. Les images, les animations flashs, etc... sont toutes demandée au serveur dans des threads différents.

L'autre possibilité est que le blocage se situe uniquement au niveau de PHP, mais là encore, c'est inédit pour moi. Pourquoi PHP serait appelé de manière séquentielle ?

Si tu veux tester plus simplement, tu peux aussi créer une page avec 2 iframes qui pointent vers le meme script PHP. En principe les 2 iframes devraient s'afficher a peu pres en meme temps et non avec 10s de décalage.
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 13h18   #5
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
La doc PHP apporte une réponse ^^

http://fr.php.net/manual/fr/function.sleep.php#96592

Le sleep est global a la session PHP !

essaye de mettre session_write_close() avant ton sleep(), ca devrait résoudre le problème.
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 15h00   #6
Invité de passage
 
Inscription : janvier 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 21
Points : 4
Points : 4
Citation:
Envoyé par Fladnag Voir le message
La doc PHP apporte une réponse ^^

http://fr.php.net/manual/fr/function.sleep.php#96592

Le sleep est global a la session PHP !

essaye de mettre session_write_close() avant ton sleep(), ca devrait résoudre le problème.
EDIT :

http://fr.php.net/manual/fr/function...lose.php#96982

Apparemment le commentaire de cette personne explique exactement mon problème donc tu as raison c'est bien un problème de session !
DiPSoMaNiE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 15h12   #7
Invité de passage
 
Inscription : janvier 2009
Messages : 21
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 21
Points : 4
Points : 4
Bon et bien je te remercie pour tout ça c'est effectivement ça le problème et un session_write_close() bien placé résoud tous les problèmes

Encore merci
DiPSoMaNiE est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h23.


 
 
 
 
Partenaires

Hébergement Web