我希望你能提供帮助。我需要找到获取当前正在运行的PHP脚本的当前目录的方法。
自脚本启动以来,脚本本身的位置可能已更改。
我不能使用任何魔术常量,例如__FILE__
或__DIR__
作为基础,因为它们似乎是在执行开始时由PHP处理器定义的,因此继续指向原始位置脚本。
为了测试想法,我正在执行以下操作(从linux上的命令行):
test.php
中有一个名为test_1
的文件,即test_1/test.php
php test_1/test.php
mv test_1 test_2
test_2
目录而不是test_1
此测试使用的脚本如下:
<?php
while (true) {
echo "__FILE__: " . __FILE__ . "\n";
echo "__DIR__: " . __DIR__ . "\n";
echo "realpath(__FILE__): " . realpath(__FILE__) . "\n";
echo "realpath(__DIR__): " . realpath(__DIR__) . "\n";
echo '-----'. "\n";
sleep(5);
}
所以,问题是:如何找到当前运行的脚本的当前目录(而不是脚本启动时的位置)?
答案 0 :(得分:1)
脚本的inode不会更改,即使它被移动到同一文件系统中的其他位置。
您可以使用内置函数getmyinode获取脚本开头的文件的inode和路径名:
<?php
$myinode = getmyinode();
$mypath = realpath(__FILE__);
?>
然后,只要您想获取文件路径,请调用一个比较两者的函数,并在必要时更新路径:
<?php
function getMyPath() {
global $myinode, $mypath;
if (fileinode($mypath) != $myinode) {
// File moved!
$searchfrom = '/'; // Maybe you can change this to $_SERVER['DOCUMENT_ROOT']
$mypath = shell_exec("find " . $searchfrom . " -inum " . $myinode . " -print -quit 2>/dev/null");
if (fileinode($mypath) != $myinode) {
// error; not found
}
}
return $mypath;
}
?>
如果/何时移动文件,搜索inode将会非常慢,但我没有看到任何解决方法。另请注意,如果存在硬链接,则可能存在指向同一文件的多个路径;上面的-print -quit
只是在第一个之后停止。
由于使用了inode和find
shell命令,这只适用于Linux。
答案 1 :(得分:0)
dirname(__FILE__);
也许这会有所帮助?