PHP mkdir()和fopen()无法工作 - 权限问题?umask问题?

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应该是什么?服务器应该进行不同的配置吗?

PHP 生成了什么错误信息?如果它没有将其打印到 HTML 流中,那么它将会出现在服务器日志中。 - Lee
PHP警告:mkdir() [<a href='function.mkdir'>function.mkdir</a>]:在/var/www/blah/websitename.com/httpdocs/aaa.php的第13行被拒绝许可。 - matthewpavkov
我还应该补充一点,在这个服务器上,同一个账户下,我有一个完整的WordPress安装,它运行良好(上传文件、更新插件等)。 - matthewpavkov
啊,是的 - 你的PHP进程没有写入权限来创建目录(请参见下面我的答案)。你应该首先确保你正在传递正确的路径给mkdir。如果你已经确认你正在使用正确的路径,那么你肯定有一个权限问题 - 你需要授予文档根目录所需的权限,以便你的php进程可以写入它。如果你在服务器上没有管理员权限,那么这可能是系统管理员的任务。 - Lee
WordPress可能需要PHP能够写入doc_root。因此,我会确认您的$dir_to_make$file_to_make包含您认为的字符串。像这样打印它们,以免混淆:echo "[{$dir_to_make}]" - Lee
我已经回显了 $_SERVER ['DOCUMENT_ROOT'] 来确认我的文档根目录。 我一遍又一遍地确认过了。我想也许由于文档根目录中有一个句点,可能会引起一些问题。 我还尝试使用 mkdir('aaa')和 mkdir('./ aaa'),但没有成功。 日志中显示相同的权限错误。 - matthewpavkov
2个回答

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

您可以通过检查服务器超全局变量的值来找出PHP运行的用户: $ _SERVER ['USER'] phpinfo()提供了一种轻松查看此类内容的方法。通常,PHP用户与Web服务器用户相同(但并非总是如此)。

设置目录所有权和权限是另一个完全不同的主题-这取决于您所在的操作系统,服务器的访问权限和权限以及其他很多东西。如果您需要关于此的指针,您可以start at 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 = 用户拥有读、写、执行权限; r-x = 组只有读和执行权限; 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
还有很多其他变化,但也许这会有所帮助。

是的,它正在作为 Apache 运行。 - matthewpavkov
好的,请查看我的最近编辑,其中包含特定于用户 apache 的信息。 - Lee
哦,umask并不重要 - 它控制默认情况下将授予您创建的目录的权限。 但它不控制您是否可以创建目录或文件。 专注于让您的脚本在doc-root内创建目录。 一旦您完成了这项工作,然后再添加文件的创建。 如果您可以创建目录,但无法创建文件,则我们将讨论umask。;-) - Lee
好的,我认为这确实有所帮助。我不是这个服务器上的管理员,所以无法进行ssh等操作,但是我可以进入目录结构的较高层次,看到htdocs文件夹是由账户用户(网站名称)拥有的(此外,htdocs的组不是apache),权限为rwx r-x ---。因此,由于php是作为apache运行的(并且组也是apache,我非常确定),那么它将无法写入htdocs?这正确吗? - matthewpavkov
是的,没错。当您拥有这样的设置(其中htdocs目录由与vhost对应的用户拥有--在您的情况下为“websitename”)时...在这样的设置中,通常期望找到以CGI(或fastcgi)方式运行的php。使用该安排,apache作为其自己的用户(例如“apache”)运行,而使用suexec允许php作为vhost用户(例如“websitename”)运行--从而允许php具有对必要目录的写访问权限。如果这不是您的服务器上发生的情况,您可能需要与系统管理员进行交谈。 - Lee

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');

检查目录权限。 - lbedogni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接