PHP mkdir() и fopen() не работают - проблема с разрешениями? проблема с маской?

Следующий 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 для изменения/создания/редактирования файлов/каталогов? Должен ли сервер быть настроен по-другому?


person matthewpavkov    schedule 31.10.2010    source источник
comment
какое сообщение об ошибке выдает php? если он не распечатывает его в поток html, то он будет в журнале сервера.   -  person Lee    schedule 31.10.2010
comment
Предупреждение PHP: mkdir() [‹a href='function.mkdir'›function.mkdir‹/a›]: доступ запрещен в /var/www/blah/websitename.com/httpdocs/aaa.php в строке 13   -  person matthewpavkov    schedule 31.10.2010
comment
Я также должен добавить, что на этом сервере, в той же учетной записи, у меня есть полная установка Wordpress, которая работает нормально (загрузка файлов, обновление плагинов и т. д.).   -  person matthewpavkov    schedule 31.10.2010
comment
ах да - у вашего PHP-процесса нет прав на запись для создания каталога (см. Мой ответ ниже). Сначала вы должны быть на 100 % уверены, что передаете правильный путь к mkdir. Если вы подтвердили, что используете правильный путь, то у вас определенно есть проблема с разрешениями — вам нужно предоставить необходимые разрешения для корневого каталога документа, чтобы ваш php-процесс мог писать в него. Если у вас нет прав администратора на вашем сервере, это может быть задачей для системного администратора.   -  person Lee    schedule 31.10.2010
comment
wordpress (вероятно) потребует, чтобы PHP мог писать в doc_root. Поэтому я бы подтвердил, что ваши $dir_to_make и $file_to_make содержат строки, которые, как вы думаете, они содержат. распечатайте их так, чтобы не было путаницы: echo "[{$dir_to_make}]"   -  person Lee    schedule 31.10.2010
comment
Я повторил $_SERVER['DOCUMENT_ROOT'], чтобы подтвердить корневой каталог моего документа. Я подтверждал это снова и снова. Я подумал, что, может быть, поскольку в корне документа есть точка, это может сбить с толку. Я также пробовал mkdir('aaa') и mkdir('./aaa') безуспешно. Та же ошибка разрешений в журнале.   -  person matthewpavkov    schedule 31.10.2010


Ответы (2)


Чтобы создать файл в корневом каталоге документа, ваш PHP-процесс должен иметь права на запись в каталог. Обычно (но не всегда) PHP работает от имени того же пользователя, от имени которого работает веб-сервер. Имя этого пользователя будет различаться в разных системах. В Ubuntu и Debian пользователь называется www-data, в других системах это может быть просто www, или apache, или apache2. В некоторых системах это может быть root.

Вы можете узнать, под каким пользователем работает ваш PHP, изучив значение сервера superglobal: $_SERVER['USER']. phpinfo() предоставляет простой способ взглянуть на подобные вещи. Обычно пользователь PHP совпадает с пользователем веб-сервера (но не всегда).

установка владельца каталога и разрешений - это совсем другая тема - зависит от того, в какой операционной системе вы работаете, какой доступ и разрешения у вас есть для сервера и от многих других вещей. Если вам нужны указатели на это, вы можете начать с serverfault.com.

удачи.


[править] Хорошо, если вы работаете как 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 = у пользователя есть чтение, запись, выполнение; r-x = группа имеет только чтение и выполнение; r-x = у всех есть только чтение и выполнение.

и apache apache - первое имя пользователя, которому принадлежит файл/каталог, второе имя группы, которой принадлежит файл/каталог.

так что если вы видели что-то вроде этого:

4 drwxr-xr-x 2 root apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/

это не будет работать, потому что каталог принадлежит root (не apache), и хотя он сгруппирован apache, каталог не доступен для групповой записи, так что это не мешает. В этом сценарии вы можете просто добавить права групповой записи (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.

есть много других вариантов, но, возможно, это поможет.

person Lee    schedule 31.10.2010
comment
Да, он работает как апач. - person matthewpavkov; 31.10.2010
comment
хорошо, см. мое недавнее изменение для информации, относящейся к пользователю apache - person Lee; 31.10.2010
comment
о, и umask не имеет значения - он управляет разрешениями, которые будут даны по умолчанию для каталогов, которые вы создаете. Но это не влияет на то, можете ли вы создать каталог или файл. Сосредоточьтесь на том, чтобы ваш скрипт создал каталог внутри doc-root. как только вы это заработаете, добавьте создание файла. Если вы можете создать каталог, но не можете создать файл, тогда мы поговорим об umask. ;-) - person Lee; 31.10.2010
comment
Хорошо, я думаю, это поможет. Я не являюсь администратором на этом сервере, поэтому не могу использовать ssh и т. д., однако я могу подняться достаточно высоко в структуре каталогов, чтобы увидеть, что папка htdocs принадлежит пользователю учетной записи (имя веб-сайта) (также группа для htdocs не apache) с rwx r-x ---. Итак, поскольку php работает как apache (и группа тоже apache, я почти уверен), то он не сможет писать в htdocs? Это правильно? - person matthewpavkov; 31.10.2010
comment
Да, это правильно. Когда у вас есть такая настройка (где каталог htdocs принадлежит пользователю, который соответствует vhost -- websitename в вашем случае)... в такой настройке вы обычно ожидаете найти php, работающий как CGI (или fastcgi) . При таком расположении apache работает как собственный пользователь (например, apache), в то время как suexec используется, чтобы позволить php работать от имени пользователя vhost (например, websitename), что позволяет php иметь доступ на запись в необходимые каталоги. Если это не то, что происходит на вашем сервере, вы можете поговорить с системным администратором. - person Lee; 31.10.2010

Вам нужно предоставить 2 аргумента для fopen. Попробуйте изменить

fopen($file_to_make) or die('could not open/create file');

to

fopen($file_to_make,'w') or die('could not open/create file');
person lbedogni    schedule 31.10.2010
comment
Проверьте права доступа к каталогу. - person lbedogni; 31.10.2010