Как предоставить PHP доступ на запись в каталог?
Я пытаюсь использовать PHP для создания файла, но он не работает. Я предполагаю, что это потому, что у него нет доступа на запись (это всегда было проблемой раньше). Я попытался проверить, если это была проблема, создав папку chmod 0777, но это только закончилось тем, что каждый script в этом каталоге возвращал сообщение об ошибке 500, пока я не изменил его.
Как предоставить PHP-доступ для записи в мою файловую систему, чтобы он мог создать файл?
Изменить: он размещен на хостинге Hostgator с использованием Apache.
Изменить 2: Кто-то спросил код:
Код представляет собой изображение GD script. Я знаю, что все остальное работает, как и раньше, я создавал изображение, каждый из которых был вызван. Теперь я пытаюсь создать их при добавлении нового текста и сохранить их в папке. У меня есть строка записи:
imagejpeg (нуль, $файл, 85);
Я также создал тестовый файл, чтобы проверить, был ли он просто сломанным script (в основном, копируется из tizag):
http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (я не знаю, правильно ли разместить код здесь. Вот содержимое PHP скрипт, минус PHP-теги.)
Он возвращает 13,13,1 (отдельные строки), поэтому кажется, что он что-то написал, но файл testfile.txt пуст (я загрузил пустой) или не существует (если я его удалю).
Изменить 3: Сервер запускает CentOS.
Ответы
Ответ 1
Самый простой способ - позволить PHP создать сам каталог.
<?php
$dir = 'myDir';
// create new directory with 744 permissions if it does not exist yet
// owner will be the user/group the PHP script is run under
if ( !file_exists($dir) ) {
mkdir ($dir, 0744);
}
file_put_contents ($dir.'/test.txt', 'Hello File');
Это избавит вас от хлопот с разрешениями.
Ответ 2
Установите владельца каталога пользователю, использующему apache. Часто никто на linux
chown nobody:nobody <dirname>
Таким образом, ваша папка не будет доступна для записи в мире, но все еще доступна для записи для apache:)
Ответ 3
Простое трехэтапное решение
Аннотация: Вы должны установить владельца каталога пользователю, используемому PHP (пользователь веб-сервера).
Шаг 1. Определение пользователя PHP.
Создайте файл PHP, содержащий следующее:
<?php echo 'whoami'; ?>
Загрузите его на свой веб-сервер. Результат должен быть похож на следующий:
www-data
Таким образом, пользователь PHP является www-data
.
Шаг 2: Определите владельца каталога
Затем проверьте сведения о веб-каталоге через командную строку:
ls -dl /var/www/example.com/public_html/example-folder
Результат должен быть похож на следующий:
drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder
Поэтому владельцем каталога является exampleuser1
.
Шаг 3: Изменить владельца каталога на пользователя PHP
Затем измените владельца веб-каталога на пользователя PHP:
sudo chown -R www-data /var/www/example.com/public_html/example-folder
Убедитесь, что владелец веб-каталога был изменен:
ls -dl /var/www/example.com/public_html/example-folder
Результат должен быть похож на следующий:
drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder
Поэтому владелец example-folder
успешно был изменен на пользователя PHP: www-data
.
Готово! Теперь PHP должен иметь возможность писать в каталог.
Ответ 4
1 Выясните, какой пользователь владеет httpd-процессом, используя следующую команду
ps aux | grep httpd
вы получите несколько ответных строк следующим образом:
phpuser 17121 0.0 0.2 414060 7928 ? SN 03:49 0:00 /usr/sbin/httpd
Здесь 1-й столбец показывает имя пользователя. Итак, теперь вы знаете пользователя, который пытается записать файлы, что в данном случае phpuser
Теперь вы можете пойти и установить разрешение для каталога, где ваш php script пытается что-то написать:
sudo chown phpuser:phpuser PhpCanWriteHere
sudo chmod 755 PhpCanWriteHere
Ответ 5
Вы можете изменить права доступа к папке с помощью PHP chmod(). Дополнительная информация о том, как использовать команду, приведена здесь: http://php.net/manual/en/function.chmod.php
Если вы получаете ошибку 500 при настройке разрешений на 777 (доступно для записи в мире), значит, ваш сервер настроен на предотвращение выполнения таких файлов. Это делается по соображениям безопасности. В этом случае вы захотите использовать 755 как самые высокие разрешения для файла.
Если есть файл error_log, который создается в папке, где выполняется PHP-документ, вам нужно просмотреть последние несколько записей. Это даст вам представление о неудаче script.
Для справки по обработке файлов PHP я использую http://www.tizag.com/phpT/filewrite.php в качестве ресурса.
Ответ 6
Я узнал, что с HostGator вам нужно установить файлы на CMOD 644 и Folders на 755. Поскольку я сделал это на основе их технической поддержки, он работает с HostGator
Ответ 7
Вы можете настроить selinux на разрешающую способность для анализа.
# setenforce 0
Selinux будет регистрироваться, но разрешать acesses. Поэтому вы можете проверить /var/log/audit/audit.log
для деталей. Возможно, вам понадобится изменить selinux-контекст. Для этого вы будете использовать команду chcon
. Если вам нужно, покажите нам свой audit.log
более подробный ответ.
Не забудьте включить selinux после того, как вы решите проблему. Это лучше держать selinux принудительным.
# setenforce 1
Ответ 8
Лучший способ предоставить доступ к записи в каталог.
$dst = "path/to/directory";
mkdir($dst);
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
Ответ 9
chmod не позволяет вам установить право собственности на файл. Чтобы установить право собственности на файл, вы должны использовать команду chown.
Ответ 10
У меня была та же проблема:
Поскольку я не хотел давать 0777 в мой каталог php, , я создаю каталог tmp с правами 0777, где я создаю файлы, которые мне нужно записать.
Мой php-каталог по-прежнему защищен. Если кто-то взломает каталог tmp, сайт продолжает работать как обычно.
Ответ 11
Я запускаю Ubuntu, и, как было сказано выше, никто не работает на Ubuntu. Вы получите сообщение об ошибке:
chown: invalid group: 'nobody:nobody'
Вместо этого вы должны использовать "nogroup", например:
chown nobody:nogroup <dirname>