Passer les parameters $ _GET à cron job

Je suis nouveau chez cron jobs et je ne suis pas sûr que cela fonctionnerait.

Pour des raisons de sécurité, j’ai pensé créer un script d’une page qui recherchait certaines valeurs GET (un nom d’utilisateur, un mot de passe et un code de sécurité) pour s’assurer que seul l’ordinateur et quelqu’un connaissant tous les 3 pouvaient exécuter la commande.

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

un exemple serait moi en cours d’exécution

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

Est-ce possible?

Les tableaux associatifs $_GET[] & $_POST[] ne sont initialisés que lorsque votre script est appelé via un serveur Web. Lorsqu’il est appelé via la ligne de commande, les parameters sont passés dans le tableau $argv , tout comme C.

Contient un tableau de tous les arguments transmis au script lors de l’exécution à partir de la ligne de commande.

Votre commande serait:

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

Vous utiliseriez alors parse_str () pour définir et accéder aux parameters:

  ssortingng(27) "/path_to_script/cronjob.php" [1]=> ssortingng(13) "username=test" [2]=> ssortingng(13) "password=test" [3]=> ssortingng(9) "code=1234" } */ parse_str($argv[3], $params); echo $params['code']; // 1234 

Pas une réponse directe à votre question mais une meilleure solution je pense:

Si vous ne voulez pas que cron exécute le script, placez-le simplement en dehors de la racine Web. De cette façon, il n’ya aucun access via le serveur Web.

Si vous devez également exécuter la commande en tant qu’utilisateur spécial, n’utilisez pas GET mais disposez d’un identifiant utilisateur et recherchez une session connectée (une certaine variable de session définie …) et incluez le script dans cette page. seulement.

Votre script accessible au public ressemblerait à quelque chose comme:

 session_start(); if (isset($_SESSION['user'])) { include '/path/to/script/outside/of/web-root'; } else { die('No access.'); } 
 * 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 marche

En outre, vous devez utiliser la fonction parse_str () et obtenir une valeur

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

Vous devriez regarder dans la fonction get_opt () ou $ argv .

Cela fonctionnera:

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

Je trouve utile d’utiliser la fonction getopt() lorsque j’ai besoin de parameters depuis une commande cron ou une commande console.

Cette fonction retournera un tableau de paires option / argument, ou FALSE si une erreur survient.

Les exemples suivants ont été directement extraits de la documentation de PHP.

 $options = getopt("f:hp:"); var_dump($options); shell> php example.php -fvalue -h 

L’exemple ci-dessus affichera:

 array(2) { ["f"]=> ssortingng(5) "value" ["h"]=> bool(false) } 

Pour plus d’options et différents parameters, consultez la documentation complète.

Ressources

  • getopt () – Documentation PHP

Je me rends compte que ce post a déjà plusieurs années mais celui-ci m’a le plus aidé, alors permettez-moi de partager mes découvertes aussi pour aider les autres.

J’utilise DirectAdmin et mes exemples cron fonctionnent les deux. J’ai supprimé mon adresse e-mail de ‘Envoyer tous les messages Cron à E-Mail’ pour ne pas recevoir de notifications par courrier électronique de mes tâches cron.

J’ai commencé avec une demande cURL qui s’exécute toutes les 20 minutes:

 */20 * * * * /usr/local/bin/curl --silent 'https://demo.tld/app/stats/?update&key=1234' 

S’il vous plaît noter le «autour de l’URL, sinon vous ne pouvez pas append plusieurs parameters!

J’utilise cette page comme un moyen inspiré de l’API pour déclencher la mise à jour de certaines statistiques que je collectionne à partir d’un autre site Web et que d’autres peuvent récupérer sous forme JSON à partir de la mienne. Le paramètre ‘update’ déclenche le processus de mise à jour et le paramètre ‘key’, une fois validé, déclenchera des actions de mise à jour supplémentaires que je ne souhaite effectuer que lorsque le job cron demande la mise à jour.

Comme ci-dessus cronjob consum essentiellement de la bande passante dans les deux sens, je voulais opter pour un cronjob basé sur PHP, mais j’ai rencontré un problème avec les parameters … alors j’ai trouvé ce post qui a sauvé ma journée 🙂

 */20 * * * * /usr/local/bin/php /home/path/to/public_html/app/stats/index.php update key=1234 

Comme vous pouvez le voir, le nom de fichier (index.php) est maintenant inclus dans le chemin, puis les parameters suivent (sans les? Et & s).

De cette façon, vous obtenez le fonctionnement de cronjob MAIS vous n’êtes qu’à mi-chemin puisque les parameters ne seront pas transmis via $_GET … ce qui est un peu agaçant lorsque vous avez codé votre script avec des vérifications pour les clés $_GET !

Alors, comment ça marche alors? Simple (du moins après quelques recherches), le cronjob transmet les parameters au script via une variable nommée $argv .

Donc, avec cette connaissance, j’ai cherché une méthode pour transformer le $argv en $_GET pour:

  1. Je peux déclencher la mise à jour manuellement et via le cronjob.
  2. Je n’ai pas eu à réécrire tout mon script.

J’ai trouvé la solution suivante que nous voulons seulement exécuter lorsque $argv est réellement défini, donc je l’ai if isset dans la if isset :

 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 ça va t’aider aussi 🙂

username=test&password=test&code=1234

deviendra:

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