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

2
Відмінно, це може бути легко обгорнуто будь-яким сценарієм, що залежить від ОС.
Себастьян

2
+1, приголомшливе рішення, я зараз підтримую всі мої сценарії CLI, щоб підтримати це зараз;)
ehime

Єдиним недоліком, який я бачив до цього часу, є те, що вихід терміналу - це HTML з <br />, а не просто \ n. Це стосується також усіх повідомлень та помилок, наприклад,<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca

+1 Приголомшливі, це працює в Normal Script $ _GET Значення для Ex як: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething добре працює ..
Ajmal Praveen

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>

% тест на кішку1.php
<html> Ви встановили foo на <? php print $ _GET ['foo']?>. </html>

Схоже на php-спосіб виправити персонал.
FelikZ

14

Іноді у вас немає можливості редагувати файл php, щоб встановити $ _GET для переданих параметрів, а іноді ви не можете або не бажаєте встановлювати php-cgi.

Я вважав, що це найкраще рішення для цього випадку:

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

Це дозволяє уникнути зміни файлу php і дозволяє використовувати звичайну команду php. Якщо у вас встановлено php-cgi, будь ласка, використовуйте це, але це найкраще наступне. Думав, що ці варіанти заслуговують на згадку

-r означає запустити php-код у рядку наступного. ви встановлюєте там значення $ _GET вручну, а потім посилаєтесь на файл, який потрібно запустити.

Варто зазначити, що слід запускати це в потрібній папці, часто, але не завжди папці, в якій знаходиться файл php. Потрібні заяви використовуватимуть розташування вашої команди для вирішення відносних URL-адрес, а не розташування файлу.


1
Я хочу подякувати вам за таке рішення. На мою думку, це повинна бути прийнята відповідь. Для його використання не потрібно встановлювати додаткову бібліотеку.
безпека меча

Це набагато краще, ніж прийнята відповідь. Оновлення для вас!
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 до однієї лапки, як? та & в частині запиту - метахарактеристики оболонки (одиночний символ символу + "запустити цю команду у фоновому режимі").
Марк Б

7
Це буде працювати, але вимагає запущеного веб-сервера і робить увесь процес неефективнішим, ніж потрібно.
Бред

Це є, але зазвичай $_GETмає на увазі працюючий веб-сервер.
скоромовка

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"
}

щойно я дізнався, що це працює на моєму сервері хостингу, але не на моєму локальному сервері, химерно.
Асаф

Може бути різниця у встановленій версії? На якій версії ця робота працювала для вас, а в якій її не вдалося?
Kzqai

php 5.2 про хостинг, працює, 5.3 локально не має значення ... Я не маю на увазі, що це зроблено за допомогою $ argv на випадок, якщо $ _GET порожній
Asaf

-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.