Linuxコマンドプロンプトで$ _GETを渡すPHP


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メソッドのパラメーターを指します。これらのパラメーターは、Webサーバーに入力する必要があるため、コマンドラインでは使用できません。

とにかく$ _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";'

$_POSTand でも同じことができることに注意してください$_COOKIE


1
PHP 5.3を実行しているCentos 6マシンでは、呼び出しphp [script name] "a=1&b=2&c=3"はに値を入力しませんが、$_SERVER['QUERY_STRING']を参照することで同じことを簡単に行うことができます$_SERVER['argv'][1]
エリックL.

4
この回答を試し、PHPスクリプトを変更せずにコマンドラインからクエリ文字列を入力してください。
qris

これは最良の答えではありません。このページの他の回答をご覧ください。stackoverflow.com
LS

参考になる答えですが、私のように、コロンが引数名の後ろに何があるのか​​疑問に思っている場合getopt()、これは明らかに、オプションではなく引数 が必要であることをPHPに伝えますf f(コロンを除いて指定されます)。したがって、これは構文です。
Mitya 2018年

私は最後の答えが本当に好きで、昨日それを使いました。スクリプトに変換することもできます。
reinierpost '12

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
)

次のように、Webサーバーによって設定される環境変数を設定することもできます。

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に依存するスクリプトに簡単にラップできます。
セバスチャン

2
+1、素晴らしいソリューション、現在、これをサポートするためにすべてのCLIスクリプトをバックポートしています;)
ehime

これまでに見た唯一の欠点は、端末の出力が\ nではなく<br />を含むHTMLであることです。これは、すべての通知とエラーにも適用されます。例<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca '19

+1すばらしい、これは通常のスクリプト$ _GET Value For Exとして機能します。 php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething Works Good ..
Ajmal Praveen

16

Ubuntuには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-wayでスタッフを修正するように見えます。
FelikZ、2015

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
この解決策に感謝します。私の意見では、これは受け入れられる答えであるはずです。使用するために追加のライブラリをインストールする必要はありません。
剣のセキュリティ2016年

これは、受け入れられた回答よりもはるかに優れています。あなたに賛成投票してください!
faraday703

素晴らしくて簡単な解決法!
derRobert

素晴らしい答え。コードの最後の引用符が欠けているだけです:)
Pedro Araujo Jorge

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
これは機能しますが、実行中のWebサーバーが必要であり、プロセス全体が必要以上に少し非効率になります。
Brad

動作しますが、通常$_GETは実行中のウェブサーバーを意味します。
quickshiftin '30 / 09/30

6

-オプション1:php-cgi-

スクリプトを実行するには、「php」の代わりに「php-cgi」を使用します。これを使用するためにphpコードを特別に変更する必要がないため、これが最も簡単な方法です。

php-cgi -f /my/script/file.php a=1 b=2 c=3

-オプション2:Webサーバーがある場合-

PHPファイルがWebサーバー上にある場合は、コマンドラインで「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$_POSTPHPインタラクティブモードを使用することもできます。

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

これは私のホスティングサーバーで動作するが、ローカルサーバーでは動作しないことがわかった。
2012

インストールされているバージョンの違いでしょうか?これはどのバージョンで機能し、どのバージョンで失敗しましたか?
Kzqai

ホスティングのphp 5.2、動作、5.3はローカルではありません... $ _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を実行しません。これにより、コマンドラインからWebサーバーを呼び出すブラウザが実行されます。
Andrea Lazzarotto
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.