163

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

4

5 に答える 5

240

機能を使用してください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、continuation、embed、isapi、litespeed、milter、nsapi、phttpd、 pi3web、roxen、thttpd、tux、および webjames。

PHP >= 4.2.0 ではPHP_SAPI、 と同じ値を持つ事前定義された定数 もありますphp_sapi_name()

于 2008-10-06T11:07:22.160 に答える
23

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

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

これにより、スクリプトの先頭で簡単に使用できます。

<?php PHP_SAPI === 'cli' or die('not allowed');
于 2010-12-08T22:08:38.547 に答える
10

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'

于 2012-09-29T17:36:42.713 に答える
9

おもう

$_SERVER['REMOTE_ADDR']

CLI からは入力されません。

また、$_SERVER スーパーグローバルのすべての HTTP_* キーは、CLI から入力されないか、前述の正しい方法でホップします :-)

于 2008-10-06T10:53:32.190 に答える
5

_nameのドキュメントページphp_sapiには、その仕組みが明確に記載されています。

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 を毎日使用しています)。しかし、彼がドキュメントを明確にするのを手伝いたいのであれば、考えられるすべての Web サーバーを監査することができるかもしれません。その上で PHP を実行し、各サーバーで使用可能なすべてのインターフェイス タイプの名前を決定します。新しい Web サーバーとインターフェイスが追加されるたびに、そのリストを最新の状態に保つようにしてください。

また、ボビーは次のように述べています。

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

この例の説明には、次のように記載されています。

この例では、cgi-fcgi の可能性があるため、部分文字列 cgi をチェックします。

于 2009-08-05T18:51:14.570 に答える