Je suis nouveau à cron jobs et je ne sais pas si cela fonctionnerait.
Pour des raisons de sécurité, j'ai pensé à créer un script d'une page qui recherche certaines valeurs GET (un nom d'utilisateur, un mot de passe et un code de sécurité) pour m'assurer que seuls l'ordinateur et quelqu'un qui connaît les 3 peuvent exécuter la commande.
J'ai fait le script et cela fonctionne en l'exécutant dans un navigateur, mais est-il possible d'exécuter le travail cron avec des valeurs GET?
un exemple serait moi courir
* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234
Est-ce possible?
Le $_GET[]
& $_POST[]
les tableaux associatifs ne sont initialisés que lorsque votre script est appelé via un serveur Web. Lorsqu'ils sont appelés via la ligne de commande, les paramètres sont passés dans $argv
tableau, tout comme C.
Contient un tableau de tous les arguments passés 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 paramètres:
<?php
var_dump($argv);
/*
array(4) {
[0]=>
string(27) "/path_to_script/cronjob.php"
[1]=>
string(13) "username=test"
[2]=>
string(13) "password=test"
[3]=>
string(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 que personne, à l'exception de cron, exécute le script, placez-le simplement en dehors de la racine Web. De cette façon, il n'y a aucun accès via le serveur Web.
Si vous devez également exécuter la commande en tant qu'utilisateur spécial, n'utilisez pas GET
mais ayez une connexion utilisateur et recherchez une session connectée (une certaine variable de session définie ...) et incluez le script dans cette page uniquement.
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
De plus, vous devez utiliser la fonction parse_str () et obtenir de 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
Je me rends compte que ce poste 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 aussi.
J'utilise DirectAdmin et mes exemples cron fonctionnent tous les deux. J'ai supprimé mon adresse e-mail de "Envoyer tous les résultats de Cron vers E-Mail" afin de ne pas recevoir de notifications par e-mail de mes cronjobs.
J'ai commencé avec 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 pouvez 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 à partir d'un autre site Web et que d'autres peuvent récupérer sous forme JSON à partir de la mienne. Le paramètre "mise à jour" déclenche le processus de mise à jour et le paramètre "clé" déclenche, une fois validé, des actions de mise à jour supplémentaires que je souhaite uniquement effectuer lorsque le cronjob demande la mise à jour.
Étant donné que le cronjob ci-dessus consomme essentiellement de la bande passante dans les deux directions, je voulais opter pour un cronjob basé sur PHP, mais j'ai rencontré un problème avec les paramètres ... c'est donc quand j'ai trouvé ce message qui a sauvé mon 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 paramètres suivent (sans les? Et &).
De cette façon, vous obtenez le travail cronjob MAIS vous n'êtes qu'à mi-chemin puisque les paramètres ne seront pas transmis via $_GET
... ce qui est un peu ennuyeux lorsque vous avez codé votre script avec des vérifications pour $_GET
clés!
Alors, comment ça marche alors? Simple (au moins après quelques recherches), le cronjob passe les paramètres au script via une variable nommée $argv
.
Donc, avec cette connaissance, j'ai cherché une méthode pour transformer le $argv
en $_GET
donc:
J'ai trouvé la solution suivante que nous voulons uniquement exécuter lorsque $argv
est en fait défini, donc je l'ai enveloppé dans le 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 ça va t'aider aussi :)
Vous devriez regarder dans la fonction get_opt () ou $ argv .
Je trouve utile d'utiliser la fonction getopt()
lorsque j'ai besoin de paramètres à partir d'une commande cron ou d'une console.
Cette fonction retournera un tableau de paires option/argument, ou FALSE en cas d'échec.
Les exemples suivants sont directement tirés de la documentation PHP.
$options = getopt("f:hp:");
var_dump($options);
Shell> php example.php -fvalue -h
L'exemple ci-dessus affichera:
array(2) {
["f"]=>
string(5) "value"
["h"]=>
bool(false)
}
Pour plus d'options et de paramètres différents, consultez la documentation complète.
Cela fonctionnera:
* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
username=test&password=test&code=1234
deviendra:
php -r "$_GET["username"]="test"; $_GET["password"]="test"; $_GET["code"]="1234"; include "wp-cron.php";'