Maison  >  Article  >  développement back-end  >  Exemples PHP de tâches planifiées

Exemples PHP de tâches planifiées

零下一度
零下一度original
2017-06-23 14:34:441795parcourir

Les tâches planifiées utilisées par l'entreprise ressemblent à peu près à ceci :

*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1

Vous pouvez voir que la sortie et l'erreur standard sont redirigées vers un certain appareil vide. limite à cette raison. J'ai vérifié quelques informations et les décris ici :

1. Serveur de connexion Ssh <br> 2. Créez un nouveau fichier php test.php avec le code suivant :

<?php
sleep(50);
echo "aaa\n";
file_put_contents("/tmp/test.txt",time());?>

3. Utilisez la commande suivante pour exécuter le programme test.php

$ php test.php &amp;

Affichez le contenu du fichier /tmp/test.txt sous la forme 1497613738

4. Puis exécutez-le à nouveau La commande suivante. Une fois la commande exécutée, utilisez immédiatement la commande exit pour vous déconnecter

$ php test.php &amp;

5 Connectez-vous ensuite au serveur via ssh et recherchez le contenu du /tmp/test. Le fichier txt est toujours 1497613738. Cela signifie que lorsque test.php a été exécuté pour la deuxième fois, la fonction file_put_contents n'a pas été exécutée ou n'a pas été exécutée avec succès.

6 Utilisez strace pour le suivi :

正常情况下的追踪:
strace -p
Process 1475 attached
restart_syscall(<... resuming interrupted call ...>) = 0write(1, "aaa\n", 4aaa
)                    = 4lstat("/tmp/test.txt", 0x7ffe792ebe90)  = -1 ENOENT (No such file or directory)
lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=65536, ...}) = 0open("/tmp/test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0lseek(3, 0, SEEK_CUR)                   = 0write(3, "1497614186", 10)              = 10close(3)                                = 0munmap(0x7f4840239000, 528384)          = 0close(2)                                = 0close(1)                                = 0munmap(0x7f4847510000, 4096)            = 0close(0)                                = 0munmap(0x7f4847511000, 4096)            = 0sched_getaffinity(1475, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0munmap(0x7f48404c8000, 2119936)         = 0munmap(0x7f48406ce000, 2345056)         = 0munmap(0x7f4840b39000, 2162536)         = 0munmap(0x7f484090b000, 2282472)         = 0munmap(0x7f4840d49000, 323584)          = 0exit_group(0)                           = ?
+++ exited with 0 +++[1]+  Done                    php test.php
<br>

Suivi après vous être déconnecté puis reconnecté :

strace -p 3881

restart_syscall(<... resuming interrupted call ...>) = 0write(1, "aaa\n", 4)                    = -1 EIO (Input/output error)
munmap(0x7f6b7fc04000, 528384)          = 0close(2)                                = 0close(1)                                = 0munmap(0x7f6b86edb000, 4096)            = 0close(0)                                = 0munmap(0x7f6b86edc000, 4096)            = 0sched_getaffinity(3881, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0munmap(0x7f6b7fe93000, 2119936)         = 0munmap(0x7f6b80099000, 2345056)         = 0munmap(0x7f6b80504000, 2162536)         = 0munmap(0x7f6b802d6000, 2282472)         = 0munmap(0x7f6b80714000, 323584)          = 0exit_group(0)                           = ?
+++ exited with 0 +++

Par comparaison, vous pouvez voir qu'il y a une erreur d'entrée/sortie au niveau de l'écho, et que la fonction file_put_contents n'est pas exécutée dans la fin.

7 Raison :

Pourquoi une erreur EIO se produit-elle après la déconnexion puis la reconnexion ? Ceci est lié au traitement des sessions Linux. <br>Lorsqu'un utilisateur se connecte à un serveur via ssh, une session est démarrée. Une fois la session démarrée, l'entrée standard (stdin), la sortie standard (stdout) et l'erreur standard (stderr) seront connectées à un terminal correspondant (pty). <br>Une fois l'utilisateur connecté, toute sortie standard sera reflétée dans le terminal. Le descripteur de fichier pour la sortie standard est 1. Par conséquent, echo("aaan") en php entraînera l'exécution de l'appel système write(1, "aaan", 4) aaan qui sera écrit dans le terminal. <br>Une session se termine lorsque l'utilisateur se déconnecte. À la fin de la session, modifiez tous les descripteurs de fichiers ouverts sur le terminal pour qu'ils soient illisibles et inscriptibles ; <br> Si l'utilisateur se déconnecte puis exécute write(1, "aaan", 4), une erreur EIO sera signalée. Parce que le handle du terminal n’est plus accessible en écriture. Lorsqu'une erreur EIO se produit, le processus se termine.

Solution<br>Méthode 1 : <br>Utilisez le symbole de redirection & pour rediriger la sortie standard vers le trou.

$ php test.php > /dev/null 2 >&1 &   这里的& 可以用也可以不用

Méthode 2 : <br>Utilisez nohup.

$ nohup php test.php &

Remarque :

Si vous exécutez un processus et que vous pensez que vous devriez vous déconnecter de votre compte Le processus ne sera pas encore terminé, vous pouvez donc utiliser la commande nohup.

Cette commande peut continuer à exécuter le processus correspondant après vous être déconnecté du compte/fermer le terminal. nohup signifie ne pas raccrocher (n ohang up).

Notre société adopte la première méthode, concernant la description de /dev/null 2 >&1 &, Voir un autre article

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn