PHP mkdir()和fopen()不起作用-权限问题?乌玛斯克问题?

PHP mkdir()和fopen()不起作用-权限问题?乌玛斯克问题?,php,fopen,mkdir,umask,Php,Fopen,Mkdir,Umask,以下PHP脚本无法创建目录。它也将无法创建文件(当目录已经存在时) ini\u集('error\u reporting',E\u ALL); 定义('ABSPATH',$\u服务器['DOCUMENT\u ROOT']); “回音路径。”; $dir_to_make=ABSPATH'/aaatest'; $file\u to\u make=ABSPATH'/aaatest/aaatest.txt'; echo umask(); mkdir($dir_to_make)或die('cannotcre

以下PHP脚本无法创建目录。它也将无法创建文件(当目录已经存在时)

ini\u集('error\u reporting',E\u ALL);
定义('ABSPATH',$\u服务器['DOCUMENT\u ROOT']);
“回音路径。”

; $dir_to_make=ABSPATH'/aaatest'; $file\u to\u make=ABSPATH'/aaatest/aaatest.txt'; echo umask()
; mkdir($dir_to_make)或die('cannotcreatedirectory'); fopen($file_to_make)或die('not open/create file');
umask()返回的值为18。文档根目录中有一个句点(/var/www/blah/websitename.com/httpdocs)


我不完全理解umask(),也不确定如何正确使用它。我不知道这是否是问题所在,但似乎确实有可能。我是否应该更改umask,创建文件/目录,然后再更改回去?要更改/生成/编辑文件/目录,umask应该是什么?服务器的配置是否应该有所不同?

您需要为fopen提供两个参数。 试着改变

fopen($file_to_make) or die('could not open/create file');


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

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

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

祝你好运


[编辑]好的,如果您运行的是
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
-第一个是拥有文件/目录的用户的名称,第二个是拥有文件/目录的组的名称

如果你看到这样的情况:

4 drwxr-xr-x 2 root apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/
它不起作用,因为目录属于
root
(非apache),即使它是按
apache
分组的,但目录不可组写,因此不会剪切它。在这个场景中,您只需添加组写入perm(
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
的写入权限来解决此问题


还有很多其他的变体,但这可能会有所帮助。

php生成的错误消息是什么?如果它没有将其打印到html流中,那么它将出现在服务器日志中。PHP警告:mkdir()[]:第13行/var/www/blah/websitename.com/httpdocs/aaa.PHP中的权限被拒绝。我还应该补充一点,在这个服务器上,在同一个帐户中,我已经完全安装了Wordpress,运行良好(上传文件、更新插件等).ah是的-您的PHP进程没有创建目录的写入权限(请参阅下面的答案)。您应该首先100%确定您正在向
mkdir
传递正确的路径。如果您已经确认使用了正确的路径,那么您肯定有权限问题-您需要授予文档根目录上的必要权限,以便您的php进程可以对其进行写入。如果您的服务器上没有管理权限,那么这可能是系统管理员的任务。wordpress可能要求PHP能够写入doc_root。因此,我要确认您的
$dir\u to\u make
$file\u to\u make
包含您认为它们包含的字符串。像这样打印出来,这样就不会有任何混淆:
echo“[{$dir\u to_make}]”是的,它以apache的形式运行。好的,请参阅我最近的编辑,了解特定于用户的信息
apache
哦,umask不重要-它控制默认情况下为您创建的目录授予的权限。但它不能控制是否可以创建目录或文件。重点是让脚本在文档根目录中创建目录。完成该工作后,再添加文件的创建。如果您可以创建目录,但无法创建文件,那么我们将讨论umask好的,我想这确实有帮助。我不是这台服务器上的管理员,所以不能使用ssh等等,但是,我可以在目录结构中走到足够高的位置,以查看文件夹htdocs是由帐户用户(websitename)(另外,htdocs的组不是apache)和rwx r-x----拥有的。所以,既然php是以apache的形式运行的(我敢肯定,这个组也是apache),那么它就不能写入htdocs了?对吗?对,对。当您有这样的设置时(在您的情况下,htdocs目录由与vhost--
websitename
相对应的用户拥有)。。。在这样的设置中,您通常希望发现php作为CGI(或fastcgi)运行。使用这种安排,apache作为自己的用户运行(例如,
apache4 drwxr-xr-x 2 root apache 4096 2010-07-22 20:54 /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/