PHP无法创建文件夹mkdir()

5

我正在尝试使用PHP localhost/PhpProject3/create.php创建新文件夹:

<?php mkdir('newdir', 0777); ?>

但是这段代码并没有实现它。它也不起作用:
<?php mkdir('/var/www/PhpProject3/newdir',0777); ?> 

我安装了LAMP。我认为问题在于设置(可能是chmod?),因为PHP脚本可以正常工作。例如,我创建了一个简单的test.php:

<?php echo 'Great'; ?>

运行它:localhost/PhpProject3/test.php,结果很棒。

我使用Netbeans。 这里是文件:/var/www/PhpProject3。 我运行它:localhost/PhpProject3/... /etc/apache2/sites-available/default的内容如下:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

我也无法使用touch()创建文件。
有人能帮帮我吗?

很可能你没有权限在那里写入,Web服务器通常不允许对其提供的目录或文件进行写入操作(出于良好的原因)。如果你需要一个可写的目录,你需要显式地使用chmod命令来允许Web服务器在那里进行写入。只是不要在服务器根目录上执行此操作,而是尽可能指定一个子目录。 - Joachim Isaksson
3个回答

13

你的Web服务器以哪个用户身份运行?如果您编写以下命令,即可查看:

ps aux

请查看并确定用户是www-data(如果您使用Ubuntu,则是该用户)。

然后,将目录的所有权交给该用户,并授予该用户对该目录的写权限。

chown www-data /var/www/PhpProject3

以及

chmod u+w /var/www/PhpProject3

另一种选择是使用组权限。

chgrp www-data /var/www/PhpProject3

chmod g+w /var/www/PhpProject3

假设web服务器运行在组www-data下。


它可以工作,但我无法在Netbeans中创建新的php文件。如何更改chmod以创建、删除和编辑文件而不需要root权限? - user1518451
如果您不是root用户,则无法执行此操作。如果您敢于这样做,可以将目录设置为可写模式,即使用chmod a+w thedir命令。 - Anders Lindén
我无法将文件复制到“dir”文件夹中。我已将用户添加到www-data组并更改了权限:drwxrwxrwx 2 www-data www-data 4096 maj 4 19:13 dir。如何在dir文件夹中编辑文件(无需root权限)? - user1518451
如果文件已经存在,即使它们在可写目录中,如果文件权限本身不允许修改,则无法修改它们。目录可写性只能让你添加/删除目录中的文件。 - Anders Lindén
现在,当这个问题有些老旧时,我必须告诉你,我从不让Web服务器将文件存储在文件系统中,而是使用数据库。性能大致相同,但可以让您不必打开文件系统的限制。列类型可以是mediumblob(16M)或longblob(4G)。 - Anders Lindén

3

很难猜测真正的问题,我认为可能是权限或路径问题。您应该检查mkdir()的返回值:

if(!mkdir()) {
    print_r(error_get_last());
}

此外,您需要学习如何启用错误消息。如果mkdir()失败,它会触发一个错误消息。默认情况下禁用这些消息是因为在生产系统中可能存在安全风险。但是,在开发过程中,您必须启用它们。您可以在开发系统的php.ini中启用它:

php.ini:

...
display_errors=1
...
log_errors=1
...
error_log="/path/to/writable/file"
...
error_reporting=E_ALL

修改 php.ini 文件后,请不要忘记重新启动 Web 服务器。

-2

在CentOS 7中有一个私有的临时位置,特别是在使用PHP的mkdir命令时非常麻烦。

要禁用此行为,您可以在/usr/lib/systemd/system/httpd.service中设置PrivateTmp=false。

然后运行systemctl daemon-reload; systemctl restart httpd。

希望对您有所帮助。


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