首先, php创建目录的函数mkdir($dir, $mod , $recursive),该函数也可以递归创建多级目录. 只要在第三个参数$recursive传入true就行.而$mod参数是定义新创建目录的权限值(八进制).
但是我们设置了$mod后实际创建的目录的并非与我们预期一样, 因为最终目录的权限值 = $mod - umask; 而这个umask通常为022, 所以有些情况下, 你创建多级目录时报错权限不足有可能就是减去umask后的权限值不够的.所以我们只要在创建目录时临时将umask值设置为0即可.(但注意官网提示改变umask不建议在多线程中使用,因为他们使用的是同一个umask, 不过我们通常所用的nginx+php-fpm或者Apache+php都是单线程多进程模式,所以不会有这个问题)
最后封装号的函数如下:
//$dir: 要创建的目录
//$mod: 新创建目录的权限,要传入8进制数字(八进制数字都是以0开头的数字)
//返回值: 返回true表示创建成功,false表示创建失败
function createDir($dir, $mod = 0777)
{
$old = umask(0);
if (is_dir($dir)) {
return true;
}
try {
return mkdir($dir, $mod, true);
} catch (\Exception $e) {
//$e->getMessage()错误信息,此处可以按照自己需要编写记录错误信息日志
return false;
} finally {
umask($old);
}
}