PHP, передающий $GET в командной строке Linux
Скажем, мы обычно получаем доступ через
http://localhost/index.php?a=1&b=2&c=3
Как мы можем выполнить то же самое в командной строке linux?
php -e index.php
Но как насчет передачи переменных $_GET? Может быть, что-то вроде php-e index.php --a 1 --b 2 --c 3? Сомневаюсь, что это сработает.
Спасибо вам!
13 answers
Как правило, для передачи аргументов сценарию командной строки вы будете использовать либо argv
глобальную переменную, либо getopt:
// bash command:
// php -e myscript.php hello
echo $argv[1]; // prints hello
// bash command:
// php -e myscript.php -f=world
$opts = getopt('f:');
echo $opts['f']; // prints world
$_GET относится к параметрам метода HTTP GET, которые недоступны в командной строке, так как для их заполнения требуется веб-сервер.
Если вы действительно хотите заполнить $_GET в любом случае, вы можете сделать это:
// bash command:
// export QUERY_STRING="var=value&arg=value" ; php -e myscript.php
parse_str($_SERVER['QUERY_STRING'], $_GET);
print_r($_GET);
/* outputs:
Array(
[var] => value
[arg] => value
)
*/
Вы также можете выполнить данный скрипт, заполнить $_GET
из командной строки без необходимости изменять указанный сценарий:
export QUERY_STRING="var=value&arg=value" ; \
php -e -r 'parse_str($_SERVER["QUERY_STRING"], $_GET); include "index.php";'
Обратите внимание, что вы можете сделать то же самое с $_POST
и $_COOKIE
.
Из этого ответа по умолчанию сервера:
Используйте двоичный файл php-cgi
вместо простого php
и передайте аргументы в командной строке, например:
php-cgi -f index.php left=1058 right=1067 class=A language=English
, Который помещает это в $_GET
:
Array
(
[left] => 1058
[right] => 1067
[class] => A
[language] => English
)
Вы также можете задать переменные среды, которые будут установлены веб-сервером, например:
REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
У меня нет двоичного файла php-cgi в Ubuntu, поэтому я сделал это:
% alias php-cgi="php -r '"'parse_str(implode("&", array_slice($argv, 2)), $_GET); include($argv[1]);'"' --" % php-cgi test1.php foo=123 <html> You set foo to 123. </html> %cat test1.php <html>You set foo to <?php print $_GET['foo']?>.</html>
Попробуйте использовать WGET
:
WGET 'http://localhost/index.php?a=1&b=2&c=3'
php file_name.php var1 var2 varN
Затем установите переменные $_GET в первой строке PHP, хотя это не желаемый способ установки переменной $_GET, и у вас могут возникнуть проблемы в зависимости от того, что вы будете делать с этой переменной позже.
if (isset($argv[1])) {
$_GET['variable_name'] = $argv[1];
}
Переменные, с которыми вы запускаете скрипт, будут доступны из массива $argv в вашем php-приложении. первой записью будет имя сценария, из которого они пришли, поэтому вам может потребоваться выполнить array_shift ($argv), чтобы удалить эту первую запись, если вы хотите обработать куча переменных. Или просто загрузите в локальную переменную.
Иногда у вас нет возможности отредактировать php-файл, чтобы установить $_GET в переданные параметры, а иногда вы не можете или не хотите устанавливать php-cgi.
Я нашел, что это лучшее решение для этого случая:
php -r '$_GET["key"]="value"; require_once("script.php");
Это позволяет избежать изменения вашего php-файла и позволяет использовать обычную команду php. Если у вас установлен php-cgi, обязательно используйте его, но это следующая лучшая вещь. Подумал, что этот вариант достоин упоминания
-r означает запуск php-кода в следующей строке. вы устанавливаете значение $_GET вручную, а затем ссылаетесь на файл, который хотите запустить.
Стоит отметить, что вы должны запускать это в нужной папке, часто, но не всегда в папке, в которой находится файл php. Инструкции Require будут использовать местоположение вашей команды для разрешения относительных URL-адресов, а НЕ местоположение файла
-- Вариант 1: php-cgi --
Используйте "php-cgi" вместо "php" для запуска вашего скрипта. Это самый простой способ, так как вам не нужно будет специально изменять свой php-код для работы с ним:
php-cgi -f /my/script/file.php a=1 b=2 c=3
-- Вариант 2: если у вас есть веб-сервер --
Если файл php находится на веб-сервере, вы можете использовать "wget" в командной строке:
wget 'http://localhost/my/script/file.php?a=1&b=2&c=3'
ИЛИ:
wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3"
-- Доступ к переменным в php --
В обоих вариантах 1 и 2 вы получаете доступ к этим параметры, подобные этому:
$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
Если вам нужно передать $_GET, $_REQUEST, $_POST или что-либо еще, вы также можете использовать интерактивный режим PHP:
php -a
Затем введите:
<?php
$_GET['a']=1;
$_POST['b']=2;
include("/somefolder/some_file_path.php");
Это позволит вручную установить любые переменные, которые вы хотите, а затем запустить ваш php-файл с этими переменными.
Если у вас есть возможность редактировать PHP-скрипт, вы можете искусственно заполнить массив $_GET, используя следующий код в начале скрипта, а затем вызвать скрипт с синтаксисом: php -f script.php name1=value1 name2=value2
// When invoking the script via CLI like "php -f script.php name1=value1 name2=value2", this code will populate $_GET variables called "name1" and "name2", so a script designed to be called by a web server will work even when called by CLI
if (php_sapi_name() == "cli") {
for ($c = 1; $c < $argc; $c++) {
$param = explode("=", $argv[$c], 2);
$_GET[$param[0]] = $param[1]; // $_GET['name1'] = 'value1'
}
}
В командной строке вставьте следующий
export QUERY_STRING="param1=abc¶m2=xyz" ;
POST_STRING="name=John&lastname=Doe" ; php -e -r
'parse_str($_SERVER["QUERY_STRING"], $_GET); parse_str($_SERVER["POST_STRING"],
$_POST); include "index.php";'
Я просто передаю их вот так:
php5 script.php param1=blabla param2=yadayada
Работает просто отлично, массив $_GET выглядит так:
array(3) {
["script_php"]=>
string(0) ""
["param1"]=>
string(6) "blabla"
["param2"]=>
string(8) "yadayada"
}
php -r 'parse_str($argv[2],$_GET);include $argv[1];' index.php 'a=1&b=2'
Вы могли бы сделать первую часть в качестве псевдонима:
alias php-get='php -r '\''parse_str($argv[2],$_GET);include $argv[1];'\'
Затем просто используйте:
php-get some_script.php 'a=1&b=2&c=3'
Или просто (если у вас есть РЫСЬ):
lynx 'http://localhost/index.php?a=1&b=2&c=3'