리눅스 명령 프롬프트에서 $ _GET을 전달하는 PHP


125

우리가 일반적으로

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

리눅스 명령 프롬프트에서 어떻게 실행합니까?

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 메소드 매개 변수를 나타냅니다. 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
PHP 5.3을 실행하는 Centos 6 컴퓨터에서 호출 php [script name] "a=1&b=2&c=3"하면을 채우지 $_SERVER['QUERY_STRING']않지만 참조를 통해 같은 것에 쉽게 영향을 줄 수 있습니다 $_SERVER['argv'][1].
Eric L.

4
PHP 스크립트를 수정하지 않고 명령 줄에서 쿼리 문자열을 채우려면 이 답변 을 시도하십시오 .
qris

이것은 최선의 대답이 아닙니다. 이 페이지의 다른 답변을 참조하십시오 : stackoverflow.com/a/11965479/543738
LS

유용한 답변, 나처럼 콜론이 인수 이름 뒤에 무엇인지 궁금하다면 getopt(), 이것은 옵션 (콜론에서 마이너스로 지정)이 아닌 인수 를 원한다는 것을 PHP에게 알려줍니다 . 그래서 그것은 단지 구문입니다. f f
Mitya

나는 마지막 대답을 정말로 좋아하고 어제 사용했습니다. 스크립트로 바꿀 수도 있습니다.
reinierpost

239

ServerFault에 대한답변에서 :

php-cgijust 대신 바이너리를 사용하고 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
훌륭합니다. 이것은 모든 OS 종속 스크립트로 쉽게 감쌀 수 있습니다.
Sebastian

2
+1, 굉장한 해결책, 나는 현재 이것을 지원하기 위해 모든 CLI 스크립트를 백 포트하고 있습니다;)
ehime

지금까지 내가 본 유일한 단점은 터미널 출력이 \ n이 아닌 <br />가있는 HTML이라는 것입니다. 이는 모든 통지 및 오류에도 적용됩니다.<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca

+1 최고, 이것은 정상 스크립트에서 작동합니다 $ _GET 예 : 다음과 같이 php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething 작동합니다.
Ajmal Praveen

16

우분투에는 php-cgi 바이너리가 없으므로 다음과 같이하십시오.

별명 % 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

14

때로는 전달 된 매개 변수에 $ _GET을 설정하기 위해 php 파일을 편집 할 수있는 옵션이없고, 때로는 php-cgi를 설치하거나 설치하고 싶지 않을 수도 있습니다.

나는 이것이 그 경우에 가장 적합한 해결책이라는 것을 알았습니다.

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

이렇게하면 PHP 파일을 변경하지 않아도되고 일반 PHP 명령을 사용할 수 있습니다. php-cgi를 설치했다면 반드시 이것을 사용하십시오. 그러나 이것이 다음으로 가장 좋습니다. 이 옵션은 언급 할 가치가 있다고 생각했습니다.

-r은 다음 문자열에서 PHP 코드를 실행한다는 의미입니다. 여기에서 $ _GET 값을 수동으로 설정 한 다음 실행할 파일을 참조하십시오.

이 파일을 올바른 폴더에서 실행해야하지만 PHP 파일이있는 폴더는 아닙니다.


1
이 솔루션에 감사드립니다. 내 의견으로는 이것은 받아 들일만한 대답이어야합니다. 추가 라이브러리를 설치하지 않아도 사용할 수 있습니다.
swordsecurity

이것은 허용 된 답변보다 낫습니다. 당신을 위해 공감하십시오!
faraday703

굉장하고 쉬운 해결책!
derRobert

멋진 답변입니다. 코드에서 마지막 따옴표가 누락되었습니다 :)
Pedro Araujo Jorge Jorge

10
php file_name.php var1 var2 varN

그런 다음 $_GETPHP에서 첫 번째 줄에 변수를 설정하십시오. 변수를 설정하는 바람직한 방법은 아니며 $_GET나중에 해당 변수로 수행하는 작업에 따라 문제가 발생할 수 있습니다.

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

스크립트를 시작하는 변수는 $argvPHP 앱 의 배열에서 액세스 할 수 있습니다. 첫 번째 항목은 스크립트의 이름이므로 array_shift($argv)여러 변수를 처리하려는 경우 첫 번째 항목을 삭제 하려고 할 수 있습니다 . 또는 로컬 변수에로드하십시오.


가장 쉽고 간단한 해결책
주앙 멘텔 페레이라

9

사용해보십시오 WGET:

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

1
URL을?로 작은 따옴표로 묶고 싶을 것입니다. &는 쿼리 부분에 쉘 메타 문자입니다 (단일 문자 와일드 카드 + "백그라운드에서이 명령 실행").
Marc B

7
이것은 작동하지만 실행중인 웹 서버가 필요하며 전체 프로세스를 필요 이상으로 비효율적으로 만듭니다.
Brad

일반적으로 $_GET웹 서버가 실행 중임을 나타냅니다.
quickshiftin

6

-옵션 1 : php-cgi-

스크립트를 실행하려면 'php'대신 'php-cgi'를 사용하십시오. 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 2016 년

호스팅, 작동, PHP 5.3에 php 5.2는 중요하지 않습니다 ... $ _GET이 비어있는 경우를 대비하여 $ argv 방식을 수행했는지는 중요하지 않습니다
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를 실행하지 않습니다. 명령 행을 통해 웹 서버를 호출하는 브라우저를 실행합니다.
Andrea Lazzarotto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.