Requête MySQL en attente de résultat

Requête MySQL en attente de résultat - PHP - Programmation

Marsh Posté le 01-05-2008 à 17:30:19    

Bonjour à tous,
 
Je cherche à faire en sorte qu'une requête MySQL lancée par un mysql_query() attende qu'il y ai des résultats avant de les renvoyer à PHP. C'est à dire que je veux que le mysql_query() bloque volontairement l'execution du script PHP tant qu'il n'y a pas de résultats pour la requête.
 
Pourquoi ? J'ai besoin de lancer un SELECT sur une table et d'attendre que des lignes soient insérées par un autre script executé en parallèle, avant de continuer l'execution du premier script et donc le traitement des données.
 
J'ai fouillé dans la documentation MySQL à la recherche d'une syntaxe pour bloquer une requête mais je n'ai rien trouvé d'explicite, à part une partie que je n'ai pas trop compris : http://dev.mysql.com/doc/refman/5. [...] model.html
 
Je pourrais faire un "while" avec un "sleep" de 1 seconde et une requête MySQL à chaque passage, mais ca serait très lourd pour la base de données à mon avis.
 
Des propositions ? :D


Message édité par osef le 01-05-2008 à 17:31:35
Reply

Marsh Posté le 01-05-2008 à 17:30:19   

Reply

Marsh Posté le 01-05-2008 à 20:15:32    

Merci beaucoup pour ta réponse complète, ca fait plaisir à lire :)
 
Pour ton système "producteur-consommateur", j'ai réalisé exactement la même chose a base de while + file_exists + sleep(1), et j'ai justement pensé la même chose concernant les accès au disque, il ne va pas trop aimer. D'autant plus que j'ai testé en faisant tourner le script 5 fois en parallèle et les temps de réponses ont doublé voire triplé.
 
Le but de mon système est qu'il y ai X clients qui attendent que quelqu'un insère un enregistrement dans la base, donc il me faut quelque chose de léger.
 
Pourrais tu m'en dire plus concernant la solution "engine heap" s'il te plait ? :)

Reply

Marsh Posté le 01-05-2008 à 21:05:22    

Ah oui bien vu, je n'avais pas pensé aux sessions, merci beaucoup pour cette solution :)
 
Mais les sessions sont stockées avec des fichiers sur le disque dur, ne va t-on pas retrouver le problème des accès disque ? Je présume que la gestion des sessions se fait en mémoire vive une fois les fichiers chargés ?

Reply

Marsh Posté le 01-05-2008 à 23:26:43    

Je crois que j'ai un problème :(
 
Pendant que le consommateur vérifie l'existance de la variable de session, le producteur ne peut pas la modifier et donc son script reste bloqué.
 
Après avoir fait quelques tests, il semblerait que c'est parce que le consommateur occupe la session pendant qu'il fait le while, donc le producteur doit attendre que la session soit "libérée" pour pouvoir écrire une variable dedans.
 
Si j'enlève le session_start dans le script du producteur, il n'est plus bloquant, mais du coup il ne sert plus à rien :D
 
Help !

Reply

Marsh Posté le 01-05-2008 à 23:49:21    

Je suis sur mon localhost avec un WAMP.
 
Sinon j'ai testé la solution avec apc_store/apc_fetch et ca marche super bien, aucun bloquage !
Mais il me faudra quand même utiliser les sessions pour authentifier les clients, car le système s'executera dans un espace privé...
Sachant qu'un consommateur pourra être producteur (donc même session utilisée pour 2 requêtes simultanées), je vais être coincé :(


Message édité par osef le 01-05-2008 à 23:57:42
Reply

Marsh Posté le 01-05-2008 à 23:58:03    

Ah j'ai édité mon message pendant que tu as posté le tiens :D

Reply

Marsh Posté le 02-05-2008 à 00:23:37    

Mouarf, moi qui voulait juste faire un petit chat PHP pour passer le temps, je me retrouve avec une grosse prise de tête :D
Oui en effet, je voulais faire un chat qui allait vérifier sur le serveur en permanence si de nouveaux messages sont reçus. Pour ce faire, il y avait plusieurs solutions :
 
- La solution basique qui consiste à faire une requête AJAX toutes les X secondes (1 ou 2) sur le serveur pour vérifier les nouveaux messages, mais ca me parait beaucoup trop lourd car cela fait plein de requêtes HTTP sur le serveur.
 
- La solution que je voulais faire qui consiste à faire une requête AJAX permanente (mais avec un timeout de 1 minute) executant un script PHP qui reste bloqué tant qu'il n'y a pas de nouveaux messages, donc avec une boucle PHP (fichiers, session, apc) ou MySQL (requête bloquante ?) qui vérifie toutes les 100 ms. Cela ne fait qu'une requête HTTP par minute, mais pose les problèmes que l'on a vu ci-dessus.
 
Je sais qu'il existe déjà plein de chat en PHP sur le net, mais je voulais me lancer un petit défi et construire quelque chose moi même.
Bon bah je crois que je vais retourner jouer aux Lego :(


Message édité par osef le 02-05-2008 à 00:24:01
Reply

Marsh Posté le 02-05-2008 à 00:28:24    

Oui mais je voulais pas de rafraichissement toutes les 5 secondes :D Je voulais un affichage instantané, donc en passant par une requête AJAX "permanente", c'est à dire en attente perpetuelle d'un nouveau message. D'autant plus que le chat aurait géré plein d'autres trucs par la suite, comme la connexion/déconnexion des amis, et des trucs comme sur MSN par exemple :)


Message édité par osef le 02-05-2008 à 00:30:03
Reply

Marsh Posté le 02-05-2008 à 00:44:31    

Oui justement si je passe par AJAX/PHP c'est pour éviter un truc comme Java, je voulais un chat qui ne nécessite aucun plugin :D

Reply

Sujets relatifs:

Leave a Replay

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