PHP mkdir () и fopen () не работает - проблема с разрешениями?проблема с маской? - PullRequest
5 голосов
/ 31 октября 2010

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

Ответы [ 2 ]

6 голосов
/ 31 октября 2010

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

Вы можете узнать, каким пользователем работает ваш PHP, изучив значение суперглобального сервера: $_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 = у пользователя есть Чтение, Запись, eXecute; r-x = группа имеет только чтение и eXecute; r-x = у всех есть только Read и 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, каталог не доступен для записи в группе, поэтому порежь это. В этом сценарии вы можете просто добавить разрешения на групповую запись (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 голосов
/ 31 октября 2010

Вам нужно указать 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');
...