5

以下 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 应该是什么来更改/制作/编辑文件/目录?是否应该以不同方式配置服务器?

4

2 回答 2

6

为了在文档根目录中创建文件,您的 PHP 进程必须具有写入目录的权限。通常(但不总是)PHP 以与 Web 服务器相同的用户身份运行。此用户的名称会因不同的系统而异。在 Ubuntu 和 Debian 上,用户被称为www-data,在其他系统上它可能只是www、 或apache、 或apache2。在某些系统上,它可能是root.

您可以通过检查服务器 superglobal: 的值来找出您的 PHP 以哪个用户身份运行 $_SERVER['USER']phpinfo()提供了一种查看此类内容的简单方法。通常,PHP 用户与 Web 服务器用户相同(但并非总是如此)。

设置目录所有权和权限完全是另一个主题 - 取决于您使用的操作系统,您对服务器的访问和权限以及许多其他内容。如果您需要这方面的指导,您可以从 serverfault.com 开始

祝你好运。


[编辑] 好的,如果您正在运行 as 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= 用户有读、写、执行;r-x= 组只有读取和执行;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/

在这种情况下,所有权是可以的,但该目录的所有者不可写。您可以通过为 owner 添加写入权限来解决此问题chmod u+w /var/www/blah/mydomain.com/htdocs

还有很多其他的变化,但也许这会有所帮助。

于 2010-10-31T00:32:19.740 回答
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');
于 2010-10-31T00:12:06.300 回答