Я новичок в заданиях 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
Это не прямой ответ на ваш вопрос, но, на мой взгляд, лучшее решение:
Если вы хотите, чтобы никто, кроме cron, не запускал скрипт, просто поместите его вне web-root. Таким образом, не будет никакого доступа через веб-сервер вообще.
Если вам нужно запускать команду и от имени специального пользователя, не используйте GET
, а пусть пользователь войдет в систему и проверит наличие зарегистрированной сессии (определенная переменная сессии...) и включит скрипт только в эту страницу.
Ваш общедоступный скрипт будет выглядеть примерно так:
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
Я понимаю, что этот пост уже несколько лет, но это помогло мне больше всего, так что позвольте мне поделиться своими находками, а также помогать другим тоже.
Я'м с помощью 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
так:
Я нашел следующее решение, которое мы хотим выполнить, когда $массива 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;
}
}
Надеюсь, что это тоже помогает :)
Я найти его полезно использовать функцию использования 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)
}
Дополнительные функции и различные параметры взглянуть на полную документацию.
имя=тест&ампер;пароль=тест&код=1234
стал:
РНР -Р " и переменная$_GET["по имени", У]=с"тест" у; переменная $_GET["и пароль", У]=с"тест" у; переменная $_GET [фильм"код" и]=и"1234" у; включать "и РГ-хрон.РНР и";'