PHPの現在の呼び出しがコマンドライン(CLI)からのものか、Webサーバー(私の場合はmod_phpを使用したApache)からのものかを判断する必要があります。
推奨される方法はありますか?
PHPの現在の呼び出しがコマンドライン(CLI)からのものか、Webサーバー(私の場合はmod_phpを使用したApache)からのものかを判断する必要があります。
推奨される方法はありますか?
回答:
php_sapi_name
インターフェイスタイプの小文字の文字列を返すため、使用する関数です。さらに、PHP定数がありPHP_SAPI
ます。
ドキュメントはここにあります:http : //php.net/php_sapi_name
たとえば、PHPがCLIから実行されているかどうかを確認するには、次の関数を使用できます。
function isCommandLineInterface()
{
return (php_sapi_name() === 'cli');
}
return php_sapi_name() == 'cli';
php-cgi
。これを使用してスクリプトを呼び出しても機能しません。次に、cgi-fcgi
文字列を返します。ブラウザからスクリプトをWebページとしてロードすると、が表示されますapache2handler
。お役に立てれば。変数php-cgi
を導入するために使用する必要がありました$_GET
:php-cgi myscript.php arg1=one arg2=two
。と等しくないapache2handler
かどうかのテストは、で問題ありませんapache
。
"cli"
。$_SERVER
リクエストがHTTP経由かどうかをより確実に判断するために、内部から選択するさまざまなキーがあります。
私はこの機能を数年間使用しています
function is_cli()
{
if ( defined('STDIN') )
{
return true;
}
if ( php_sapi_name() === 'cli' )
{
return true;
}
if ( array_key_exists('SHELL', $_ENV) ) {
return true;
}
if ( empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0)
{
return true;
}
if ( !array_key_exists('REQUEST_METHOD', $_SERVER) )
{
return true;
}
return false;
}
array_key_exists('REQUEST_METHOD', $_SERVER) return true;
WAT?
array_key_exists('REQUEST_METHOD', $_SERVER)
検出を支援するために正しいです。すると、CLI、スーパーグローバル配列がWILL NOTキーを持っている、それだけで、要求をWeb経由で行われたとき、それをチェックするときに、それゆえ、作者がターゲットに絶対に存在します。$_SERVER
REQUEST_METHOD
return false;
かんif ( ! array_key_exists(…)) return true;
?
'REQUEST_METHOD'
が見つからない場合、関数FALSE
は「CLI」を示すように戻るはずです。関数自体のスコープに注意を払わなかったことに対する私の謝罪...関数は実際に機能するので、著者はそれを修正する必要があります!
php_sapi_name()
これは実際にこのチェックを実行する最良の方法ではありません。これは、多くの可能な値に対するチェックに依存するためです。php-cgiバイナリは、コマンドライン、シェルスクリプト、またはcronジョブとして呼び出すことができ、(ほとんどの場合)これらも「cli」として扱う必要がありますが、php_sapi_name()
ますが、これらに対して異なる値を返します(これは違います)プレーンバージョンのPHPの場合ですが、コードをどこでも機能させたいと思いませんか?)言うまでもなく、来年、PHPを使用する新しい方法が存在する可能性があります。私が気にしているのは、出力をHTMLでラップする必要があるかどうかである場合は、それについて考えたくありません。
幸い、PHPにはこれを具体的にチェックする方法があります。http_response_code()
パラメータなしで使用するだけで、Webサーバータイプ環境から実行された場合はTRUEを返し、CLIタイプ環境から実行された場合はFALSEを返します。これがコードです:
$is_web=http_response_code()!==FALSE;
これを呼び出す前に、CLI(またはCLIのようなもの)から実行されているスクリプトから誤って(?)応答コードを設定した場合でも、これは機能します。
http_response_code()
CLIから実行するときにコードを設定するか、設定コードを返します。によって確認されました<?php function t() { echo var_export(http_response_code(), true) . ' -> ' . (http_response_code() !== false ? 'web' : 'cli') . "\n"; } t(); http_response_code(200); t(); http_response_code(false); t();
。その場合http_response_code()===false
、CLIを想定しても安全ですが、そうでない場合は他のメトリックも確認する必要があります。
私は彼がPHP CLIが呼び出されているのか、それともWebリクエストからの応答なのかを意味していると思います。最善の方法はphp_sapi_name()
、Webリクエストが実行されていた場合、それが実行されていた場合にApacheをエコーする方法を使用することです。
上php_sapi_name()
のphp ドキュメントから取られたいくつかのリスト:
function is_cli() {
return !http_response_code();
}
例:
if (is_cli()) {
echo 'command line';
} else {
echo 'browser';
}
http_response_code(200);
...ここで呼び出すhttp_response_code()
と、200が返されます。
http_response_code();
CLI環境から呼び出された場合、実際のステータスコードに関係なく、常にFALSEを返します。これについてはすでに回答で説明しましたが、「戻り値」のマニュアルページを読んだり、試してみたりして、このことを知ることもできます。
php -r 'http_response_code(200); echo http_response_code()."\n";'
"200"を出力します。ライブラリまたは無知のフレームワークが応答コードを設定していないことを保証できない場合http_response_code
(cli環境でも)、これは機能します。個人的に、私は使用しています$isCli = \defined('STDIN') || isset($_SERVER['argv']) || \array_key_exists('REQUEST_METHOD', $_SERVER)
http://jp2.php.net/manual/en/features.commandline.phpによると、CLIから実行する場合にのみ設定される定数がいくつかあります。これらの定数は、STDIN、STDOUT、およびSTDERRです。それらの1つをテストすると、CLIモードかどうかがわかります
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));
if(IS_CLI_CALL){
//do you stuff here
}
上記のシルバームーンの回答に基づいて、正しい改行を返すためにこの関数を使用しています。
/**
* Linebreak function
* @return "/n" if cli, else return <br>
*/
protected static function lb(){
return (defined('STDIN') || php_sapi_name() === 'cli' || isset($_ENV['SHELL']) ||
(empty($_SERVER['REMOTE_ADDR']) && !isset($_SERVER['HTTP_USER_AGENT']) && count($_SERVER['argv']) > 0) ||
!isset($_SERVER['REQUEST_METHOD'])) ? "\n" : "<br>";
}
この質問に対する正しい答えは、その背後にある実際の意図によって異なります。
前者の場合、与えられた回答と書かれたコメントは、有効な解決策を見つけるのに十分です。
後者の場合、ツールがcronjobとして実行されるか、別のデーモンからのバックグラウンドジョブとして実行されると、ここに記載されているレシピは失敗します。その場合STDIN
、TTY かどうかをさらにテストすることをお勧めします。
function at_tty() {
return defined("\STDIN") && posix_isatty(\STDIN);
}