2010-01-31 95 views
10

標題簡單明瞭。我必須知道服務器端是否通過HTTP請求或命令行調用腳本。我可以檢查$_SERVER['argv']$_SERVER['argc']
什麼是務實方式做到這一點?如何區分http和cli請求?

回答

12

http://us3.php.net/manual/en/function.php-sapi-name.php

<?php 
echo PHP_SAPI; 
echo php_sapi_name(); 
?> 
+1

幹得好,謝謝。 – erenon 2010-01-31 19:34:22

+0

+1這是要走的路。我在檢查$ _SERVER變量和類似的東西時遇到了問題。這一個始終有效。 – 2010-01-31 19:34:25

+0

+1不知道這個功能,謝謝! – 2010-01-31 19:50:06

2

看看$_SERVER中的鑰匙。如果這是一個cli請求,您不應該看到以「HTTP」開頭的任何內容。


下面是一些簡單的測試代碼:

<?php 

foreach($_SERVER as $k=>$v){ 
    echo "$k: $v\n"; 
} 

?> 

這裏是輸出:

[email protected]:~/so$ php cli.php |grep HTTP 
[email protected]:~/so$ 
+0

調用,用於發送數據無當您只能測試一個值時需要循環。 – 2010-01-31 19:35:37

+0

@kemp,OP的問題明確要求argc – 2010-01-31 19:40:54

1

如果沒有$_SERVER['HTTP_HOST']設置可能檢查?因爲我相信這個變量是通過請求頭髮送到文件執行時填充的,並且命令行可能不會發送頭文件。

+0

Ha的替代方案,在1秒鐘之內... – 2010-01-31 19:28:14

0

您可以檢查是否設置了全局變量$argc

0

我建議檢查if(isset($_SERVER['SERVER_NAME']))

+0

我不確定這是不是設置。這可能,特別是如果你正在遠程執行你的PHP文件.. – 2010-01-31 19:29:38

+0

我認爲$ _SERVER數組保留給HTTP事務,但你可能是對的。我認爲它們在本地和遠程執行方面存在差異,所以仍然值得通過其中的各種成員。 – 2010-01-31 19:41:33

0

但是你必須通過HTTP(TCP)反正不管該腳本是從CLI或瀏覽器

+0

你錯了。 – erenon 2010-03-24 18:48:45