is_writable () возвращает false - PullRequest
2 голосов
/ 23 января 2010

Я ожидаю проблему с функцией PHP fwrite ()

$filename = 'rss.xml';  

if (file_exists($filename)) {
    echo "The file $filename exists";
} 

if (is_writable($filename)) {
    $fp = fopen($filename, 'w');
    fwrite($fp, $feed);
    fclose($fp);
 }
else{
    echo '<br />not writable..';
    if(!is_readable($filename)){
    echo ' and not readable!';
    }
}

После выполнения сценария верните:

The file rss.xml exists
not writable.. 

chmod для rss.xml - 755, а безопасный режим отключен.

Я размещен на (mt) mediatemple.com на (dv), и сценарий работал нормально, когда я размещался на (gs) решении.

Я не могу найти, что не так = /

Ответы [ 6 ]

3 голосов
/ 23 января 2010

755 означает:

  • rwx: чтение, запись, выполнение для владельца
  • r-x: прочитать, выполнить для группы
  • r-x: читать, выполнять других

Итак, каждый может прочитать (и выполнить) этот файл, но только владелец может записать в него.

Может быть, пользователь, которому принадлежит файл, не тот, кто запускает ваш PHP-скрипт? файл может принадлежать кому угодно, пока ваш скрипт запускается пользователем Apache (часто www-data) ?


Первой идеей может быть удаление файла, пусть ваш скрипт попытается воссоздать его; если он воссоздан должным образом (что означает, что Apache обладает необходимыми правами write на директорию, в которой он находится) , он сможет изменить его после этого.

Иначе, вам следует попробовать предоставить write привилегию other - если ваш скрипт запускается другим пользователем, а не владельцем файла; chmod o+w rss.xml должен сделать трюк.

0 голосов
/ 13 января 2012

Создайте папку для хранения ваших файлов с разрешением 0777, а затем поместите в нее ваши файлы с низким уровнем разрешения 0644. Таким образом, каждый орган имеет доступ к папке, но не каждый может изменять файлы (0644) = вот что я нашел лучшее решение. другое менее безопасное решение - не создавать папку и просто изменить разрешение на файл на 666, или некоторые люди предпочитают 777 = не очень безопасное решение

0 голосов
/ 23 января 2010

На разных хостингах PHP запускает и обращается к файлам как

ВЛАДЕЛЕЦ или

ГРУППА или

МИР

Первый вариант - лучший для вас.

В этом случае вы должны установить файл perms 644, в последнем - 666.

Зачем устанавливать 777 и делать файл исполняемым, если вы храните там только данные?

0 голосов
/ 23 января 2010

Редактировать: я упустил из виду, что, как отмечают Паскаль Мартин и другие, 755 может означать, что файл на законных основаниях не доступен для записи, и вам, возможно, придется 777 или изменить его владельцев. Я оставляю этот ответ на месте, если все настроено правильно, а is_writable () по-прежнему возвращает false, что я и предполагал.

Одд. Об этом есть краткое обсуждение в is_writable Комментарии пользователей . Для парня, пишущего там, переход на PHP 5 решил (хотя я подозреваю, что это сервер / PHP / какой процесс выполняется как пользовательская проблема).

Что вы можете попробовать:

  • Узнайте, какой пользователь использует PHP, используя posix_getuid ()
  • Измените владельца файла, который вы пытаетесь записать, на на именно этого пользователя (не только группу)
  • Если это сработает, возможно, это какой-то сбой, и вам, возможно, придется подумать о том, чтобы попытаться выполнить fopen () и перехватить его сообщение об ошибке в случае сбоя.

И конечно: действительно ли файл fwrite () способен, когда вы обходите проверку ??

0 голосов
/ 23 января 2010

755 означает, что владелец файла может изменить его, но не кто-либо другой. Владелец, вероятно, не веб-сервер, а вы (ваша учетная запись FTP?), Поэтому PHP не может его изменить. Попробуйте дать ему более широкие убеждения. Начните с 775, и если это не сработает, попробуйте 777.

Есть несколько веб-хостов, на которых веб-сервер работает с тем же пользователем, что и ваша учетная запись FTP, поэтому они не получают вопросов о поддержке относительно прав доступа к файлам, но, на мой взгляд, это большая дыра в безопасности. Я думаю, что Mediatemple делает правильную вещь, чтобы не запускать веб-сервер в качестве вашей учетной записи FTP.

0 голосов
/ 23 января 2010

CHMOD 0755 означает, что только владелец файла может писать в него (группа и другие могут читать и выполнять). Вы должны изменить CHMOD на 0775 или даже 0777 в зависимости от пользователя / группы PHP.

...