Відповіді:
Зазвичай для передачі аргументів до сценарію командного рядка ви будете використовувати або 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
.
getopt()
, це, очевидно, говорить PHP, що ви хочете аргументувати f
, а не варіант f
(який би вказаний мінус двокрапки). Так що це просто синтаксис.
З цієї відповіді на 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
<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething
добре працює ..
У мене немає бінарного файлу 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, щоб встановити $ _GET для переданих параметрів, а іноді ви не можете або не бажаєте встановлювати php-cgi.
Я вважав, що це найкраще рішення для цього випадку:
php -r '$_GET["key"]="value"; require_once("script.php");'
Це дозволяє уникнути зміни файлу php і дозволяє використовувати звичайну команду php. Якщо у вас встановлено php-cgi, будь ласка, використовуйте це, але це найкраще наступне. Думав, що ці варіанти заслуговують на згадку
-r означає запустити php-код у рядку наступного. ви встановлюєте там значення $ _GET вручну, а потім посилаєтесь на файл, який потрібно запустити.
Варто зазначити, що слід запускати це в потрібній папці, часто, але не завжди папці, в якій знаходиться файл php. Потрібні заяви використовуватимуть розташування вашої команди для вирішення відносних URL-адрес, а не розташування файлу.
php file_name.php var1 var2 varN
Потім встановіть свої $_GET
змінні на першому рядку в PHP, хоча це не бажаний спосіб встановлення $_GET
змінної, і у вас можуть виникнути проблеми залежно від того, що ви зробите пізніше з цією змінною.
if (isset($argv[1])) {
$_GET['variable_name'] = $argv[1];
}
змінні, з якими ви запускаєте скрипт, будуть доступні з $argv
масиву у вашому додатку PHP. Перший запис буде ім'ям сценарію, з якого вони прийшли, тому ви можете зробити це, array_shift($argv)
щоб скинути цей перший запис, якщо ви хочете обробити купу змінних. Або просто завантажити в локальну змінну.
Спробуйте скористатися WGET
:
WGET 'http://localhost/index.php?a=1&b=2&c=3'
$_GET
має на увазі працюючий веб-сервер.
- Варіант 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"];
Якщо вам потрібно пройти $_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"
}
або просто (якщо у вас є LYNX):
lynx 'http://localhost/index.php?a=1&b=2&c=3'
php [script name] "a=1&b=2&c=3"
не заповнюватимуться$_SERVER['QUERY_STRING']
, але ви можете легко вплинути на те саме, посилаючись$_SERVER['argv'][1]
.