2009-09-29 67 views
1

我想獲取正在運行的腳本的文件名(但不包括它正在調用)。PHP魔術常量

echo basename(__FILE__); # will always output include.php 

echo basename($_SERVER['SCRIPT_FILENAME']); 
# This will do what I want (echo myscript.php), but I was wondering if there was 
# a better way to grab it, as I have had problems with $_SERVER['SCRIPT_FILENAME'] 
# when running certain scripts from a cron. 

有什麼建議嗎?

<? 
#myscript.php 
require('include.php'); 
echo "Hello all"; 
?> 

<? 
#include.php 
echo basename(__FILE__); 
echo basename($_SERVER['SCRIPT_FILENAME']); 
?> 

謝謝!

回答

2

你必須使用$ _ SERVER [ 'SCRIPT_NAME'],如reserved_variables手冊頁

'SCRIPT_NAME' 包含當前腳本的路徑解釋。這對於需要指向自己的頁面很有用。 __FILE__常量包含當前(即包含)文件的完整路徑和文件名。

+0

只是爲了讓你知道,由於某種原因,我使用$ _SERVER ['SCRIPT_FILENAME']和可能$ _SERVER ['SCRIPT_NAME']的舊服務器在通過cron運行時沒有返回任何內容。但是,我想通過SCRIPT_FILENAME使用SCRIPT_NAME。所以謝謝 – Lizard 2009-09-29 09:29:06

+0

$ _SERVER [「argv」] [0]可能有你想要的。 – Neel 2009-09-29 09:30:22

+0

argv [0]是腳本名稱,因爲它由cmd行調用,所以包含的路徑是絕對路徑,相對路徑(path/name.php,./path/name.php等),具體取決於您調用腳本的__how__ 。此外,它可能是未定義,當不在氣候環境 – drAlberT 2009-09-29 10:04:37

0

我記得使用'$_SERVER["SCRIPT_NAME"]',但不知道玉米是否有問題。

+0

我想你指的cron。 – 2009-09-29 09:14:36

+0

但我喜歡玉米。 :p – NawaMan 2009-09-29 11:26:50

1

如果您在crontab中使用了`php -f /home/me/foo.php(即php-cli),您可能也對$argv陣列感興趣。 $ argv [0]包含最初傳遞給php的腳本的路徑/名稱。

+0

謝謝,這將是有益的!沒有想到在這種情況下使用它。 – Lizard 2009-09-29 09:35:45

0

當PHP命令行(可能你是如何的cron設置)執行SCRIPT_FILENAME將包含用戶指定的路徑。如果您的腳本以../myscript.php執行,那麼這是您將獲得的值。無論如何,當你通過basename()傳遞價值時,它應該仍然適合你的需求。你完全有什麼問題?

SCRIPT_NAME是另一個預定義變量來看待,但是這不會總是包含絕對路徑執行的文件無論是。

+0

不知道爲什麼會發生這種情況,以及從那時起我們已經移動了服務器,現在一切正常。只是想檢查$ _SERVER變量是我應該使用的變量。 – Lizard 2009-09-29 09:40:47

1

我做了一些測試,你有什麼,沒有,那裏它是一種溶劑,適合我工作;) 代碼名稱爲Debug.php和bellow的文件是響應名稱的方法日誌文件。

無論是在瀏覽器,並在cron結果在我的情況是:test.log中

public static function filename($value = null) { 
     static $_filename; 
     if (isset($value)) $_filename = $value; 
     if ($_filename === null) { 
      $_filename = ''; 
      if (strlen($_SERVER["SCRIPT_FILENAME"])) { 
       $filename = $_SERVER["SCRIPT_FILENAME"]; 
      } else if (count($_SERVER["argv"])) { // for cron calls 
       $filename = $_SERVER["argv"][0]; 
      } 
      if (!strlen($filename)) { 
       $filename = __FILE__; 
      } 
      $arr = explode('.', basename($filename)); 
      $_filename = array_shift($arr) . '.' . Debug::extension(); 
     } 
     return $_filename; 
    }