关闭处理程序和相对路径

时间:2012-12-18 00:20:00

标签: php apache relative-path

创建一个包含2个文件的PHP项目 - index.php包含下面的代码,另一个文件(在同一目录中)名为example.png

echo file_exists('example.png')
    ? 'outside the handler - exists'
    : 'outside the handler - does not exist';

register_shutdown_function('handle_shutdown');

function handle_shutdown()
{
    echo file_exists('example.png')
        ? 'inside the handler - exists'
        : 'inside the handler - does not exist';
}

foo();

运行index.php

这是你得到的:

outside the handler - exists
Fatal error: Call to undefined function foo() in /path/to/project/index.php on line 16
inside the handler - does not exist

这是我的问题。

为什么内部file_exists(处理程序中的那个)找不到文件?

3 个答案:

答案 0 :(得分:2)

我不确定原因,但PHP文档在register_shutdown_function()下的说明中警告了这一点:

Note:

Working directory of the script can change inside the shutdown function under some web servers, e.g. Apache.

您可以尝试回显getcwd()以了解实际发生的事情。

答案 1 :(得分:1)

在PHP的某些SAPI上,在shutdown函数中,工作目录可以更改。请参阅register_shutdown_function的手册页上的此注释:

  

脚本的工作目录可以在某些Web服务器下的关闭功能内部进行更改,例如:的Apache。

相对路径取决于工作目录。随着它的改变,不再找到该文件。

如果您使用绝对路径,则不会遇到该问题:

$file = __DIR__ . '/' . 'example.png';

echo file_exists($file)
    ? 'outside the handler - exists'
    : 'outside the handler - does not exist';

$handle_shutdown = function() use ($file)
{
    echo file_exists($file)
        ? 'inside the handler - exists'
        : 'inside the handler - does not exist';
}

register_shutdown_function($handle_shutdown);

答案 2 :(得分:1)

请参阅该功能的文档,

http://php.net/manual/en/function.register-shutdown-function.php

有一条说明,

Working directory of the script can change inside the shutdown function under some web servers, e.g. Apache.