Я новичок в работе 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) }
Для получения дополнительных параметров и различных параметров просмотрите полную документацию.
Я понимаю, что этому посту уже несколько лет, но этот помог мне больше всего, поэтому позвольте мне поделиться своими выводами, а также помочь другим.
Я использую 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
поэтому:
Я нашел следующее решение, которое мы хотим выполнить только при установке $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";'