fopen завершается ошибкой, даже если скрипт, родительская папка и целевой файл принадлежат одному пользователю - PullRequest
1 голос
/ 28 ноября 2011

Даже если на сервере активирован безопасный режим, если файл сценария, целевой файл и родительская папка принадлежат одному и тому же пользователю, fopen должен работать без проблем.Есть идеи, почему это происходит?Файлы имеют разрешение 755.Спасибо за ваше время и усилия.

$filename="file.html";
echo "Current User: ".get_current_user()."; UID: ".getmyuid()."; GID: ".getmygid()."<br/>";
echo "Current PID: ". getmypid() . "<br/>";
echo "Parent folder owner: ". fileowner(".") . "<br/>";
echo "$filename owner: " . fileowner($filename) . "<br/>";
echo "Current folder is writable: " . is_writable($filename);

ВЫХОД:

Текущий пользователь: vnnamp;UID: 32024;GID: 32026 Владелец родительской папки: 32024 Владелец file.html: 32024 Текущая папка доступна для записи: false

Ответы [ 3 ]

1 голос
/ 28 ноября 2011

Вы уверены, что ваш скрипт работает в правильном каталоге?

Если это не так, то имя файла, которое вы передаете, скорее всего, не существует, и именно поэтому is_writable() возвращает false.Используйте getcwd(), чтобы распечатать каталог, в котором работает скрипт (можете установить его с помощью chdir()) или использовать абсолютные имена файлов.

РЕДАКТИРОВАТЬ: просто, чтобы подвести итог обсуждению ниже:

  • Попробуйте абсолютный путь: Nope
  • Проверьте open-basedir в php.ini и httpd.conf: Nope
  • Попробуйте префиксировать путь с помощью $_SERVER['DOCUMENT_ROOT']: Нет
  • getmyuid () возвращает владельца файла сценария, а не владельца процесса. Проверьте несоответствие владельца файла и пользователя процесса с помощью posix_getpwuid(posix_geteuid()): Да, причина проблемы
0 голосов
/ 28 ноября 2011

Результат функции is_writable () кэшируется. Попробуйте очистить его с помощью clearstatcache()

0 голосов
/ 28 ноября 2011

Если пользователь является владельцем файла, это не означает, что файл должен быть доступен для записи пользователю.Может иметь разрешения, например 0444 или около того.

...