PHPスクリプトのコマンドラインとhttpの実行を判別するための標準的な方法は何ですか?


155

主に出力フォーマットの目的で、コマンドラインまたはHTTPのどちらで実行されたかを判断する必要があるPHPスクリプトがあります。これを行う正規の方法は何ですか?検査することだと思っていましたがSERVER['argc']、 'Apache 2.0 Handler'サーバーAPIを使用している場合でも、これが入力されていることがわかりました。

回答:


228

php_sapi_name()関数を使用します。

if (php_sapi_name() == "cli") {
    // In cli-mode
} else {
    // Not in cli-mode
}

ここにドキュメントからのいくつかの関連するメモがあります:

php_sapi_name —ウェブサーバーと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、と同じ値を持つ事前定義された定数もありますphp_sapi_name()


ありがとう。なぜそのドキュメントなのか興味をそそられます。例では、最初の3文字を検査しますが、説明では文字列は正確に「cgi」である必要がありますが、それ以外は、これは完璧だと思います。
ボビージャック、

もちろん、返された文字列が 'cgi'でない限り、コンソールから実行されているphpを示しています。のように、whaddayaknow、私の場合。
Adriano Varoli Piazza

@Adriano:多分あなたの場合、php-cgiを使用してスクリプトを実行します。

3
@ Bobby、php.netのドキュメントの例では、文字列の最初の3文字を見るだけで実際に「cgi」と「cgi-fcgi」の両方に一致します...そのため、実際に意味があります。どちらかと言えば、深刻なプログラマーのためにphp no languageを呼び出すために@hopを取り戻すことです:D
ChrisR

1
ここで興味深いメモ:php.net/manual/en/function.php-sapi-name.phpは、呼び出された実際のバイナリに応じて、コマンドラインからphpを実行してもcgi-fgiを取得できる
DAB

22

これは常に機能します。(PHPバージョンが4.2.0以降の場合)

define('CLI', PHP_SAPI === 'cli');

これにより、スクリプトの上部で使いやすくなります。

<?php PHP_SAPI === 'cli' or die('not allowed');

8
あなたの2番目のスニペットはCLI or die('not allowed');
不平等

1
@Madbreaks、私は2つの別々の用途を述べていました。私はどちらか一方を想定していましたが、両方を使用すればCLI or die('not allowed');完璧です。
Xeoncross 2013年

明確にしていただきありがとうございます。+ 1
Madbreaks 2013年

7
Which makes it easy to use at the top of your scripts実際には、2つの異なる用途のように聞こえるわけではありません。はい、私はネクロマンサーです。
George Dimitriadis 2017年

9

Drupal 7の実装は次のとおりです。drupal_is_cli()

function drupal_is_cli() {
  return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}

ただし、Drupal 8 ではPHP_SAPI === 'cli'


8

おもう

$_SERVER['REMOTE_ADDR']

CLIからは読み込まれません。

また、$ _ SERVERスーパーグローバルのすべてのHTTP_ *キーは、CLIから入力されません。


4

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サーバーとインターフェイスが追加されたときに、そのリストを更新しておいてください。

また、ボビーは言った:

なぜそのドキュメントなのか興味をそそられます。例では、最初の3文字を検査しますが、説明では文字列は正確に「CGI」である必要があります

例の説明は次のとおりです。

この例では、cgi-fcgiの場合もあるので、部分文字列cgiをチェックします。


ああ-私はその日は信じられないほど順守されていなかったか、そのコメントを書いてから例が更新されました。ただし、PHPについてのあなたの主張に心から同意します。バッシングは非常に疲れます。
ボビージャック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.