Как я могу дать PHP доступ на запись в каталог?
Я пытаюсь использовать PHP для создания файла, но он не работает. Я предполагаю, что это потому, что у него нет доступа к записи (это всегда было проблемой раньше). Я попытался проверить, была ли это проблема, сделав папку chmod 0777, но это просто закончилось тем, что каждый скрипт в этом каталоге вернул сообщение об ошибке 500, пока я не изменил его обратно.
Как я могу предоставить PHP доступ на запись в мою файловую систему, чтобы он мог создать файл?
изменить: он размещен на общем хостинге Hostgator с помощью Apache.
редактировать 2: Кто-то попросил код:
Код-это скрипт изображения GD. Я знаю, что все остальное работает так, как раньше я создавал образ каждый ime, который он называл. Сейчас я пытаюсь создать их при добавлении нового текста и сохранить их в папку. Строка записи у меня есть:
imagejpeg(null,$file, 85);
Я также создал тестовый файл, чтобы проверить, был ли это просто сломанный скрипт (в основном скопированный из tizag):
http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (я не знаю, если/как разместить код здесь правильно. Вот содержание PHP скрипта, минус PHP теги.)
он возвращает 13,13,1 (отдельные строки), поэтому похоже, что он думает, что написал что-то, но тестовый файл.txt пуст (я загрузил пустой) или не существует (если я удалю его).
изменить 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:)
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-скрипт пытается что-то написать: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 0Selinux будет регистрировать, но разрешать асы. Так что вы можете проверить
/var/log/audit/audit.logдля сведения. Возможно, Вам понадобится изменить контекст selinux. Для этого вы будете использовать . Если вам нужно, покажите нам вашaudit.logдля более подробного ответа.не забудьте включить 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>
Comments