web-dev-qa-db-ja.com

コマンドラインとウェブサーバーの呼び出しを区別する方法は?

スクリプトがコマンドラインから呼び出されたのか、Webサーバーによって呼び出されたのかを区別する方法はありますか?

PHPスクリプトのコマンドラインとhttpの実行を決定する標準的な方法は何ですか? 最良の回答についておよび詳細な議論-投稿する前にそれを見つけられませんでした)


Apache 2.2.10およびPHP 5.2.6を備えた(非実動)サーバーがあります。その上には、Webアクセス可能なディレクトリに私のPHPスクリプト、maintenance_tasks.phpがあります。このスクリプトをコマンドラインから、またはHTTPリクエストを介して(ブラウザーで開くことにより)呼び出したいと思います。スクリプトの呼び出し方法を確実に決定できる変数がありますか?

(呼び出しの種類ごとに異なるビューの問題とHTTP応答タイムアウトに既に取り組み、2つの呼び出しの種類を区別する方法を探しています)

さまざまなことを試して、調査結果を以下に追加します。

Duplicate:PHPスクリプトのコマンドラインとHTTP実行を判断する標準的な方法は何ですか?

60
Piskvor

コマンドラインから呼び出された場合、サーバー変数HTTP_USER_AGENTは設定されません。この定数を使用して、スクリプトがコマンドラインから呼び出されるかどうかを定義します。

_define("CLI", !isset($_SERVER['HTTP_USER_AGENT']));
_

PDATE:この回答はまだ「正しい」ものとしてマークされているため、ステートメントを修正したい-「User-Agent」ヘッダーに依存することは、ユーザー定義であるため問題がある可能性がある値。

Eugene/cam8001のコメントで示唆されているように、php_sapi_name() == 'cli'または_PHP_SAPI == 'cli'_を使用してください。

これを指摘してくれてありがとう!

98
Shocker

両方の呼び出しで$_SERVERスーパーグローバルを比較しました。 $_SERVER['argc'](つまり、スクリプトに渡される引数の数)は、シェル/コマンドラインから実行する場合にのみ設定されるようです:

<?php
if (isset($_SERVER['argc'])) {
    define('CLI', true);
} else {
    define('CLI', false);
}

これは、LinuxホストとWindowsホストの両方で機能するようです。 (最初にいくつかの環境変数をチェックすることを考えましたが、それらはオペレーティングシステムごとに異なります。また、CLIバージョンではすべての$_SERVER['HTTP_*']ヘッダーがありませんが、それが十分に信頼できるかどうかはわかりません。 )

3
Piskvor