Подтвердить что ты не робот

Как предоставить 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.

4b9b3361

Ответ 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>