2012-01-26 108 views
2

我有一個腳本,使用其所有其他包含文件的絕對路徑;該腳本將作爲cron作業執行。當我在終端中運行腳本時,$_SERVER["DOCUMENT_ROOT"]返回空值,但在瀏覽器中它返回正確的文檔根目錄。文檔根目錄不顯示

什麼會導致此問題?

+0

這不是錯誤。這是預期的行爲。 CLI的行爲與其他SAPI不同。您可以在[PHP主題上的手冊文檔](http://www.php.net/manual/en/features.commandline.differences)中獲得一個很好的概要。PHP) – rdlowrey

回答

1

我只希望$_SERVER只在腳本實際在網絡服務器上運行時才能定義,而不是由獨立的命令行PHP解釋器運行。該值在服務器上下文中才有意義。如果腳本是作爲cron作業運行的,它不應該依賴該變量。

+0

謝謝,我明白了。 :) – TED

5

你的問題是$_SERVER變量是由執行環境提供的。在命令行上運行腳本時,不存在HTTP服務器。

所以,你不能使用像DOCUMENT_ROOT這樣的東西 - 當沒有Apache配置的時候會是什麼?

相反,您可以使用像__FILE__這樣的變量,它是腳本的完整路徑。也許dirname那一次或多次會讓你到DOCUMENT_ROOT

+0

謝謝,我明白了。 :) – TED

1

當在CLI模式下執行php時,其行爲會有所不同,包括未設置$_SERVER['DOCUMENT_ROOT']。對於$_SERVER值和可在命令行中其他工具的一個很好的列表,請嘗試執行<?php echo phpinfo();

爲CLI腳本,你還是應該有機會獲得__FILE__找出您正在運行的文件。

+0

謝謝,我明白了。 :) – TED

0

我需要在不同的服務器環境中執行相同的腳本,並且遇到了查找站點的公共根目錄的問題,尤其是使用命令行php。我厭倦了編輯路徑,所以我編寫了一個可以在我的所有服務器環境中找到root的函數。我相信有更好的方法,但對我很好。 一些它的工作原理是什麼目錄結構例子:

'/var/www/magento/some/folder/' 
'/home/user/html/some/folder/' 
'/home/user/public_html/some/folder/' 


function getSiteRoot() { 
    /* 
    ' Returns the root of any of your development/live site as long as the $home array 
    ' contains a unique folder name. Define your public directories in this array and the 
    ' building function will break when it hits this directory. 
    */ 
    $a = realpath(dirname(__FILE__).''); 
    $b = explode('/', $a); 
    $home = array("html","public_html","magento"); //add your public folders here 
    $str = ''; 
    foreach ($b as $c) { 
     $str.= $c . DIRECTORY_SEPARATOR . ''; 
      if(in_array($c, $home)) { 
       break; 
      } 
    } 
    return $str; 
} 
1

如果您正在使用的Magento然後,而不是使用

$ _ SERVER [ 「DOCUMENT_ROOT」]

realpath(dirname(__FILE__))

我會建議你使用

目錄名(法師:: getRoot())

這會給你你的Magento商店的根文件夾,希望這有助於。

乾杯 S