Скажем, мы обычно получаем доступ через
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¶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";'
Если вам нужно передать $ _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'