2009-09-29 105 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; 
    }