PHPスクリプトのコマンドラインとhttpの実行を判断する標準的な方法は何ですか?
-
05-07-2019 - |
質問
主に出力フォーマットの目的で、コマンドライン経由で実行されたか、HTTP経由で実行されたかを判断する必要があるPHPスクリプトがあります。これを行う標準的な方法は何ですか? SERVER ['argc']
を検査することだと思っていましたが、「Apache 2.0 Handler」サーバーAPIを使用している場合でも、これが読み込まれることがわかりました。
解決
php_sapi_name()
関数を使用します。
if (php_sapi_name() == "cli") {
// In cli-mode
} else {
// Not in cli-mode
}
ドキュメントからの関連メモを次に示します。
php_sapi_name — WebサーバーとPHP間のインターフェースのタイプを返します
完全ではありませんが、可能な戻り値にはaolserver、apache、apache2filter、apache2handler、caudium、cgi(PHP 5.3まで)、cgi-fcgi、cli、cli-server、continuity、embed、isapi、litespeed、milter、nsapiが含まれます、phttpd、pi3web、roxen、thttpd、tux、およびwebjames。
PHP> = 4.2.0には、 php_sapi_name()
と同じ値を持つ定義済み定数 PHP_SAPI
もあります。
他のヒント
これは常に機能します。 (PHPバージョンが4.2.0以降の場合)
define('CLI', PHP_SAPI === 'cli');
スクリプトの上部で簡単に使用できるようになります:
<?php PHP_SAPI === 'cli' or die('not allowed');
Drupal 7の実装は次のとおりです。 drupal_is_cli():
function drupal_is_cli() {
return (!isset( Drupal 7の実装は次のとおりです。 drupal_is_cli():
<*>
ただし、Drupal 8 PHP_SAPI === 'cli'
する>
SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric( Drupal 7の実装は次のとおりです。 drupal_is_cli():
<*>
ただし、Drupal 8 PHP_SAPI === 'cli'
する>
SERVER['argc']) && Drupal 7の実装は次のとおりです。 drupal_is_cli():
<*>
ただし、Drupal 8 PHP_SAPI === 'cli'
する>
SERVER['argc'] > 0)));
}
ただし、Drupal 8 PHP_SAPI === 'cli'
する>
私は思う
私は思う
<*>
CLIから入力されません。
また、$ _ SERVERスーパーグローバル内のすべてのHTTP_ *キーがCLIから読み込まれることはありません。または、前述の正しい方法でホップを実行します:-)
SERVER['REMOTE_ADDR']
CLIから入力されません。
また、$ _ SERVERスーパーグローバル内のすべてのHTTP_ *キーがCLIから読み込まれることはありません。または、前述の正しい方法でホップを実行します:-)
php_sapi
_nameのドキュメントページには、その仕組みが明確に記載されています。
PHPが使用しているインターフェイスのタイプ(サーバーAPI、SAPI)を記述する小文字の文字列を返します。...
網羅的ではありませんが、可能な戻り値には、aolserver、apache、apache2filter、apache2handler、caudium、cgi(PHP 5.3まで)、cgi-fcgi、cli、continuity、embed、isapi、litespeed、milter、nsapi、phttpd、pi3webが含まれます、roxen、thttpd、tux、およびwebjames。
ホップがPHPが真面目なプログラマー向けだとは思わない理由はわかりません(私は真面目なプログラマーであり、私は毎日PHPを使用しています)。 PHPが実行可能なWebサーバーであり、各サーバーのすべての可能なインターフェイスタイプの名前を決定します。新しいWebサーバーとインターフェースが追加されるたびに、そのリストを更新したままにしてください。
また、ボビーは言った:
私はなぜその文書に興味を持っていますか。この例では最初の3文字を検査しますが、説明では文字列は正確に&quot; CGI&quot;
である必要があると述べています。
例の説明には次のように記載されています。
この例では、cgi-fcgiでもある可能性があるため、部分文字列cgiをチェックします。