Назад | Перейти на главную страницу

Как использовать php readfile () для разных разделов?

Я боролся чтобы PHP readfile () работал правильно. После изучения всех параметров выясняется, что я не могу заставить это работать, когда я пытаюсь открыть файл, расположенный в другом разделе. Моя папка webroot находится под корневым разделом (/webroot), и я хочу получить доступ к файлам, расположенным в /home.

Вот мой 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";