Следующий скрипт PHP не может создать каталог. Он также не сможет создать файл (когда каталог уже существует).
ini_set('error_reporting', E_ALL); define('ABSPATH', $_SERVER['DOCUMENT_ROOT']); echo ABSPATH . '<br /><br />'; $dir_to_make = ABSPATH . '/aaatest'; $file_to_make = ABSPATH . '/aaatest/aaatest.txt'; echo umask() . '<br />'; mkdir($dir_to_make) or die('could not create directory'); fopen($file_to_make) or die('could not open/create file');
Функция umask () возвращает значение 18. У корня документа есть период в нем (/var/www/blah/websitename.com/httpdocs).
Я не совсем понимаю umask (), и я не уверен, как правильно его использовать. Я не знаю, проблема в этом или нет, но похоже, что это возможно. Должен ли я изменить umask, создать файл / каталог, а затем изменить его? Что нужно umask для изменения / создания / редактирования файлов / каталогов? Если сервер настроен по-разному?
Чтобы создать файл внутри корня документа, ваш PHP-процесс должен иметь права на запись в каталог. Обычно (но не всегда) PHP работает как тот же пользователь, что и веб-сервер. Имя этого пользователя будет отличаться в разных системах. На Ubuntu и Debian пользователь называется www-data
, а в других системах может быть только www
или apache
или apache2
. В некоторых системах это может быть root
.
Вы можете узнать, какой пользователь использует ваш PHP, изучая значение суперглобального сервера: $_SERVER['USER']
. phpinfo()
обеспечивает простой способ взглянуть на такие вещи. Обычно пользователь PHP такой же, как и пользователь веб-сервера (но не всегда).
настройка права на каталоги и права доступа – это еще одна тема – зависит от того, в какой операционной системе вы находитесь, о том, какие права доступа и разрешения у вас есть для сервера, и многое другое. Если вам нужны указатели на это, вы можете начать с serverfault.com .
удачи.
[edit] ОК, если вы запускаете apache
, и вы пытаетесь создать свой новый каталог в /var/www/blah/mydomain.com/htdocs/
… тогда, когда вы запустите:
> ls -splad /var/www/blah/mydomain.com/htdocs
вы ожидаете увидеть что-то вроде:
4 drwxr-xr-x 2 apache apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/
есть две интересные части:
drwxr-xr-x
означает: d
= каталог; rwx
= пользователь имеет чтение, запись, eXecute; rx
= группа имеет только Read и eXecute; rx
= каждый имеет только Чтение и eXecute.
и apache apache
– первое имя пользователя, которому принадлежит файл / каталог, второй – имя группы, которой принадлежит файл / каталог.
поэтому, если вы видели что-то вроде этого:
4 drwxr-xr-x 2 root apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/
это не сработает, потому что каталог принадлежит root
(а не apache), и даже если он сгруппирован с помощью apache
, каталог не является групповым, поэтому он не сокращает его. В этом случае вы можете просто добавить групповые записи perms ( chmod g+w /var/www/blah/mydomain.com/htdocs
), и вам хорошо идти.
Что-то еще, что вы можете увидеть, это:
4 drw-r-xr-x 2 apache apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/
В этом случае право собственности одобрено, но его владелец не может записать. Вы можете исправить это, добавив разрешение на запись для владельца chmod u+w /var/www/blah/mydomain.com/htdocs
.
есть много других вариантов, но, возможно, это поможет.
Вам нужно предоставить 2 аргумента для fopen. Попробуйте изменить
fopen($file_to_make) or die('could not open/create file');
в
fopen($file_to_make,'w') or die('could not open/create file');