mkdir()操作权限被拒绝

8
当我试图在服务器上调用mkdir()函数时,出现以下错误...
警告:mkdir() [function.mkdir]: /home/server/public_html/wp-content/themes/mytheme/catimages/cat-images.php 第373行上的拒绝访问。
该函数如下。它试图在网站的“wp-content/uploads”文件夹下创建一个文件夹。我已经验证了PHP版本为5.2.15,主题文件夹内的文件是可写的,但这并不意味着uploads文件夹是可写的,我认为。
如何确定uploads文件夹是否是可写的?
protected function category_images_base_dir()
{
    // Where should the dir be? Get the base WP uploads dir
    $wp_upload_dir = wp_upload_dir();
    $base_dir = $wp_upload_dir[ 'basedir' ];
    // Append our subdir
    $dir = $base_dir . '/cat-images';
    // Does the dir exist? (If not, then make it)
    if ( ! file_exists( $dir ) ) {
        mkdir( $dir ); //THIS IS LINE 373
    }
    // Now return it
    return $dir;
}

这是有趣的:你怎么知道呢?-> 如果你收到“警告:...权限被拒绝...”,那么你就可以确定该文件夹不可被Web服务器用户写入。如果你有SSH访问权限,请执行chmod -R 777 /home/server/public_html/wp-content,如果没有SSH访问权限,则可以打开你最喜欢的FTP客户端,浏览到wp-content文件夹,然后右键单击wp-content,大多数FTP客户端都会在附近有一个权限选项卡或框,你可以使用它来更改权限。 - Poelinca Dorin
6
如果可以的话,我会给那个东西点“踩”。你是认真建议他将目录设置为全球可读,这样问题就解决了吗?! - Linus Kleen
@Linus Kleen:他的wp-content文件已经是全球可读的,毫无疑问。它们不可写,看起来他需要访问并写入一些文件,你会怎么做?你测试文件夹是否可写,如果不行,就不再写入文件了?这是一个解决方案吗?你是对的,应该是chmod -R 777 /home/server/public_html/wp-content/uploads,或者更好的是chown -R "webserveruser" /home/server/public_html/wp-content/uploads - Poelinca Dorin
@Piskvor:你说得完全正确,但是大多数共享主机公司不允许SSH访问,他们甚至不会告诉你有关组的任何信息,甚至是web服务器用户。你可能需要给他们打电话或提交工单,然后等待他们执行此操作,因此我一开始推荐了777权限。 - Poelinca Dorin
@poelinca:确实,这就是“花几个小时编码来解决问题,可以省下十分钟的电话咨询”的方法。 - Piskvor left the building
显示剩余2条评论
2个回答

7

is_writable()可能是您要查找的函数。

http://cz.php.net/manual/en/function.is-writable.php说:

如果文件名存在且可写,则返回TRUE。 文件名参数可以是目录名称,从而允许您检查目录是否可写。

此外,下一行直接与本题相关:

请记住,PHP可能会将文件访问为Web服务器运行的用户ID(通常为“ nobody”)。

换句话说,请检查您的目录是否可由Web服务器的用户ID写入-这可能是不同于您的用户ID的用户ID!设置适当的权限-例如,将文件夹的用户组设置为服务器用户的用户组,并授予组读取、写入和执行权限。 (chgrp somegroup uploads; chmod g+r uploads; chmod g+w uploads; chmod g+x uploads)


感谢您提供出色的答案。我将插入一些额外的代码检查来验证父文件夹的is_writable()状态,并在该事件中添加异常处理。 - Scott B

1
确保父目录对于 Web 服务器的运行进程是可写的。
编辑:哎呀,过早回复了。你的主机是否提供 GUI 文件浏览器?

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