以下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应该改变/制作/编辑文件/目录是什么?是否应该以不同的方式配置服务器?
答案 0 :(得分:6)
要在文档根目录中创建文件,您的PHP进程必须具有写入目录的权限。通常(但不总是)PHP以与Web服务器运行的用户相同的方式运行。该用户的名称因系统而异。在Ubuntu和Debian上,用户被称为www-data
,在其他系统上,它可能只是www
,apache
或apache2
。在某些系统上,它可能是root
。
通过检查服务器超全局的值,您可以找到PHP运行的用户:$_SERVER['USER']
。 phpinfo()
提供了一种简单的方法来查看这样的内容。通常,PHP用户与Web服务器用户相同(但并非总是如此)。
设置目录所有权和权限完全是另一个主题 - 取决于您所使用的操作系统,您对服务器的访问权限以及许多其他内容。如果您需要此指针,可以start at 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
=用户有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
分组,该目录也不是可写组的这样就不会削减它。在这种情况下,您只需添加组写权限(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
添加写入权限来解决此问题。
还有很多其他的变化,但也许这会有所帮助。
答案 1 :(得分:2)
你需要为fopen提供2个参数。 尝试更改
fopen($file_to_make) or die('could not open/create file');
到
fopen($file_to_make,'w') or die('could not open/create file');