Laravel从.env加载八进制权限至PHP mkdir时丢失前导0的问题
解决Laravel中.env权限字符串转mkdir模式的问题
嘿,刚接触PHP/Laravel踩这个坑太正常了!我当初也懵了好久,其实核心是PHP对八进制数的处理规则,还有mkdir()函数的mode参数要求。
为什么会出问题?
先理清楚关键几点:
.env里的0755本质是字符串,Laravel读取后返回的还是字符串类型的"0755"。mkdir()的mode参数要求的是十进制整数,这个整数对应的是八进制的权限值。比如八进制0755转成十进制是493,这才是mkdir()真正认的数值。- 当你把字符串
"0755"直接传给mkdir(),或者用intval()转成整数时,PHP会默认按十进制解析,得到755(十进制)。这个数对应的八进制是1363,所以创建的目录权限完全不对。
几种可行的解决方法
方法1:用octdec()函数转换(最直观)
直接在调用mkdir()时,把配置里的字符串转成正确的十进制整数:
mkdir($this->bakDir, octdec(config('app.dbBackupDirPerms')));
octdec()专门用来把八进制格式的字符串转成十进制整数,不管你.env里写的是0755还是755,它都能正确输出493,完美匹配mkdir()的要求。
方法2:在配置文件里提前处理
如果不想每次调用都写octdec(),可以在config/app.php里直接处理好:
'dbBackupDirPerms' => octdec(env('DB_BACKUP_DIR_PERMS', '0755')),
之后调用config('app.dbBackupDirPerms')时,拿到的已经是493这个正确的十进制整数,直接传给mkdir()就行:
mkdir($this->bakDir, config('app.dbBackupDirPerms'));
方法3:直接存十进制值(不推荐,不够直观)
你可以把八进制0755转成十进制493,然后在.env里写:
DB_BACKUP_DIR_PERMS=493
这样直接取配置传mkdir()也能生效,但缺点是没人能一眼看出493对应0755权限,维护起来很麻烦,所以不推荐这种方式。
补充说明
你提到“以为mkdir不会做类型检查”,其实mkdir()确实会自动转换参数类型,但问题出在转换规则上:PHP把字符串转成整数时,默认是十进制解析,而不是八进制。只有当你明确用octdec()或者在代码里写原生八进制数(比如0755)时,才能得到正确的数值。
内容的提问来源于stack exchange,提问作者ohhh
相关产品推荐
相关产品推荐

