chmod()传字符串"755"会静默失败,因php将其当十进制解析为八进制1363,实际权限不可控;正确写法仅三种:0755、octdec('755')或0o755(php 7.4+),且生产环境应避免0777,优先用chown配合0750等最小权限。

chmod()传字符串"755"直接失效,不是权限没改,是根本没生效
PHP的chmod()函数只认八进制整数,传"755"这种字符串会当十进制755处理,对应八进制是1363,取低三位后实际设成0755——但这是巧合,"777"就会变成0755(因为777的八进制是1411),你以为开了全权限,其实连写都开不了。
- ✅ 正确写法只有三种:
chmod($file, 0755)、chmod($file, octdec('755'))、chmod($file, 0o755)(PHP 7.4+) - ❌
chmod($file, "755")或chmod($file, "0777")全部静默失败,返回false但不报错 - 调试时加一句
var_dump(chmod($file, "755"));,十有八九输出bool(false),这就是线索
mkdir()里写"0777"照样白搭,umask才是幕后黑手
很多CI或Laravel项目在mkdir()时硬塞"0777",结果目录建出来永远是0755。这不是PHP bug,是系统umask在拦截——默认umask 0022会把0777 & ~0022算成0755。
- 临时解法:建目录前调
umask(0),但仅对当前进程有效,别漏了还原 - 更稳做法:先
mkdir($path, 0755),再单独chmod($path, 0777),绕过umask干扰 - 生产环境别碰
0777,用chown -R www-data:www-data $path+chmod 0750更安全
Web目录设0777=给攻击者铺路,尤其PHP文件能执行
把/var/www/html/upload/设成0777,等于允许任意登录用户往里扔shell.php并直接通过Nginx访问执行。PHP解释器不区分“上传文件”和“代码文件”,只要路径可访问、有x权限,就能运行。
- 上传目录正确权限:
chown :www-data upload/ && chmod 0775 upload/(组可写,其他人不可写) - 配置文件如
.env必须chmod 0600,0644都算高危 - 可执行脚本(如
artisan)只需chmod u+x,没必要开放组和其他人执行权
CI框架sess_save_path报错,八成不是权限问题而是路径写错了
CodeIgniter上线常见mkdir(): Invalid path错误,很多人立刻chmod -R 777,结果徒劳无功。真实原因是$config['sess_save_path']没拼出绝对路径,或者父目录根本不存在。
- 必须用
FCPATH . 'writable/sessions',不能写'writable/sessions'或./writable/sessions - 先确认
writable/目录存在,再设权限;缺x权限会导致PHP无法进入该目录写session -
var_dump($config['sess_save_path'])输出开头不是/var/www/...就说明路径拼错了
0777当成万能膏药反复乱贴——它掩盖了路径错误、属主错配、umask干扰这些真正要命的问题,还顺手给服务器开了后门。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











