thinkphp runtime目录写权限不生效,首要确认web进程用户身份(如www-data、nginx或apache),再用chown正确授权并设755权限;避免777,同时检查父目录权限、selinux、open_basedir及路径映射是否准确。

runtime 目录写权限不生效?先确认 Web 用户身份
ThinkPHP 启动后报 failed to open stream: Permission denied,八成是 runtime/ 目录对当前 Web 进程用户没写权。Ubuntu/Debian 下通常是 www-data,CentOS/RHEL 默认是 nginx 或 apache,不能凭经验硬套。
- 用
ps aux | grep nginx或ps aux | grep apache2查实际运行用户 - 执行
chown -R www-data:www-data runtime/(Ubuntu)或chown -R nginx:nginx runtime/(CentOS) - 权限设为
755即可:chmod -R 755 runtime/,别用777——安全扫描直接标红 - 父目录如
/var/www/html/至少要755,否则 Web 用户连目录都进不去
public/uploads/ 目录能写但不能执行 PHP
上传目录设成可写还不够,必须防住上传 shell.php 这类攻击。TP 默认不拦截,得靠 Web 服务器配置主动封杀。
- 上传目录建议建在
public/uploads/,别塞进runtime/——TP 清理缓存时会顺手删掉上传文件 - Nginx 中加这段限制:
location ~ ^/uploads/.*\.php$ { deny all; } - Apache 则在
public/uploads/.htaccess里写:php_flag engine off - 目录权限设为
755,并确保属主是 Web 用户:chown -R www-data:www-data public/uploads/
move() 成功却找不到文件?路径和磁盘配置对不上
调用 $file->move('uploads') 返回成功,但去 uploads/ 目录里翻不到文件,大概率是路径解析错了。
-
move()的第一个参数是相对路径,基准是项目根目录,不是public/;如果想存到public/uploads/,得传../public/uploads或用绝对路径 - 更稳妥的做法是走
Filesystem::disk('public'),它会自动映射到public/storage/,且支持软链接访问 - 检查
config/filesystem.php里public磁盘的root是否指向app()->getRootPath() . 'public/storage' - 确认
public/storage目录存在且权限正确,否则putFile()会静默失败
上传大文件 413 错误?PHP 和 Nginx 双层限制都要调
413 Request Entity Too Large 不是 TP 报的,是 Nginx 在前端就拦下了,PHP 根本没机会处理。
- 改 Nginx 配置:在
server块加client_max_body_size 100m; - 改 PHP 配置:
upload_max_filesize = 100M、post_max_size = 100M,改完重启 PHP-FPM - TP 层的
validate(['size' => 104857600])是最后一道校验,单位是字节,填100 * 1024 * 1024或直接算好104857600 - 前端用 JS 做大小预检只是体验优化,不可信;真正兜底的是这三层限制必须全部 ≥ 你期望的上传上限
最常被忽略的是 Web 用户身份和磁盘路径映射这两层——权限看着对了,但用户不对或路径算偏了 1 个字符,文件就消失在黑洞里。上线前务必用真实请求验证整个链路,别只测 move() 返回值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











