私たちは通常経由でアクセスするとしましょう
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のようなものでしょうか?それはうまくいくと思います。
ありがとうございました!
通常、コマンドラインスクリプトに引数を渡すには、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";'
$_POST
および$_COOKIE
でも同じことができることに注意してください。
これから ServerFaultで回答 :
php
の代わりにphp-cgi
バイナリを使用し、次のようにコマンドラインで引数を渡します。
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
Ubuntuにはphp-cgiバイナリがないので、これを行いました。
%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> %cat test1.php <html> fooを<?php print $ _GET ['foo']?>。<に設定します。 /html>
php file_name.php var1 var2 varN
次に、PHPの最初の行に$_GET
変数を設定しますが、これは$_GET
変数を設定する望ましい方法ではなく、後でその変数を使用して何を行うかによって問題が発生する可能性があります。
if (isset($argv[1])) {
$_GET['variable_name'] = $argv[1];
}
スクリプトを起動する変数は、PHPアプリの$argv
配列からアクセスできます。最初のエントリは元のスクリプトの名前になるため、変数の束を処理する場合は、array_shift($argv)
を実行してその最初のエントリを削除することができます。または、ローカル変数にロードするだけです。
時々、渡されたパラメーターに$ _GETを設定するためにphpファイルを編集するオプションがない場合があります。また、php-cgiをインストールできない、またはインストールしたくない場合があります。
私はこれがその場合の最良の解決策であることがわかりました。
php -r '$_GET["key"]="value"; require_once("script.php");
これにより、phpファイルの変更が回避され、プレーンなphpコマンドを使用できます。 php-cgiがインストールされている場合は、必ずそれを使用しますが、これが次善策です。このオプションは言及に値すると思いました
-rは、次の文字列でphpコードを実行することを意味します。そこで$ _GET値を手動で設定し、実行するファイルを参照します。
これは適切なフォルダーで実行する必要があることに注意してください。常にではありませんが、phpファイルがあるフォルダーで実行する必要があります。requiresステートメントは、ファイルの場所ではなく、相対的なURL
WGET
を使用してみてください:
WGET 'http://localhost/index.php?a=1&b=2&c=3'
-オプション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"];
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'
}
}
$_GET
、$_REQUEST
、$_POST
、またはその他の何かを渡す必要がある場合は、PHPインタラクティブモードを使用することもできます。
php -a
次に入力します:
<?php
$_GET['a']=1;
$_POST['b']=2;
include("/somefolder/some_file_path.php");
これにより、必要な変数を手動で設定し、それらの変数を設定してphpファイルを実行します。
コマンドラインで次を貼り付けます
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"
}