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