2010-07-24 3 views
0

J'ai fait une boucle while en php:Comment puis-je empêcher le serveur de se surcharger?

<?php 
include_once("connect.php"); 

$search=mysql_query("SELECT * from chat ORDER BY id DESC LIMIT 1"); 
$row=mysql_fetch_assoc($search); 
$type=$row['type']; 
$id=$row['id']; 
while($type!='n'){ 
    usleep(10000); 
    $search=mysql_query("SELECT * from chat ORDER BY id DESC LIMIT 1"); 
    $row=mysql_fetch_assoc($search); 
    $type=$row['type']; 
} 

$run=mysql_query("UPDATE chat SET type='o' WHERE id=$id"); 

mysql_close($conn); 
echo $row['message'] . "<br/>"; 

?> 

Il fonctionne toujours pour voir s'il y a des nouvelles entrées dans la base de données, mais je ne sais pas quoi faire pour garder le serveur de surcharge. J'ai essayé de dormir mais je ne pense pas que ce soit suffisant.

Je reçois également cette erreur "Erreur fatale: temps d'exécution maximum de 60 secondes dépassé" et je sais que je peux changer le nombre de répétitions dans le fichier .ini mais serait-ce sage? Cela aura-t-il un très mauvais effet sur les performances des serveurs?

Répondre

0

boucle Vous while termine jamais depuis que vous obtenez toujours le dernier enregistrement, mais ne pas modifier ce .. et vous allez dans la boucle une fois et toujours vérifier le même enregistrement, sans jamais quitter la boucle ...

vous devriez essayer de convertir votre boucle infinie à un événement prévu qui court à un certain intervalle .. utilisant cron ..


Mise à jour

Si vous êtes en attente pour une autre action pour changer le type du dernier enregistrement de sorte que ce code va attraper et sortir de la boucle, votre algorithme est pas bon pour les applications client/serveur ..

Vous devrait prévoir à un autre moment, le moment où le dossier est prêt à être modifié et appeler le code à ce moment-là, au lieu d'aller à une boucle infinie jusqu'à ce qu'un événement extérieur fait la boucle infinie non ..

+0

il quitte la boucle parce que le UPDATE passe à travers et fait son travail, je demande juste s'il y a quelque chose que je peux faire pour le serveur. – nope

+0

La mise à jour ne "passe" pas à la fin de la boucle - ce qui, comme le dit @Gaby, ne l'est jamais. –

+0

mec, ça fait!les rangées sont mises à jour ce que tu n'as pas? Ça marche! – nope

1

Mise à jour

usleep(10000); 
set_time_limit(11000); 

Première réponse

Qu'essayez-vous d'obtenir avec ce code? Le message de délai d'attente provient du script usleep(10000).

Votre code ne peut pas détecter les entrées immédiates de l'utilisateur, votre code PHP s'exécutera entre les interactions de l'utilisateur avec le serveur.

Si vous voulez créer un utilitaire de chat:

  • Envoyez vos messages via AJAX chaque fois qu'un utilisateur frappe Enter ou Send
  • Mémoriser le message reçu, ainsi que l'horodatage du message reçu
  • Sélectionnez un update time, disons 3 secondes
  • Mise à jour le chat via AJAX, chaque update time
  • retour au mess âge qui sont update time vieux, ou plus récent
+0

il fonctionne toujours, en cas de succès, quand le message a été ramené, je l'appelle à nouveau et la réponse est très rapide im juste demander s'il y a quelque chose que je peux faire pour le serveur. – nope

Questions connexes