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.