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