Я пытаюсь использовать 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>