Подтвердить что ты не робот

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

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

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

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

В качестве примера можно привести запуск

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

Возможно ли это?

4b9b3361

Ответ 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";'