2010-01-23 5 views
2

Я ожидаю, что проблема с функцией PHP FWRITE()is_writable() возвращают ложные

$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 и SafeMode выключен.

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

Я не могу найти то, что случилось =/

+0

Если вы удалите файл, может ли он его повторно создать? (Возможно, текущий файл принадлежит другому пользователю, к которому работает один PHP.) –

ответ

-1

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

+8

IMHO-настройка 777 является проблемой безопасности. Люди должны избегать хостеров, которые заставляют программистов задавать файл perms 777. Правильно? – Dan

+0

Согласитесь с @Dan - это плохое решение. –

+0

Можете ли вы удалить зеленую галочку из этого ответа? Это неправильное решение, и люди не должны этого делать на своих производственных серверах. – pfrenssen

3

755 означает:

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

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

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


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

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

0

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

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

0

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

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

Что вы могли бы попробовать:

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

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

0

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

ВЛАДЕЛЬЦА или

GROUP или

МИР

Первый вариант лучше для вас безопасность.

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

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

0

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

Смежные вопросы