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 ответов:
как правило, для передачи аргументов в командной строке скрипта, вы будете использовать либо
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 binary на 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>
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, обязательно используйте это, но это следующая лучшая вещь. Думал, что этот вариант достоин упоминания
the-r значит, запустите php-код в следующей строке. вы устанавливаете значение $_GET вручную, а затем ссылаетесь на файл, который хотите запустить.
стоит отметить, что вы должны запустить это в правильной папке, часто, но не всегда в папке, в которой находится файл php. Инструкции Requires будут использовать расположение вашей команды для разрешения относительных URL-адресов, а не Расположение файла
-- Вариант 1: php-cgi --
использовать пхп-цги' на месте 'РНР', чтобы запустить свой скрипт. Это самый простой способ, так как вам не нужно специально изменять свой 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'
Comments