web-dev-qa-db-ja.com

PHPスクリプトのコマンドライン対HTTP実行を決定する標準的な方法は何ですか?

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

153
Bobby Jack

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_もあります。

222
user3850

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

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

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

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

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'

9
ya.teck

おもう

$_SERVER['REMOTE_ADDR']

cLIから入力されません。

また、$ _ SERVERスーパーグローバル内のすべてのHTTP_ *キーは、CLIから読み込まれることはありません。または、前述の正しい方法でホップを実行します:-)

8
Vinko Vrsalovic

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文字を検査しますが、説明では文字列は正確に「CGI」である必要があると述べています。

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

この例では、サブストリングcgiもチェックします。これは、cgi-fcgiでもある可能性があるためです。

4
Steve