Передайте переменную в php скрипт, запущенный из командной строки
У меня есть файл PHP, который необходимо запустить из командной строки (через crontab). Мне нужно пройти type=daily
в файл, но я не знаю как. Я старался:
php myfile.php?type=daily
но эта ошибка была возвращена:
Не удалось открыть входной файл: myfile.php? Type=daily
Что я могу сделать?
15 ответов
?type=daily
аргумент (заканчивая в $_GET
массив) действителен только для веб-страниц.
Вам нужно будет назвать это как php myfile.php daily
и получить этот аргумент из $argv
массив (который будет $argv[1]
, поскольку $argv[0]
было бы myfile.php
).
Если страница также используется в качестве веб-страницы, вы можете рассмотреть два варианта. Либо обращайтесь к нему с помощью сценария оболочки и wget и вызывайте его из cron:
#!/bin/sh
wget http://location.to/myfile.php?type=daily
Или проверьте в файле php, вызывается ли он из командной строки или нет:
if (defined('STDIN')) {
$type = $argv[1];
} else {
$type = $_GET['type'];
}
(Примечание: вам, вероятно, понадобится / хотите проверить, $argv
на самом деле содержит достаточно переменных и тому подобное)
Просто передайте его как обычные параметры и получите доступ к нему в PHP, используя $argv
массив.
php myfile.php daily
и в myfile.php
$type = $argv[1];
Эти строки преобразуют аргументы вызова CLI, такие как php myfile.php "type=daily&foo=bar"
в хорошо известный $_GET
-array:
if (!empty($argv[1])) {
parse_str($argv[1], $_GET);
}
Хотя это довольно грязно, чтобы переписать глобальный $_GET
-array, он быстро конвертирует все ваши скрипты для принятия аргументов CLI.
См. http://php.net/manual/en/function.parse-str.php для получения подробной информации.
Используя функцию getopt(), мы также можем прочитать параметр из командной строки, просто передав значение с помощью команды php running
php abc.php --name = xyz
abc.php
$ val = getopt (null, ["name:"]);
print_r ($ Вэл);
о / р:-
массив (
'name' => 'xyz',)
Параметры отправляются по индексу, как и другие приложения
php myfile.php type=daily
и тогда вы можете получить их, как это
<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
echo $arg;
?>
Сохранить этот код в файле myfile.php
и беги как php myfile.php type=daily
<?php
$a = $argv;
$b = array();
if (count($a) == 1) exit;
foreach ($a as $key => $arg){
if ($key > 0){
list($x,$y) = explode('=', $arg);
$b["$x"] = $y;
}
}
?>
Если вы добавите var_dump($b);
перед ?>
тег, вы увидите, что массив $b
содержит type => daily
,
Чтобы использовать $_GET, вам не нужна поддержка как из командной строки, так и из веб-браузера.
if(isset($argv))
foreach ($argv as $arg) {
$e=explode("=",$arg);
if(count($e)==2)
$_GET[$e[0]]=$e[1];
else
$_GET[$e[0]]=0;
}
Вы можете использовать то, что рекомендует sep16 на php.net:
<?php
parse_str(implode('&', array_slice($argv, 1)), $_GET);
?>
Он ведет себя точно так же, как вы ожидаете от cgi-php.
$ php -f myfile.php type=daily a=1 b[]=2 b[]=3
установит $_GET['type']
в 'daily'
, $_GET['a']
в '1'
а также $_GET['b']
в array('2', '3')
,
<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
echo $arg;
?>
Этот код не должен использоваться. Прежде всего, CLI, вызываемый как: /usr/bin/php phpscript.php будет иметь одно значение argv, которое является именем скрипта
array(2) {
[0]=>
string(13) "phpscript.php"
}
Этот всегда будет выполняться, так как будет иметь 1 или 2 аргументов
Я настоятельно рекомендую использовать getopt.
Документация на http://php.net/manual/en/function.getopt.php
Если вы хотите, чтобы справка распечатала ваши варианты, взгляните на https://github.com/c9s/GetOptionKit
Просто передайте его как параметры следующим образом:
php test.php one two three
и внутри test.php:
<?php
if(isset($argv))
{
foreach ($argv as $arg)
{
echo $arg;
echo "\r\n";
}
}
?>
Есть 4 основных альтернативы, у обеих есть свои особенности. На мой взгляд, у метода 4 много преимуществ.
./script
является сценарий оболочки, начиная от#!/usr/bin/php
Метод 1: $argv
./script hello wo8844rld
// $argv[0] = "script", $argv[1] = "hello", $argv[2] = "wo8844rld"
⚠️ При использовании $argv порядок параметров имеет решающее значение.
Метод 2: getopt ()
./script -p7 -e3
// getopt("p::")["p"] = "7", getopt("e::")["e"] = "3"
Трудно использовать вместе с $argv
, потому как:
⚠️ Анализ опций завершится на первом найденном не опционе, все последующее отбрасывается.
⚠️ Всего 26 параметров в алфавитном порядке.
Метод 3: глобальная переменная Bash
P9="xptdr" ./script
// getenv("P9") = "xptdr"
// $_SERVER["P9"] = "xptdr"
Эти переменные могут использоваться другими программами, работающими в той же оболочке.
Они срабатывают при закрытии оболочки, но не при завершении программы php. Мы можем установить их навсегда~/.bashrc
!
Метод 4: канал STDIN и stream_get_contents()
Некоторые примеры трубопроводов:
Подайте строку:
./script <<< "hello wo8844rld"
// stream_get_contents(STDIN) = "hello wo8844rld"
Подайте строку с помощью bash echo:
echo "hello wo8844rld" | ./script
// explode(" ",stream_get_contents(STDIN)) ...
Загрузите содержимое файла:
./script < ~/folder/Special_params.txt
// explode("\n",stream_get_contents(STDIN)) ...
Загрузите массив значений:
./script <<< '["array entry","lol"]'
// var_dump( json_decode(trim(stream_get_contents(STDIN))) );
Загрузите json из файла:
echo params.json | ./script
// json_decode(stream_get_contents(STDIN)) ...
Он может работать аналогично fread() или fgets(), читая STDIN.
if (isset($argv) && is_array($argv)) {
$param = array();
for ($x=1; $x<sizeof($argv);$x++) {
$pattern = '#\/(.+)=(.+)#i';
if (preg_match($pattern, $argv[$x])) {
$key = preg_replace($pattern, '$1', $argv[$x]);
$val = preg_replace($pattern, '$2', $argv[$x]);
$_REQUEST[$key] = $val;
$$key = $val;
}
}
}
Я помещаю параметры в $ _REQUEST
$ _REQUEST [$ key] = $ val;
а также можно использовать напрямую
$$ ключ = $ Вэл
используйте это так:
myFile.php / key = val
Чтобы обойти сложность перехода к файлу, похоже, вы можете использовать sed для вставки строки непосредственно в файл php.
sed -i "i (обратная косая черта) type=dayly myfile.php
or as I use it with variables:
sed -i "i (обратная косая черта)$type = "(обратная косая черта)"${ежедневно}(обратная косая черта)"(обратная косая черта); ${путь}"/myfile.php"
Я нашел этот vanilla/garden-cli на гитхабе. Я думаю, что он отвечает всем требованиям PHP CLI.