Передать переменную PHP скрипт, запущенную из командной строки
У меня есть файл PHP, который необходимо запустить из командной строки (через crontab). Мне нужно передать type=daily
в файл, но я не знаю, как это сделать. Я пробовал:
php myfile.php?type=daily
но эта ошибка была возвращена:
Не удалось открыть входной файл: myfile.php? type = daily
Что я могу сделать?
Ответы
Ответ 1
Аргумент ?type=daily
(заканчивающийся в массиве $_GET
) действителен только для страниц с веб-доступом.
Вам нужно вызвать его как php myfile.php daily
и извлечь этот аргумент из массива $argv
(который будет $argv[1]
, так как $argv[0]
будет myfile.php
).
Если страница используется как веб-страница, есть два варианта, которые вы могли бы рассмотреть. Либо доступ к нему с оболочкой script, так и wget и вызов из cron:
#!/bin/sh
wget http://location.to/myfile.php?type=daily
Или проверьте файл php, вызвал ли он из командной строки или нет:
if (defined('STDIN')) {
$type = $argv[1];
} else {
$type = $_GET['type'];
}
(Примечание: вам, вероятно, понадобится/хотите проверить, действительно ли $argv
содержит достаточно переменных и т.д.)
Ответ 2
Просто передайте его как обычные параметры и получите доступ к нему в PHP с помощью массива $argv
.
php myfile.php daily
и в myfile.php
$type = $argv[1];
Ответ 3
Эти строки преобразуют аргументы вызова 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 для деталей.
Ответ 4
Используя функцию getopt(), мы также можем прочитать параметр из командной строки, просто передав значение с помощью команды запуска php
php abc.php --name = xyz
abc.php
$val = getopt(null, ["name:"]);
print_r($val); // output: ['name' => 'xyz'];
Ответ 5
параметры отправляются по индексу, как и другие приложения
php myfile.php type=daily
а затем вы можете использовать их как
<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
echo $arg;
?>
Ответ 6
Сохраните этот код в файле 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
.
Ответ 7
Я настоятельно рекомендую использовать getopt.
Документация на http://php.net/manual/en/function.getopt.php
Если вы хотите распечатать справку для своих опций, чем взглянуть на https://github.com/c9s/GetOptionKit#general-command-interface
Ответ 8
Вы можете использовать следующий код для работы с командной строкой и веб-браузером. Поместите этот код выше вашего PHP-кода. Он создает переменную $ _GET для каждого параметра командной строки.
В вашем коде вам нужно только проверять переменные $ _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;
}
Ответ 9
Вы можете использовать то, что 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')
.
Ответ 10
<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
echo $arg;
?>
Этот код не должен использоваться. Прежде всего, CLI называется:/usr/bin/php phpscript.php будет иметь одно значение argv, которое является именем script
array(2) {
[0]=>
string(13) "phpscript.php"
}
Это всегда будет выполняться, так как будет иметь 1 или 2 аргумента passe
Ответ 11
Просто передайте его в качестве параметров следующим образом:
php test.php one two three
и внутри test.php:
<?php
if(isset($argv))
{
foreach ($argv as $arg)
{
echo $arg;
echo "\r\n";
}
}
?>
Ответ 12
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
Ответ 13
Существует 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
, потому что:
Options Синтаксический анализ параметров завершится при первой найденной опции, все, что следует, отбрасывается.
26 Всего 26 параметров в алфавите.
Метод 3: Глобальнаяпеременная Bash
P9="xptdr" ./script
// getenv("P9") = "xptdr"
// $_SERVER["P9"] = "xptdr"
Эти переменные могут использоваться другими программами, работающими в той же оболочке.
Они выдуваются, когда оболочка закрыта, но не когда программа php завершена. Мы можем установить их постоянными в ~/.bashrc
!
Метод 4: STDIN pipe и stream_get_contents()
Некоторые примеры pipeопроводов:
./script <<< "hello wo8844rld"
// stream_get_contents(STDIN) = "hello wo8844rld"
echo "hello wo8844rld" | ./script
// explode(" ",stream_get_contents(STDIN)) ...
./script < ~/folder/Special_params.txt
// explode("\n",stream_get_contents(STDIN)) ...
echo params.json | ./script
// json_decode(stream_get_contents(STDIN)) ...
Мы можем передавать очень длинные строки, массивы, json, файл конфигурации, содержащий строки параметров, это мощно.
Он может работать аналогично fread() или fgets(), читая STDIN.
Руководство по написанию сценариев