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

Exemples PHP de tâches planifiées

零下一度
Libérer: 2023-03-10 18:18:01
original
1857 Les gens l'ont consulté

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
Copier après la connexion

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());?>
Copier après la connexion

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

$ php test.php &amp;
Copier après la connexion
Copier après la connexion

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;
Copier après la connexion
Copier après la connexion

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
Copier après la connexion
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
Copier après la connexion
<br>
Copier après la connexion

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 +++
Copier après la connexion

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 &   这里的& 可以用也可以不用
Copier après la connexion

Méthode 2 : <br>Utilisez nohup.

$ nohup php test.php &
Copier après la connexion

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!

Étiquettes associées:
Déclaration de ce site Web
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
Derniers numéros
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal