Я боролся чтобы PHP readfile () работал правильно. После изучения всех параметров выясняется, что я не могу заставить это работать, когда я пытаюсь открыть файл, расположенный в другом разделе. Моя папка webroot находится под корневым разделом (/webroot
), и я хочу получить доступ к файлам, расположенным в /home
.
/
, то все работает, но если он находится под /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 явно сообщает вам, что это проблема с разрешениями:
не удалось открыть поток: в доступе отказано
Если вы исключили open_basedir и selinux, проверьте еще кое-что:
1) PHP работает как apache uid? Это нормально, если это mod_php, но для php-fpm это беспорядочно.
2) работает ли PHP в chroot jail?
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";