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? Сомневаюсь, что это сработает.

Спасибо!

Как правило, для передачи аргументов в сценарий командной строки вы будете использовать либо глобальную переменную 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 .

Из этого ответа на ServerFault :

Используйте двоичный файл 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);  включают ($ argv [1]); '"' -"
 % php-cgi test1.php foo = 123
 <HTML>
 Вы устанавливаете foo на 123.
 </ Html>

 % cat test1.php
 <html> Вы устанавливаете foo в <? 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-файла и позволяет использовать команду plain php. Если у вас установлен php-cgi, обязательно используйте это, но это самое лучшее. Думал, что этот вариант заслуживает упоминания

-r означает запустить php-код в следующей строке. вы вручную устанавливаете значение $ _GET, а затем ссылаетесь на файл, который хотите запустить.

Стоит отметить, что вы должны запускать это в правой папке, часто, но не всегда в папке, где находится php-файл. Требуется, чтобы инструкции использовали местоположение вашей команды для разрешения относительных 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"]; 

Если у вас есть возможность редактировать скрипт 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&param2=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";' 

Если вам нужно передать $ _GET, $ _REQUEST, $ _POST или что-нибудь еще, вы также можете использовать интерактивный режим PHP:

 php -a 

Затем введите:

 <?php $_GET['a']=1; $_POST['b']=2; include("/somefolder/some_file_path.php"); 

Это вручную установит любые нужные вам переменные, а затем запустит ваш 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):

 lynx 'http://localhost/index.php?a=1&b=2&c=3'