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

Я новичок в заданиях cron и не уверен, что это сработает.

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

Я создал скрипт, и он работает, запуская его в браузере, но можно ли запустить задание 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
Комментарии (1)

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

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

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

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

session_start();

if (isset($_SESSION['user']))
{
  include '/path/to/script/outside/of/web-root';
}
else
{
  die('No access.');
}
Комментарии (0)
* 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
Комментарии (1)

Вы должны смотреть на get_opt() или $массива argv Функция.

Комментарии (0)

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

Я'м с помощью DirectAdmin и мои примеры хрон работают оба. Я удалил мой адрес из 'послать все выходные cron для электронной почты' я не'т получать уведомления по электронной почте моей задачи cron.

Я начинала с просьбой завиток, который ходит каждые 20 минут:

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

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

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

Поскольку выше расписанию, в основном потребляет пропускную способность в обоих направлениях я хотел поехать на PHP основан расписанию, но столкнулся с проблемой с параметрами... так вот когда я нашел этот пост, который спас мой день :)

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

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

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

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

Так что знаний я искал способ, чтобы преобразовать $массива argv в параметр $_GET так:

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

Я нашел следующее решение, которое мы хотим выполнить, когда $массива argv на самом деле множество, так что я завернула его в если 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;
    }
}

Надеюсь, что это тоже помогает :)

Комментарии (1)

Это сработает:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
Комментарии (0)

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

эта функция возвращает массив пар параметр / аргумент, или false в случае возникновения ошибки.

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

$options = getopt("f:hp:");
var_dump($options);

shell> php example.php -fvalue -h

Результатом выполнения данного примера будет:

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

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

Ресурсы

Комментарии (0)

имя=тест&ампер;пароль=тест&код=1234

стал:

РНР -Р " и переменная$_GET["по имени", У]=с"тест" у; переменная $_GET["и пароль", У]=с"тест" у; переменная $_GET [фильм"код" и]=и"1234" у; включать "и РГ-хрон.РНР и";&#39;

Комментарии (0)