PHP mkdir()和fopen()不起作用 - 权限问题? umask问题?

时间:2010-10-31 00:01:16

标签: php fopen mkdir 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应该改变/制作/编辑文件/目录是什么?是否应该以不同的方式配置服务器?

2 个答案:

答案 0 :(得分:6)

要在文档根目录中创建文件,您的PHP进程必须具有写入目录的权限。通常(但不总是)PHP以与Web服务器运行的用户相同的方式运行。该用户的名称因系统而异。在Ubuntu和Debian上,用户被称为www-data,在其他系统上,它可能只是wwwapacheapache2。在某些系统上,它可能是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');