Передача параметров $ _GET для задания cron

Я новичок в работе cron и не знаю, будет ли это работать.

В целях безопасности я подумал о создании сценария с одной страницей, который ищет определенные значения GET (имя пользователя, пароль и код безопасности), чтобы убедиться, что только компьютер и тот, кто знает все 3, могут запустить эту команду.

Я создал скрипт, и он работает в браузере, но можно ли запустить задание cron с значениями GET?

Например, я буду работать

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

Это возможно?

Ассоциативные массивы $_GET[] & $_POST[] инициализируются только тогда, когда ваш скрипт вызывается через веб-сервер. При вызове через командную строку параметры передаются в массиве $argv , как и C.

Содержит массив всех аргументов, переданных скрипту при запуске из командной строки.

Ваша команда будет:

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

Затем вы должны использовать parse_str () для установки и доступа к параметрам:

 <?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 

Не прямой ответ на ваш вопрос, но лучшее решение, я думаю:

Если вы хотите, чтобы кто-либо, кроме cron, запускал скрипт, просто поместите его за пределы веб-корня. Таким образом, доступ к веб-серверу вообще отсутствует.

Если вам нужно также запустить эту команду как специальный пользователь, не используйте GET а войдите в систему и проверьте вход в систему (определенная переменная session session …) и включите скрипт на этой странице только.

Ваш общедоступный скрипт будет выглядеть примерно так:

 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 

Это не будет работать

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

Это работает

Кроме того, вам нужно использовать функцию parse_str () и получить значение

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

Вы должны заглянуть в функцию get_opt () или $ argv .

Это будет работать:

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

Мне полезно использовать функцию getopt() когда мне нужны параметры из команды cron или console.

Эта функция вернет массив пар параметров / аргументов или FALSE при сбое.

Следующие примеры были непосредственно взяты из документации PHP.

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

Вышеприведенный пример выводит:

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

Для получения дополнительных параметров и различных параметров просмотрите полную документацию.

Ресурсы

  • getopt () – документация PHP

Я понимаю, что этому посту уже несколько лет, но этот помог мне больше всего, поэтому позвольте мне поделиться своими выводами, а также помочь другим.

Я использую DirectAdmin, и мои примеры cron работают одновременно. Я удалил свой адрес электронной почты из «Отправить все результаты Cron в E-Mail», поэтому я не получаю уведомления по электронной почте о моих кронах.

Я начал с запроса cURL, который запускается каждые 20 минут:

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

Обратите внимание на «вокруг URL», иначе вы не сможете добавить несколько параметров!

Я использую эту страницу как API, способный инициировать обновление некоторых статистических данных, которые я собираю с другого веб-сайта, и которые другие могут захватить в форме JSON у меня. Параметр «обновление» запускает процесс обновления, а параметр «ключ» при проверке инициирует дополнительные действия по обновлению, которые я хочу сделать только тогда, когда запрос cronjob запрашивает обновление.

Поскольку выше cronjob в основном потребляет полосу пропускания в обоих направлениях, я хотел пойти на PHP cronjob, но столкнулся с проблемой с параметрами … так вот когда я нашел этот пост, который спас мой день 🙂

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

Как вы видите, имя файла (index.php) теперь включено в путь, а затем параметры следуют (без? И & s).

Таким образом, вы получаете работу cronjob, но вы находитесь только наполовину, поскольку параметры не будут передаваться через $_GET … что немного раздражает, когда вы закодировали свой скрипт с проверками ключей $_GET !

Итак, как это работает? Простой (по крайней мере, после некоторого исследования), cronjob передает параметры сценарию через переменную с именем $argv .

Таким образом, с помощью этих знаний я искал метод преобразования $argv в $_GET поэтому:

  1. Я могу запустить обновление как вручную, так и через cronjob.
  2. Мне не пришлось переписывать весь мой сценарий.

Я нашел следующее решение, которое мы хотим выполнить только при установке $argv , поэтому я завернул его в if isset check:

 if( isset( $argv ) ) { foreach( $argv as $arg ) { $e = explode( '=', $arg ); if( count($e) == 2 ) $_GET[$e[0]] = $e[1]; else $_GET[$e[0]] = 0; } } 

Надеюсь, это тебе тоже поможет 🙂

username=test&password=test&code=1234

станет:

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