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

Следующий скрипт 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');