以下PHP脚本无法创建目录.它也将无法创建文件(当目录已存在时).
ini_set('error_reporting', E_ALL); define('ABSPATH', $_SERVER['DOCUMENT_ROOT']); echo ABSPATH . '
'; $dir_to_make = ABSPATH . '/aaatest'; $file_to_make = ABSPATH . '/aaatest/aaatest.txt'; echo umask() . '
'; 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以与Web服务器运行的用户相同的方式运行.该用户的名称因系统而异.在Ubuntu和Debian上,用户被调用www-data
,在其他系统上它可能只是www
,或apache
,或apache2
.在某些系统上,它可能是root
.
您可以通过检查服务器超全局的值来找出PHP运行的用户: $_SERVER['USER']
. phpinfo()
提供一个简单的方法来看看这样的东西.通常,PHP用户与Web服务器用户相同(但并非总是如此).
设置目录所有权和权限完全是另一个主题 - 取决于您所使用的操作系统,您对服务器的访问权限以及许多其他内容.如果您需要这方面的指针,可以从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
=用户有Read,Write,eXecute; r-x
= group只有Read和eXecute; 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
,该目录是不是组可写,这样不剪.在这种情况下,你可以简单地添加group write 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
.
还有很多其他的变化,但也许这会有所帮助.