2010-06-10 24 views
11

從命令行和HTTP執行php有什麼區別?他們是否使用相同的可執行文件(如php.exe或php-cgi.exe(Apache或IIS))?從命令行或HTTP執行時,結果是否有所不同?從命令行和HTTP端執行php的區別

+0

這聽起來像是一個家庭作業或測試問題。這不是那麼糟糕或什麼。 – Nathan 2010-06-10 16:25:58

+0

你真的應該閱讀手冊(http://www.php.net/manual/en/features.commandline.php)。它會告訴你差異和獎金功能,例如交互式shell,腳本文件的執行等。 – 2010-06-10 18:24:44

回答

2

無論PHP是通過Web服務器模塊還是CLI調用,都使用相同的二進制基礎(但有時可以配置爲使用不同的ini,這可能會影響腳本)。它的環境也會有所不同,因此環境變量將不準確。

PHP也意識到它被調用的方式不同,並會根據它調整它的輸出(即,通過CLI調用時,phpinfo();輸出的格式不同)。

+0

或者它們使用不同的二進制。我遇到的大多數實現有一個完全不同的版本cli&apache模塊,有時甚至不是相同的版本.... – Wrikken 2010-06-10 16:26:17

+0

@Wrikken。出於某種原因,這一定是由管理員有目的地完成的。無論哪種方式,我現在都將它稱爲'二進制基地' – webbiedave 2010-06-10 16:27:05

1

當你從命令行執行php時,你的服務器apache或iis沒有任何作用。你只需使用php4或php5文件夾來執行你的代碼。根據兩個文件夾中可用庫和php.ini設置的不同,執行可能會有所不同。當使用你的apache/bin中的apache php.ini運行時。從命令行php.ini中使用php5或php4文件夾時。

2

主要區別是參數傳遞:從CLI運行,你沒有$ _GET,$ _POST,$ _SESSION等;所以參數必須作爲命令行參數傳遞,並使用if $ _SERVER ['argc']和$ _SERVER ['argv']]來訪問,請注意代碼運行的目錄和包含路徑;並確保你知道你已經加載了什麼php.ini。 輸出時,HTML標記不會顯示爲標記,但會顯示爲< h1> etc ....特別注意
(PHP_EOL非常有用),並且多個空格或製表符顯示爲多個空格或製表符,單一空間。 忘記頭文件()和其他http特定函數

1

除了已經說過的,文件系統的哪些部分可以訪問的權限可能會有所不同:通過webserver的PHP作爲web服務器用戶運行,PHP來自命令行是作爲你自己運行的。

6

中的錯誤
這是一個php.ini設置(html_errors),但默認爲CLI版本滅無HTML標記。

記錄到標準錯誤
通常錯誤都記錄到Web服務器error.log中,但在CLI版本錯誤被寫入stderr。
這也可作爲一個php.ini設定(error_log

的php.ini
,其用於CLI版本可以是不同文件 php.ini文件。這可能會導致一些令人討厭的錯誤(捲曲突然不可用等)。

不同的可執行文件
這是可能的安裝PHP的多個版本(PHP5 PHP4旁邊)
使用which php,以確定您所使用的版本。

一切都顯示爲文本
的var_dump()是可讀沒有<pre>
header('Hello');echo('Hello');

0

儘管這個問題很老的沒有什麼區別,我想延長@ 鮑勃·範格的一點點。

在命令行運行PHP文件是很微不足道的,你只需要記住,有從網絡服務器上或服務器命令行界面上運行的文件中的一些差異:

  • 沒有$_GET$_POST$_SESSION可用 Cookie,但你可以用獲得作爲參數傳遞給命令傳遞的參數。第一個值就是文件名。

    例如採取此文件:

    <?php 
    var_dump($argv); 
    ?> 
    

    這樣調用:

    [email protected]:$ /usr/bin/php /home/user/file.php foo bar 
    

    會給你這樣的輸出:需要從您的服務器的根

    array(4) { 
        [0]=> 
        string(8) "file.php" 
        [1]=> 
        string(3) "foo" 
        [2]=> 
        string(3) "bar" 
    } 
    
  • 完整的文件路徑 您將需要提供完整的路徑到您的文件(例如fo r include(),require(),file_get_contents(),...),即使它們可能在同一個文件夾中。

  • 不同的用戶/權限設置 這些文件不會被www-data用戶執行,而是由用戶登錄到您的機器中。這會影響所有影響計算機文件系統的文件函數調用(例如,mkdir(),include(),...),因此您必須確保向該用戶提供適當的權限。

+1

除了這個有用的答案簡介之外,'$ _SERVER'變量對CLI中的腳本也是不可用的,例如$ _SERVER ['DOCUMENT_ROOT']'for訪問包括一個腳本。 – Martin 2016-12-06 09:15:02