Я установил права доступа к файлам 777, но я не могу записать в файл с PHP.
Я могу четко видеть в своем FTP-клиенте, что у файла есть разрешения 0777, и когда я это делаю:
echo (true === is_writable('file.txt')) ? 'yes' : 'no';
Я получаю «нет»;
Я также пробовал:
echo (true === chmod('file.txt', 0777)) ? 'yes' : 'no';
С тем же результатом.
Список каталогов выглядит примерно так:
public_html public 0777 css 0755 js 0755 file.txt 0777
И я использую файл .htaccess для перенаправления всего трафика на общедоступную вложенную папку. Конечно, я исключил файл из перезаписи (он доступен из браузера, который я проверил):
RewriteRule ^(file).* - [L]
Почему это?
Я думаю, Apache работает как другой пользователь / группа, чем пользователь / группа, владеющая файлом. В этом случае сам файл должен быть 0777
.
public
должен быть только 0777
если вы планируете добавлять файлы в папку с помощью PHP. Даже если сама папка не 0777
, если файл и папка имеет не менее 5
для пользователя ( read/execute
), вы должны иметь возможность записать в файл.
В конце концов, ваше дерево файлов должно выглядеть так:
public_html public file.txt 0777
Естественно, вы не сможете изменить эти разрешения с помощью PHP, но вы можете сделать это с вашего FTP-клиента.
Если он все еще не работает, PHP может работать в безопасном режиме, или вы можете использовать расширение, такое как PHP Suhosin. Вы можете получить лучший результат, изменив владельца файла на тот же пользователь / группу, на которой запущен скрипт.
Чтобы получить идентификатор пользователя / группы исполняемого пользователя, вы можете использовать следующее:
<?php echo getmyuid().':'.getmygid(); //ex:. 0:0 ?>
Затем вы можете использовать chown
(в терминале), чтобы изменить владельца файла:
> chown 0:0 file.txt
В opencart я столкнулся с этой ошибкой после установки vqmod и предоставления всех необходимых разрешений.
после исследования немного, нашел его.
«MODS CACHE PATH NOT WRITEABLE» на самом деле ссылается на папку vqmod, а не на папку кэша.
sudo chmod -R 777 vqmod
в корневом каталоге …..
Вы должны chmod файл сразу после его создания.
function Doo_Chmod($path, $chmod = null) { if (file_exists($path) === true) { if (is_null($chmod) === true) { $chmod = (is_file($path) === true) ? 644 : 755; if (in_array(get_current_user(), array('apache', 'httpd', 'nobody', 'system', 'webdaemon', 'www', 'www-data')) === true) { $chmod += 22; } } return chmod($path, octdec(intval($chmod))); } return false; }