46 votes

Passer des paramètres $_GET à un job cron

Je suis novice en matière de tâches cron et je ne suis pas sûr que cela fonctionnerait.

Pour des raisons de sécurité, j'ai pensé à créer une page script qui recherche certaines valeurs GET (un nom d'utilisateur, un mot de passe et un code de sécurité) pour s'assurer que seuls l'ordinateur et quelqu'un qui connaît ces trois éléments peuvent exécuter la commande.

J'ai créé le script et il fonctionne dans un navigateur, mais est-il possible d'exécuter le job cron avec des valeurs GET ?

Par exemple, je peux courir

* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

Est-ce possible ?

10voto

golabs Points 65

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 :

  1. Je peux déclencher la mise à jour à la fois manuellement et via le cronjob.
  2. 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 :)

6voto

Ambarish Points 119
* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

Cela ne fonctionnera pas

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234

Cela fonctionne

Vous devez également utiliser la fonction parse_str() et obtenir la valeur

$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

2voto

ZnArK Points 1513

T

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234

2voto

Mike Mackintosh Points 7465

Vous devriez examiner la get_opt() ou $argv fonction.

1voto

Marco Marsala Points 128

username=test&password=test&code=1234

deviendra :

php -r "$_GET["username"]="test"; $_GET["password"]="test"; $_GET["code"]="1234"; include "wp-cron.php";'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X