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.