2008-12-05 55 views
60

有沒有方法可以區分腳本是從命令行還是由Web服務器調用?如何區分命令行和網絡服務器調用?

爲最佳答案和更詳細的討論,請參閱What is the canonical way to determine commandline vs. http execution of a PHP script? - 沒有發現一個在發佈前)


我有一個(非生產)與Apache 2.2.10和PHP 5.2服務器0.6。在它上面,在一個web訪問目錄中是我的PHP腳本,maintenance_tasks.php。我想從命令行或通過HTTP請求(通過在瀏覽器中打開)調用此腳本。是否有一些變量允許我可靠地確定腳本如何被調用?

(我已經攻克了不同意見的問題,爲每種類型的調用和HTTP響應超時,只是在尋找告訴分開兩種調用類型的一種方式)

我會嘗試不同的東西,加我以下發現。

重複:What is the canonical way to determine commandline vs. http execution of a PHP script?

+0

哪個問題是重複的?如果重複問題與之相關,那將會很有幫助。 – starbeamrainbowlabs 2014-09-18 16:41:59

+0

@starbeamrainbowlabs:「Duplicate:http://stackoverflow.com/questions/173851/what-is-the-canonical-way-to-determine-commandline-vs-http-execution-of-a-php-s」at問題的最後部分還不夠清楚? – Piskvor 2014-09-18 17:36:09

+0

由於某種原因我沒有出現,謝謝你的回覆:) – starbeamrainbowlabs 2014-09-19 11:24:28

回答

96

如果從命令行調用,則服務器變量HTTP_USER_AGENT未設置。我用這個常量來定義,是否該腳本從命令行調用或不:

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

UPDATE:由於這個答案仍標記爲「正確」的一個,我會喜歡修改我的聲明 - 依靠「User-Agent」標題可能會有問題,因爲它是用戶定義的值。

請使用php_sapi_name() == 'cli'PHP_SAPI == 'cli',如評論中Eugene/cam8001所建議。

感謝您指出這一點!

3

我比較了兩個調用中的超全局變量$_SERVER。這似乎從殼/命令行運行時,$_SERVER['argc'](即傳遞給該腳本的參數個數),才設置:

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

這似乎是在Linux和Windows主機的工作兩者。 (首先我想過檢查一些環境變量,但是每個操作系統的環境變量都不同,並且CLI版本中缺少所有的$_SERVER['HTTP_*']頭文件,但我不確定這是否足夠可靠。)