PHP脚本(/js-calls/file.php)调用mkdir创建目录失败,求排查原因
c_folder目录的常见原因及排查方案 先看一下你的代码片段:
$target_dir = "/img-posts/c_folder"; if(!file_exists($target_dir)){ mkdir($target_dir); }
下面是几个最可能导致创建失败的原因,以及对应的排查和解决方法:
Web服务器权限不足:这是最常见的问题。Web服务(比如Apache、Nginx)运行时使用的用户(通常是
www-data、apache或nginx)需要对/img-posts目录拥有写入权限。你可以通过命令行查看目录的权限和所有者:ls -ld /img-posts如果所有者不是Web服务器用户,或者没有写入权限,你可以用以下命令调整:
chown www-data:www-data /img-posts chmod 755 /img-posts # 若需要组用户也能写入,可改成775绝对路径指向错误:你用的
/img-posts/c_folder是服务器的系统根目录路径,而不是网站的根目录。很多时候网站文件是放在/var/www/html/这类子目录下,如果你想指向网站根目录下的img-posts,应该基于网站根路径来构建目标目录:// 利用系统变量获取网站根目录,拼接目标路径 $target_dir = $_SERVER['DOCUMENT_ROOT'] . "/img-posts/c_folder";不然你可能在系统根目录下找
img-posts,而不是你实际创建的那个目录。mkdir函数缺少必要参数:默认情况下
mkdir创建目录的权限可能不符合要求,而且如果父目录权限设置严格,也会导致创建失败。你可以加上权限参数(比如八进制的0755),同时开启递归创建(即使父目录存在,这个参数也不会有问题):mkdir($target_dir, 0755, true);注意权限参数前面的
0不能省略,因为这是八进制数的标识。SELinux安全限制:如果你的服务器开启了SELinux,它可能会阻止Web服务器写入目录。你可以临时关闭SELinux测试是否是这个原因:
setenforce 0如果关闭后能成功创建目录,就需要调整SELinux的上下文规则,让Web服务器有权限写入该目录:
chcon -R -t httpd_sys_rw_content_t /img-posts路径大小写或拼写错误:Linux系统是严格区分大小写的,如果你实际创建的目录是
/Img-Posts或者/img_posts,那代码里的路径就不匹配,自然创建不了。仔细核对一下路径的拼写和大小写。
最后,建议你给mkdir加上错误捕获,这样能直接看到具体的失败原因,方便快速排查:
if(!file_exists($target_dir)){ if (!mkdir($target_dir, 0755, true)) { die('创建目录失败:' . error_get_last()['message']); } }
内容的提问来源于stack exchange,提问作者RGS

