Как предоставить PHP доступ на запись в каталог?

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

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

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

Я также создал тестовый файл, чтобы проверить, был ли он просто сломанным скриптом (главным образом, скопированным из tizag): http://img.ruphp.com/php/lesig.jpg/testfile.txt (я не знаю, можно ли / код здесь правильно. Вот содержимое PHP-скрипта, минус теги PHP.)

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

Редактирование 3: сервер запускает CentOS.

Очень простой способ – позволить 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) ) { $oldmask = umask(0); // helpful when used in linux server 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 

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

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

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

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

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

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

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

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

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

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

  # setenforce 0 

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

Не забудьте включить selinux после решения проблемы. Это лучше держать selinux принудительным.

  # setenforce 1 

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

 $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>