[RESOLU] Cronjob qui lance un process php qui parfois reste en run

Eléphant du PHP | 385 Messages

06 juin 2025, 10:29

Hello à tous,

J'ai un cronjob qui va lancer un process php qui clean une boîte mail, il fonctionne bien aucun problème.
Le problème c'est que parfois je vois les logs de fin de script mais le process tourne toujorus, c'est juste un fichier php que j'execute et à la fin un die.

Mes questions
Comment ca peut arriver avec un die ?
Des solutions pour résoudre ca sans kill le process à la main ?
Ca pourrait être le die ? Et si c'est le cas pourquoi ca arrive rarement ?

Merci beaucoup pour votre aide

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 juin 2025, 12:45

Ça dépend de ce que tu utilises comme fonction, ça peut arriver notamment dans le cas de traitement asynchrone, alors PHP n'attend pas la fin de ce traitement et continue/fini le reste de l'exécution du script.
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

06 juin 2025, 13:24

c'est juste un fichier php que j’exécute et à la fin un die.
Ton die() peut ne servir à rien s'il est placé à la fin et qu'après ya pas de code PHP (die() inutile dans ce cas).

Une solution : enregistrer la date de lancement du script, puis lorsqu'il s'exécute, vérifier si ça fait longtemps ou pas que la commande a été lancée et l'exécuter ou pas.

Eléphant du PHP | 385 Messages

06 juin 2025, 15:29

Merci pour vos réponses, dans le script j'ai un call à l'api gmail et le die est à la fin du script quand c'est terminé.
Pas de traitement asynchrone ici ou autre j'utilise l'appel à l'api gmail via leur sdk.
Ce qui est curieux c'est vraiment que la fin du script ne kill pas le process.

Avatar du membre
Mammouth du PHP | 1564 Messages

06 juin 2025, 16:04

Quel "process" tourne toujours ?

Eléphant du PHP | 385 Messages

06 juin 2025, 16:55

Le process php dans debian si je fais un ps sur le script il ne ce termine pas parfois.
Désolé peut être je me suis mal expliqué.

J'ai cronjob sous debian, ce cronjob lance un script php monscript.php
dans monscript.php j'ai des call à l'api gmail pour nettoyer une boite mail et à la dans monscript.php j'ai un exit.

Ce script est lancé chaque 30 minutes et prends 10 minutes.

Parfois si je fais un ps sous debian un des process est toujours en cours depuis quelques jours mais quand je regarde les logs j'ai bien la fin du script.

Moi je veux que une fois terminé le process ce kill systématiquement, c'est ok mais parfois le process php part dans les choux.

Avatar du membre
Mammouth du PHP | 1564 Messages

06 juin 2025, 23:04

OK, je ne connais pas les process de ce genre mais quelques pistes pour t'aider :

Utiliser la commande "timeout" dans ta ligne qui lance le cron :
https://serverfault.com/questions/53966 ... -cron-jobs
Exemple :

Code : Tout sélectionner

*/30 * * * * timeout 900 /usr/bin/php /chemin/monscript.php >> /var/log/monscript.log 2>&1

Si tu fais des appels à Gmail via cURL ou une lib, définis des timeouts stricts :

Code : Tout sélectionner

$ch = curl_init(); curl_setopt($ch, CURLOPT_TIMEOUT, 900);// 15 min

Ajouter un timeout global dans ton script PHP :
// Timeout global de sécurité
declare(ticks=1);
pcntl_signal(SIGALRM, function() {
    error_log("Script killed: timeout");
    exit(1);
});
pcntl_alarm(900); 
Déclarer ticks peut devenir coûteux en CPU : https://www.php.net/manual/fr/function. ... php#111428

Voir les "processus zombie" :
https://fr.wikipedia.org/wiki/Processus_zombie
https://stackoverflow.com/questions/435 ... -is-called