Как мне дать PHP доступ на запись в каталог? - PullRequest
66 голосов
/ 25 мая 2010

Я пытаюсь использовать PHP для создания файла, но он не работает. Я предполагаю, что это потому, что у него нет прав на запись (это всегда было проблемой раньше). Я попытался проверить, была ли это проблема, создав папку chmod 0777, но в результате все скрипты в этом каталоге возвращали сообщение об ошибке 500, пока я не изменил его обратно. Как дать PHP доступ на запись к моей файловой системе, чтобы он мог создать файл?

Изменить: Он размещен на общем хостинге Hostgator с использованием Apache.

Редактировать 2: Кто-то спросил код: Код представляет собой скрипт изображения GD. Я знаю, что все остальное работает так, как раньше, я создавал образ каждый раз, когда его называли Теперь я пытаюсь создать их при добавлении нового текста и сохранить их в папке. У меня есть строка записи: imagejpeg (нуль, $ файл, 85);

Я также создал тестовый файл, чтобы проверить, был ли это просто сломанный скрипт (в основном, скопированный с tizag): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (Я не знаю, правильно ли / как разместить здесь код правильно. Вот содержимое скрипта PHP, за исключением тегов PHP.)

Возвращает 13,13,1 (отдельные строки), поэтому выглядит так, как будто думает, что что-то написал, но testfile.txt пуст (я загрузил пустую) или отсутствует (если я его удалю ).

Редактировать 3: Сервер работает под CentOS.

Ответы [ 11 ]

52 голосов
/ 25 мая 2010

Самый простой способ - позволить 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');

Это избавит вас от хлопот с разрешениями.

33 голосов
/ 25 мая 2010

Установите владельца каталога для пользователя, работающего с Apache. Часто никто не на Linux

chown nobody:nobody <dirname>

Таким образом, ваша папка не будет доступна для записи во всем мире, но все же будет доступна для записи для Apache:)

11 голосов
/ 30 марта 2018

Простое трехшаговое решение

Аннотация: Вам необходимо указать владельца каталога для пользователя, которого использует 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 должен иметь возможность записи в каталог.

8 голосов
/ 27 января 2016

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
4 голосов
/ 25 мая 2010

Вы можете изменить права доступа к папке с помощью PHP chmod (). Подробнее о том, как использовать команду, можно узнать здесь: http://php.net/manual/en/function.chmod.php

Если вы получаете 500 Ошибка при установке разрешений на 777 (доступно для записи), то это означает, что ваш сервер настроен на предотвращение выполнения таких файлов. Это сделано из соображений безопасности. В этом случае вы захотите использовать 755 в качестве максимальных разрешений для файла.

Если в папке, в которой вы выполняете документ PHP, есть файл error_log, вы захотите просмотреть несколько последних записей. Это даст вам представление о том, где скрипт не работает.

Для справки по работе с PHP-файлами я использую http://www.tizag.com/phpT/filewrite.php в качестве ресурса.

3 голосов
/ 07 января 2016

Лучший способ предоставления доступа для записи в каталог.

$dst = "path/to/directory";
mkdir($dst); 
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
3 голосов
/ 23 сентября 2015

Вы можете установить selinux для разрешения.

    # setenforce 0

Selinux войдет, но разрешит доступ. Так что вы можете проверить /var/log/audit/audit.log для деталей. Может быть, вам нужно будет изменить контекст selinux. Для этого вы будете использовать команду chcon. Если вам нужно, покажите нам ваш audit.log более подробный ответ.

Не забудьте включить selinux после того, как решите проблему. Лучше сохранить соблюдение selinux.

    # setenforce 1
3 голосов
/ 31 июля 2011

Я обнаружил, что с HostGator вы должны установить файлы на CMOD 644 и Folders на 755. Поскольку я делал это на основе их технической поддержки, он работает с HostGator

2 голосов
/ 23 декабря 2014

У меня была такая же проблема:

Поскольку я неохотно предоставлял 0777 в свой каталог php, Я создаю каталог tmp с правами 0777, где я создаю файлы, в которые мне нужно записать.

Мой каталог php по-прежнему защищен. Если кто-то взломает каталог tmp, сайт продолжит работать как обычно.

2 голосов
/ 23 марта 2013

chmod не позволяет вам установить владельца файла. Чтобы установить владельца файла, вы должны использовать команду chown.

...