2009-11-24 5 views
3

J'ai un fichier php qui est déclenché par un cronjob chaque minute.PHP sleep() boucle interne ne pas mettre à jour DB

Lorsque le fichier php est tiré, il met à jour la base de données, capacité d'accueil, etc

Il est programmé comme ceci:

$start = microtime(true); 
set_time_limit(10); 

for($i=0;$i<5;$i++) 
{ 
    updateDB(); 
    time_sleep_until($start + $i + 1); 
} 

Si ce morceau de code est exécuté, je ne vois pas de changements qui se produisent dans la base de données. Une autre chose que je remarque est quand je fais écho à quelque chose qui est imprimé lorsque la boucle est terminée en une seule pièce.

[modifier] J'essayé d'utiliser chasse d'eau et ob_flush, mais il n'a toujours pas la ligne d'impression pour la ligne [/ edit]

Que puis-je faire pour éviter ces erreurs. La base de données doit être mise à jour. Une autre chose que je me demandais est quelle est la meilleure façon de se connecter ce genre de chose. Puis-je enregistrer les résultats dans un fichier journal?

+1

Vos échos peuvent être tamponnés. Appeler flush après chaque écho leur permettra probablement d'imprimer immédiatement. –

+0

salut, merci pour la réponse. J'ai essayé d'utiliser le flush, mais il n'y avait pas de différence. –

+0

Désolé, j'ai eu des problèmes différents, la chasse fonctionne maintenant, tout va bien. Je vous remercie. –

Répondre

4

La boucle elle-même semble bien. S'il ne met pas à jour votre base de données, l'erreur doit figurer dans votre fonction updateDB().

En ce qui concerne l'écho. La sortie des scripts est souvent mise en mémoire tampon. Pour forcer PHP à l'imprimer tout de suite, vous pouvez appeler soit flush() à chaque fois que vous voulez que la sortie soit vidée, ou vous pouvez simplement appeler ob_implicit_flush() en haut du script et il se videra automatiquement chaque fois que vous imprimez quelque chose. De plus, si vous appelez le script via un navigateur, le navigateur lui-même peut tamponner la réponse avant de vous l'afficher. Pour ce qui est de la journalisation, le plus simple est de choisir un fichier quelque part et d'utiliser file_put_contents() pour imprimer ce que vous voulez. Notez l'indicateur FILE_APPEND pour le troisième paramètre.

+0

Salut, merci pour la réponse. La chose étrange est que la fonction updateDB() fonctionne correctement. Lorsque je supprime la boucle, et que je fais une méta-actualisation html de 1 sec, tout fonctionne bien. Sauf pour dans la boucle. Et à la fin du fichier, il imprime simplement le contenu de l'écho, pas d'erreurs. Y at-il une autre méthode à invoquer lorsque vous utilisez le sommeil? –

+0

C'est bizarre. Je ne vois pas pourquoi la fonction fonctionnerait différemment de cette façon. Il est bien sûr difficile de dire avec certitude, sans vraiment voir la fonction. Si vous appelez la fonction cinq fois de suite, chaque fois suivi de * sleep (1) *, cela change-t-il quelque chose? ... P.S. Ajout d'un détail sur la mise en mémoire tampon. – Atli

+0

Salut, tout fonctionne très bien maintenant. J'ai eu quelques erreurs dans ma classe updateDB(), elles n'étaient pas vraiment des erreurs, mais une mauvaise programmation. Les mises à jour de la base de données ont dû être vérifiées par rapport à l'heure actuelle en secondes. Les temps ont été définis une fois avant la boucle, donc rien de mis à jour, et aucune erreur.
Mais tout fonctionne bien maintenant, la chasse fonctionne aussi. Je vous remercie –

0

On dirait que vous exécutez à partir de la ligne de commande, dans ce cas vous pouvez écrire dans stderr afin qu'il n'y ait pas de mise en mémoire tampon. $ stderr = fopen ('php: // stderr', 'w');

En cas de journalisation, ouvrez simplement un fichier, écrivez-le et fermez-le. (fopen, fwrite, fclose);

Questions connexes