60

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

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


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

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

私はさまざまなことを試して、私の発見を以下に追加します。

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

4

2 に答える 2

98

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

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

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

コメントで Eugene/cam8001 が提案しているように、php_sapi_name() == 'cli'またはを使用してください。PHP_SAPI == 'cli'

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

于 2008-12-05T11:30:05.073 に答える
3

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

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

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

于 2008-12-05T11:36:16.150 に答える