代码之家  ›  专栏  ›  技术社区  ›  matthewpavkov

PHP mkdir()和fopen()不工作-权限问题?乌马斯克问题?

  •  5
  • matthewpavkov  · 技术社区  · 15 年前

    以下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(),也不知道如何正确使用它。我不知道这是不是问题所在,但似乎是有可能的。我是否应该更改umask,创建文件/目录,然后再更改它?umask应该如何更改/生成/编辑文件/目录?是否应以不同的方式配置服务器?

    2 回复  |  直到 15 年前
        1
  •  6
  •   Community CDub    8 年前

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

    通过检查服务器superglobal的值,您可以了解PHP运行的用户: $_SERVER['USER'] phpinfo() 提供了一种简单的方法来看待这样的事情。通常,PHP用户与web服务器用户相同(但并不总是如此)。

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


    [编辑]好,如果您运行 ,您正在尝试在中创建新目录 /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/
    

    会的 工作,因为目录归 (不是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 .

        2
  •  2
  •   lbedogni    15 年前

    你需要给fopen提供两个参数。 尝试改变

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

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