PHP: exécution de tâches planifiées (cron jobs)
J'ai un site sur mon webhotel je voudrais exécuter certaines tâches planifiées sur. Quelles sont les méthodes de la réalisation de ce que vous recommanderiez?
Ce que j'ai pensé jusqu'à présent est d'avoir un script inclus dans le haut de chaque page et de laisser ensuite ce script vérifier si il est temps pour exécuter cette tâche ou pas.
C'est juste un petit exemple de ce que je pensais:
if ($alreadyDone == 0 && time() > $timeToRunMaintainance) {
runTask();
$timeToRunMaintainance = time() + $interval;
}
Autre chose que je devrais prendre en compte ou est-il une meilleure méthode que cela?
Vous devez vous connecter pour publier un commentaire.
C'est ce que les tâches cron sont faites pour.
man crontab
en supposant que vous utilisez un serveur linux. Si vous n'avez pas accès au shell ou aucun moyen de configuration de cron jobs, il y a des services gratuits d'installation de tâches cron sur des serveurs externes et un trackback de votre Url.Je vais répondre à cela maintenant parce que personne ne semble avoir mentionné cette solution exacte.
Sur un site que je suis en train de travailler, nous avons mis en place une tâche cron en utilisant cPanel, mais au lieu de l'exécution de l'Interprète PHP directement (parce que nous sommes à l'aide de CodeIgniter et notre code est associé à un contrôleur de fonction, ce n'est probablement pas une bonne idée), nous utilisons les
wget
.-q
est ainsi que wget ne génère aucune sortie (si vous ne gardez pas à recevoir des courriels).-O cron_job.log
va enregistrer le contenu de ce que votre contrôleur génère un fichier journal (écrasé à chaque fois afin de ne pas continuer à grandir).J'ai trouvé que c'était le moyen le plus facile d'être " bon " cron de travail.
Si vous avez un cPanel d'accueil, vous pouvez ajouter des tâches cron via l'interface web.Aller à Avancé -> Cron Jobs et d'utiliser la non-forme avancée pour configurer le cron de fréquence. Vous souhaitez une commande comme ceci:
si vous vous demandez comment faire pour exécuter votre script PHP à partir de cron, il y a deux options: Appeler l'interprète PHP directement (c'est à dire, "php /foo/myscript.php"), ou d'utiliser le lynx (lynx http://mywebsite.com/myscript.php). Celui que vous choisissez dépend de la façon dont votre script doit son environnement configuré les chemins d'accès et les autorisations d'accès au fichier sera différent selon que vous l'appelez par le biais de la coque ou le navigateur web. Je vous recommande d'utiliser lynx.
Un effet secondaire est que vous obtenez un e-mail à chaque fois qu'il s'exécute. Pour contourner ce problème, je fais mon cron PHP scripts de sortie rien (et il a de n'être rien, pas même des espaces) si ils réussissent, et un message d'erreur en cas de défaillance. Je puis les appeler à l'aide d'un petit script PHP à partir de cron. De cette façon, je ne reçois un e-mail en cas d'échec. C'est fondamentalement le même que le lynx méthode, à l'exception de mon script shell qui fait la requête HTTP et pas de lynx.
Appeler ce script "docron" ou quelque chose (n'oubliez pas de faire un chmod +x), puis utilisez la commande dans votre crontab: "docron http://mydomain.com/myscript.php". Il e-mails que vous la sortie de la page HTML de l'e-mail, si la page renvoie quelque chose.
Avez-vous déjà regardé ATrigger? Le Bibliothèque PHP est également disponible pour commencer à créer des tâches planifiées sans aucune surcharge.
Disclaimer: je suis parmi leur équipe.
http
protocole à la place de lahttps
Si vous voulez éviter de mettre en place des tâches cron et autres joyeusetés (bien que je te suggère c'est une meilleure méthode), la solution que vous avez fourni est assez bonne. Sur un certain nombre de projets, j'ai eu le script PHP lui-même faire la vérification pour voir si il est temps d'exécuter la mise à jour.
Le bas-côté (bien, un des bas côtés), c'est que si personne n'est à l'aide de l'application pendant une certaine période, puis le script ne s'exécute pas.
Le bon côté est que si personne n'est à l'aide de l'application pendant une certaine période, puis le script ne s'exécute pas. Les tâches que j'ai mis en place pour faire des choses comme "mise à jour d'un fichier de cache", "faire une sauvegarde quotidienne" et autres joyeusetés. Si quelqu'un n'est pas l'aide de l'application, alors vous n'avez pas besoin de mise à jour des fichiers de cache, ni de modifications de base de données de sauvegarde.
La seule modification à votre méthode que je suggère, c'est que vous n'exécutez ces vérifications lorsque quelqu'un se connecte avec succès dans. Vous n'avez pas besoin de vérifier à chaque chargement de page.
Cron est un objectif général de solution pour les problèmes d'ordonnancement. Mais, quand vous allez gros et les horaires vont de haut en fréquence, il peut être la fiabilité/se recoupent. Si vous voyez de tels problèmes, pensez à quelque chose comme superviser ou plus sophistiqué monit.
monit
?Si vous en utilisant cpanel u devrait ajouter ce genre:
La méthode que vous utilisez est bien, si vous ne voulez pas utiliser les tâches cron ou quoi que ce soit d'extérieur, mais il peut être lourd à vérifier à chaque fois qu'une page se charge.
Au premier abord, certaines tâches cron peut probablement être remplacé. Par exemple, si vous avez un compteur pour savoir combien d'utilisateurs se sont inscrits sur votre site web, vous pouvez simplement mettre à jour ce numéro lorsqu'un utilisateur s'inscrit, de sorte que vous n'avez pas à utiliser une tâche cron ou de toute tâche planifiée pour cette.
Si vous souhaitez utiliser les tâches planifiées, je vous suggère d'utiliser la méthode que vous utilisez actuellement, mais avec un peu de modification. Si vous êtes site a assez de visites sur une journée, vous pouvez tout simplement faire les tâches à exécuter (ou les tâches de la fonction de contrôle exécuter) seulement pour 1% ou peut-être 0,01% de la frappe au lieu de tous, le pourcentage que vous devez utiliser dépend de la page de hits que vous avez et combien de fois vous voulez exécuter la tâche. Donc, il suffit d'ajouter un ordre aléatoire pour obtenir cette fonctionnalité.
Vous pouvez simplement utiliser une fonction comme ceci;
Espère que cette aide,
J'envisage d'externaliser les tâches cron avec http://www.guardiano.pm et d'appeler une url de toutes les X minutes. Lors de votre url (j'.e http://www.yoursite.com/dothis.php) est appelée que vous exécuter du code. Si vous ne voulez pas laisser le web à la demande de la page quand vous le souhaitez, vous pouvez autoriser uniquement la demande dans le POST et envoyer un certain nombre de paramètres que vous seul connaissez avec guardiano.pm
C'est ce que je ferais parce que je n'ai que sur mon animal de compagnie projets. Amusez-vous!
PHP en ligne de commande + cron serait la façon dont je voudrais aller. C'est simple et doit s'adapter à la facture. Il est généralement installé avec PHP comme une question de cours.
Si vous n'avez pas la possibilité de configurer une tâche cron, vous pouvez appeler le script avec cUrl (comme alternative à wget - mêmes fonctionnalités). Il suffit de faire une tâche planifiée sur votre ordinateur local qui exécute la boucle de la fonction.
Si vous voulez quelque chose de plus abstrait, vous pourriez envisager d'utiliser quelque chose comme un PHP planificateur.
Par exemple:
Et aussi, pour analyser l'expression cron, vous pouvez utiliser une bibliothèque existante comme https://github.com/mtdowling/cron-expression. Il fournit un grand nombre de méthodes utiles pour vous aider à comprendre les informations d'une tâche cron.
Espère que ça aide.