PHP передает $ _GET в командной строке Linux


125

Скажем, мы обычно получаем доступ через

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

Спасибо!

Ответы:


122

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


1
Стоит отметить, что на нашей машине Centos 6, на которой запущен PHP 5.3, при вызове php [script name] "a=1&b=2&c=3"не будет заполняться $_SERVER['QUERY_STRING'], но вы можете легко повлиять на то же самое, указав $_SERVER['argv'][1].
— Эрик Л.

4
Попробуйте этот ответ, чтобы заполнить строку запроса из командной строки без изменения сценария PHP.
— qris

Это не лучший ответ. См. Другой ответ на этой странице: stackoverflow.com/a/11965479/543738
— LS

Полезный ответ, хотя, если, как и я, вам интересно, что это за двоеточия после имен аргументов getopt(), это, по-видимому, говорит PHP, что вам нужен аргумент f , а не опция f (которая будет указана без двоеточия). Так что это просто синтаксис.
— Митя

Мне очень нравится последний ответ, и вчера я его использовал. Его тоже можно превратить в сценарий.
— Reinierpost

239

Из этого ответа на 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

10
+1 и +1: этот ответ должен был быть принятым. Намного меньше хлопот! Нет необходимости менять источник php.
— micha 07

2
Отлично, это можно легко обернуть в любой сценарий, зависящий от ОС.
— Себастьян

2
+1, отличное решение, в настоящее время я создаю резервную копию всех своих сценариев CLI, чтобы поддержать это;)
— ehime

Единственный недостаток, который я видел до сих пор, заключается в том, что вывод терминала - это HTML с <br />, а не просто \ n. Это также относится ко всем уведомлениям и ошибкам, например<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
— bafromca

+1 Замечательно, это работает в обычном скрипте $ _GET Value For Ex как: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething Работает хорошо ..
— Аджмал Правин

16

У меня нет двоичного файла 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>
Вы устанавливаете foo равным 123.
</ Html>

% cat test1.php
<html> Вы установили для foo значение <? php print $ _GET ['foo']?>. </html>

Похоже на php-способ исправить штат.
— FelikZ 06

14

Иногда у вас нет возможности отредактировать файл php, чтобы установить $ _GET на переданные параметры, а иногда вы не можете или не хотите устанавливать php-cgi.

Я считаю, что это лучшее решение для этого случая:

php -r '$_GET["key"]="value"; require_once("script.php");' 

Это позволяет избежать изменения вашего файла php и позволяет использовать простую команду php. Если у вас установлен php-cgi, обязательно используйте его, но это лучший вариант. Думал, что этот вариант заслуживает упоминания

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

Стоит отметить, что вы должны запускать это в правильной папке, часто, но не всегда, в папке, в которой находится php-файл. Операторы Requires будут использовать местоположение вашей команды для разрешения относительных URL-адресов, а НЕ местоположение файла.


1
Я хочу поблагодарить вас за это решение. На мой взгляд, это должен быть принятый ответ. Вам не нужно устанавливать дополнительную библиотеку, чтобы использовать ее.
— swordsecurity

Это лучше, чем принятый ответ. Проголосуйте за вас!
— faraday703

потрясающее и простое решение!
— derRobert

Отличный ответ. Вам просто не хватает конечной цитаты в коде :)
— Педро Араухо Хорхе,

10
php file_name.php var1 var2 varN

Затем установите $_GETпеременные в первой строке PHP, хотя это нежелательный способ установки $_GETпеременной, и вы можете столкнуться с проблемами в зависимости от того, что вы делаете позже с этой переменной.

if (isset($argv[1])) {
   $_GET['variable_name'] = $argv[1];
}

переменные, с которыми вы запускаете скрипт, будут доступны из $argvмассива в вашем приложении PHP. первая запись будет именем сценария, из которого они произошли, поэтому вы можете сделать это, array_shift($argv)чтобы удалить эту первую запись, если вы хотите обработать кучу переменных. Или просто загрузите в локальную переменную.


самое легкое и простое решение
— Жуан Пиментел Феррейра

9

Попробуйте использовать WGET:

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

1
Вы хотите заключить URL-адрес в одинарные кавычки, например? и & в части запроса - это метасимволы оболочки (одинарный подстановочный знак + «запустить эту команду в фоновом режиме»).
— Marc B

7
Это будет работать, но требует работающего веб-сервера и делает весь процесс немного более неэффективным, чем требуется.
— Брэд

Это так, но обычно $_GETподразумевает работающий веб-сервер.
— quickshiftin

6

- Вариант 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"];

2

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

php -a

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

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

Это вручную установит любые переменные, которые вы хотите, а затем запустит ваш php-файл с этими установленными переменными.


1

Если у вас есть возможность редактировать 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'
    }
}

1

В командной строке вставьте следующее

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";'

0

Я просто передаю их так:

php5 script.php param1=blabla param2=yadayada

работает нормально, массив $ _GET:

array(3) {
  ["script_php"]=>
  string(0) ""
  ["param1"]=>
  string(6) "blabla"
  ["param2"]=>
  string(8) "yadayada"
}

только что узнал, что это работает на моем сервере хостинга, но не на моем локальном сервере, причудливый.
— Asaf

Может разница в установленной версии? На какой версии у вас это сработало, а в какой - нет?
— Kzqai

php 5.2 на хостинге работает, 5.3 локально нет ... неважно, я сделал это способом $ argv на всякий случай, если $ _GET пуст
— Асаф

-1

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'


-2

или просто (если у вас LYNX):

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

3
Это не запускает PHP из командной строки. Это запускает браузер, который вызывает веб-сервер через командную строку.
— Андреа Лаццаротто
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.