2

创建一个包含 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(处理程序中的那个)找不到文件?

4

3 回答 3

3

我不完全确定原因,但 PHP 文档在注释中确实警告了这一点,register_shutdown_function()其中指出:

Note:

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

您可以尝试呼应getcwd()以了解实际发生的情况。

于 2012-12-18T00:27:29.097 回答
2

请参阅该功能的文档,

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.
于 2012-12-18T00:27:24.240 回答
1

在 PHP 的某些 SAPI 上,在关闭函数中,工作目录可以更改。请参阅手册页上的此注释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);
于 2012-12-18T00:26:32.760 回答