Передача параметров $_GET для задания cron
Я новичок в работе cron, и не уверен, будет ли это работать.
В целях безопасности я подумал о создании одной страницы script, которая ищет определенные значения GET (имя пользователя, пароль и код безопасности), чтобы убедиться, что только компьютер и кто-то, кто знает все 3, могут запускать команда.
Я сделал script, и он запускает его в браузере, но можно ли запустить задание cron с значениями GET?
В качестве примера можно привести запуск
* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234
Возможно ли это?
Ответы
Ответ 1
Ассоциативные массивы $_GET[]
и $_POST[]
инициализируются только тогда, когда ваш script вызывается через веб-сервер. При вызове через командную строку параметры передаются в массиве $argv
, как и C.
Содержит массив всех аргументов, переданных в script, когда выполняется из командной строки.
Ваша команда:
* 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
Ответ 2
Не прямой ответ на ваш вопрос, но лучшее решение, которое я думаю:
Если вы хотите, чтобы кто-либо, кроме cron, запускал script, просто разместил его вне веб-корня. Таким образом, доступ к веб-серверу вообще отсутствует.
Если вам также нужно запустить команду как специальный пользователь, не используйте GET
, но войдите в систему и проверьте вход в систему (определенную переменную сеанса сеанса...) и включите script только на этой странице.
Ваш общедоступный script будет выглядеть примерно так:
session_start();
if (isset($_SESSION['user']))
{
include '/path/to/script/outside/of/web-root';
}
else
{
die('No access.');
}
Ответ 3
* 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
Ответ 4
Вы должны изучить get_opt() или $argv.
Ответ 5
Это будет работать:
* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
Ответ 6
Я понимаю, что этой должности уже несколько лет, но это помогло мне больше всего, поэтому позвольте мне поделиться своими выводами, а также помочь другим.
Я использую DirectAdmin, и мои примеры cron работают как. Я удалил свой адрес электронной почты из "Отправить все результаты Cron в E-Mail", поэтому я не получаю уведомления по электронной почте о своих cronjobs.
Я начал с запроса 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) теперь включено в путь, а затем параметры следуют (без? и &).
Таким образом, вы получаете работу cronjob, но вы только наполовину, так как параметры не будут передаваться через $_GET
... что немного раздражает, когда вы закодировали свой script с проверками на $_GET
ключи
Итак, как это работает? Простой (по крайней мере, после некоторых исследований), cronjob передает параметры script с помощью переменной с именем $argv
.
Итак, с помощью этого знания я искал метод преобразования $argv
в $_GET
так:
- Я могу запустить обновление как вручную, так и через cronjob.
- Мне не пришлось переписывать весь мой script.
Я нашел следующее решение, которое мы хотим выполнить только тогда, когда $argv
действительно установлено, поэтому я завернул его в проверку 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;
}
}
Надеюсь, это вам тоже поможет:)
Ответ 7
Мне полезно использовать функцию 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)
}
Для получения дополнительных параметров и различных параметров просмотрите полную документацию.
Ресурсы
Ответ 8
username=test&password=test&code=1234
станет:
php -r "$_GET["username"]="test"; $_GET["password"]="test"; $_GET["code"]="1234"; include "wp-cron.php";'