J'essaie d'empêcher mon script cron de lui permettre de fonctionner en parallèle. J'en ai besoin pour que, s'il n'y a pas d'exécution en cours, le script soit autorisé à s'exécuter jusqu'à ce qu'il soit terminé, l'expiration du script ou une exception se produit.Arrêt de l'exécution parallèle du script PHP
J'ai essayé d'utiliser la fonction flock de PHP pour engager un verrou de fichier, exécutez le script, puis relâchez le verrou. Cependant, il semble toujours que je puisse exécuter le script plusieurs fois en parallèle. Est-ce que je manque quelque chose? Btw, je développe sur Mac OS X avec le système de fichiers Mac, peut-être est-ce la raison pour laquelle les verrous de fichiers sont ignorés? Bien que la documentation de PHP regarde seulement au sujet des systèmes de fichiers NTFS?
// Construct cron lock file path
$cronLockFilePath = realpath(APPLICATION_PATH . '/locks/cron');
// Get cron lock file
$cronLockFile = fopen($cronLockFilePath, 'r');
// Lock cron lock file
if (flock($cronLockFile, LOCK_EX)) {
echo 'lock';
sleep(10);
} else {
echo 'no lock';
}
erreurs de gestion ne devrait pas être un problème, je vais juste attraper toutes les exceptions et puis dissocier le fichier créé ... mais j'imagine que la gestion des terminaisons de script n'est pas possible, par exemple redémarre le serveur, redémarre Apache, ou timeout de script. Comme c'est un fichier cron, je pourrais juste faire fonctionner le script sans timeout. – cappuccino
Vous pouvez essayer d'avoir deux scripts: Le premier crée le fichier "lock", exécute votre script cron en cours, puis supprime le fichier "lock". Donc, même si votre script cron actuel explose, le premier script supprimera toujours le verrou. Autre chose que j'ai déjà faite: si votre script détecte que le fichier "lock" est là, mais que le filectime est plus ancien qu'une heure, vous le supprimez quand même, car il est très probable que quelque chose s'est mal passé. – FlorianH