Как предоставить PHP доступ для записи в каталог?
Я пытаюсь использовать PHP для создания файла, но он не работает. Я предполагаю, что это потому, что у него нет доступа к записи (это всегда было проблемой раньше). Я попытался проверить, была ли это проблема, сделав папку chmod 0777, но это просто закончилось тем, что каждый скрипт в этом каталоге возвращал сообщение об ошибке 500, пока я не изменил его обратно. Как предоставить PHP доступ для записи в мою файловую систему, чтобы он мог создать файл?
Edit: он размещен на хостинге Hostgator с помощью Apache.
Edit 2: Кто-то попросил код: Код-это сценарий изображения GD. Я знаю, что остальная часть работает так, как раньше я создавал изображение каждый ime, который он назывался. Сейчас я пытаюсь создать их при добавлении нового текста и сохранить их в папку. У меня есть строка для записи:: imagejpeg (null,$file,85);
Я также создал тестовый файл, чтобы проверить, был ли это просто сломанный скрипт (в основном скопированный из tizag): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (я не знаю, если / как правильно разместить код здесь. Вот содержимое PHP скрипта, минус PHP теги.)
он возвращает 13,13,1 (отдельные строки), поэтому похоже, что он думает, что он что-то написал, но тестовый файл.txt пуст (я загрузил пустой) или не существует (если я удалю его).
Edit 3: сервер работает CentOS.
11 ответов
очень простой способ-позволить 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');
Это избавит вас от хлопот с разрешениями.
задайте владельцу каталога пользователя, работающего под управлением apache. Часто никто на linux
chown nobody:nobody <dirname>
таким образом, ваша папка не будет доступна для записи в мире, но по-прежнему доступна для записи для apache:)
1st выясните, какой пользователь владеет процессом httpd, используя следующую команду
ps aux | grep httpd
вы получите несколько строк ответа, как это:
phpuser 17121 0.0 0.2 414060 7928 ? SN 03:49 0:00 /usr/sbin/httpd
здесь 1-й столбец показывает имя пользователя. Итак, теперь вы знаете пользователя, который пытается писать файлы, что в данном случае phpuser
Теперь вы можете идти вперед и установите разрешение для каталога, где ваш PHP-скрипт пытается что-то написать:
sudo chown phpuser:phpuser PhpCanWriteHere
sudo chmod 755 PhpCanWriteHere
Простое 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 теперь должен иметь возможность писать в каталог.
вы можете изменить разрешения папки с помощью chmod () PHP. Более подробная информация о том, как использовать команду здесь:http://php.net/manual/en/function.chmod.php
Если вы получаете ошибку 500 при установке разрешений на 777 (world writable), то это означает, что ваш сервер настроен для предотвращения выполнения таких файлов. Это делается по соображениям безопасности. В этом случае вы захотите использовать 755 в качестве самых высоких разрешений для файла.
Если есть error_log файл, который генерируется в папке, где вы выполняете документ PHP, вы хотите, чтобы просмотреть последние несколько записей. Это даст вам представление о том, где сценарий терпит неудачу.
для помощи в обработке файлов PHP я использую http://www.tizag.com/phpT/filewrite.php как ресурс.
Я узнал, что с HostGator вы должны установить файлы в CMOD 644 и папки в 755. Поскольку я сделал это на основе их технической поддержки, он работает с HostGator
вы можете установить selinux в permissive для анализа.
# setenforce 0
Selinux будет регистрироваться, но разрешать acesses. Таким образом, вы можете проверить /var/log/audit/audit.log
для сведения. Возможно, Вам понадобится изменить контекст selinux. Для этого вы будете использовать . Если вам нужно, покажите нам ваш audit.log
для более подробного ответа.
не забудьте включить SELinux после того, как вы решили проблему. Лучше держать selinux в силе.
# setenforce 1
chmod не позволяет установить право собственности на файл. Чтобы установить право собственности на файл, необходимо использовать команду chown.
У меня была та же проблема:
поскольку я не хотел давать 0777 в мой каталог php,Я создаю каталог tmp с правами 0777, где я создаю файлы, в которые мне нужно писать.
мой каталог php по-прежнему защищен. Если кто-то взломает каталог tmp, сайт продолжит работать как обычно.
лучший способ предоставления доступа на запись в каталог..
$dst = "path/to/directory";
mkdir($dst);
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
Я запускаю Ubuntu, и, как сказано выше, никто:никто не работает на Ubuntu. Вы получаете ошибку:
chown: invalid group: 'nobody:nobody'
вместо этого вы должны использовать "nogroup", например:
chown nobody:nogroup <dirname>