Je sais que cet article date déjà de plusieurs années, mais c'est celui qui m'a le plus aidé, alors permettez-moi de partager mes conclusions pour aider les autres.
J'utilise DirectAdmin et mes exemples de cron fonctionnent tous les deux. J'ai supprimé mon adresse email de l'option 'Send all Cron output to E-Mail' afin de ne pas recevoir de notifications de mes cronjobs par email.
J'ai commencé par une requête cURL qui s'exécute toutes les 20 minutes :
*/20 * * * * /usr/local/bin/curl --silent 'https://demo.tld/app/stats/?update&key=1234'
Veuillez noter le ' ' autour de l'URL, sinon vous ne pourrez pas ajouter plusieurs paramètres !
J'utilise cette page comme un moyen inspiré de l'API pour déclencher la mise à jour de certaines statistiques que je collecte sur un autre site web et que d'autres peuvent récupérer sous forme JSON sur le mien. Le paramètre "update" déclenche le processus de mise à jour et le paramètre "key", lorsqu'il est validé, déclenche des actions de mise à jour supplémentaires qui ne doivent être effectuées que lorsque le cronjob demande la mise à jour.
Comme le cronjob ci-dessus consomme de la bande passante dans les deux sens, j'ai voulu opter pour un cronjob basé sur PHP, mais j'ai rencontré un problème avec les paramètres... c'est alors que j'ai trouvé cet article qui m'a sauvé la mise :)
*/20 * * * * /usr/local/bin/php /home/path/to/public_html/app/stats/index.php update key=1234
Comme vous pouvez le voir, le nom du fichier (index.php) est maintenant inclus dans le chemin et les paramètres suivent (sans les ? et les &).
De cette façon, le cronjob fonctionne MAIS vous ne faites que la moitié du chemin puisque les paramètres ne seront pas transmis par l'intermédiaire de $_GET
... ce qui est un peu ennuyeux lorsque vous avez codé votre script avec des vérifications pour $_GET
clés !
Comment cela fonctionne-t-il alors ? C'est simple (du moins après quelques recherches), le cronjob transmet les paramètres au script via une variable nommée $argv
.
C'est donc avec ces connaissances que j'ai cherché une méthode pour transformer la $argv
en $_GET
donc :
- Je peux déclencher la mise à jour à la fois manuellement et via le cronjob.
- Je n'ai pas eu à réécrire tout mon script.
J'ai trouvé la solution suivante que nous ne voulons exécuter que lorsque $argv
est en fait définie, donc je l'ai enveloppée dans l'élément if isset
vérifier :
if( isset( $argv ) )
{
foreach( $argv as $arg ) {
$e = explode( '=', $arg );
if( count($e) == 2 )
$_GET[$e[0]] = $e[1];
else
$_GET[$e[0]] = 0;
}
}
J'espère que cela vous aidera aussi :)