如何跨分区使用PHP的readfile()?

我一直在努力让PHP的readfile()正常工作。 深入了解所有选项后,事实certificate,当我尝试打开位于另一个分区上的文件时,我无法使其工作。 我的webroot文件夹位于根分区( /webroot )下,我想访问位于/home下的文件。

  • 权限就好了
  • open_basedir被禁用
  • 如果我将相同的文件夹和文件移动到/下的文件夹中,那么它们都可以工作,但是如果它位于/home ,那么它就不能工作了。 权限是777和该文件夹的所有者是Apache,所以它不是一个文件权限问题。

这是我的fstab:

 # /dev/sda1 UUID=... / ext4 rw,relatime,data=ordered 0 1 # /dev/sda6 UUID=... /home ext4 rw,relatime,data=ordered 0 2 

我得到的错误是:

 Warning: readfile(/home/files/1.txt): failed to open stream: Permission denied in /webroot/download.php 

我没有在文档中发现任何与分区相关的限制。 我的日志文件也没有指出任何特定的错误。 我没有安装selinux。

编辑:open_basedir是没有错。 我已经彻底检查过了。 通过特别包括处于危险中的文件夹,以及通过注释掉整个open_basedir指令。 另外,如果我强制open_basedir错误,那么实际的错误信息是不同的。

当前open_basedir设置:

http://i.stack.imgur.com/AXe7T.png

使用Arch Linux,PHP 5.4.13

任何想法这可能是什么?

我敢打赌,这个文件所在的分区与你为什么无法打开它(只要挂载文件系统) 无关

权限是777和该文件夹的所有者是Apache,所以它不是一个文件权限问题。

但是PHP明确告诉你这是一个权限问题:

未能打开stream:权限被拒绝

如果你排除了open_basedir和selinux,那么还有其他的事情要检查:

1)是PHP运行的Apache的UID? 这是好的,如果它是mod_php,但对于PHP-FPM,这是凌乱的。

2)是在chroot监狱运行的PHP?

3)你从什么得到:

 <?php function show_p($path) { print "path=" . $path . "n"; print "permissions=" . substr(sprintf('%o', fileperms($path)), -4) . "\n"; print_r(stat($path)) } print "uid=" . getmyuid() . "\n"; print "gid=" . getmygid() . "\n"; show_p('/home'); show_p('/home/files'); show_p('/home/files/1.txt'); print "acl=" . `getfacl -1 /home/files/1.txt` . "\n";