Laravel 9(AWS EC2)文件上传失败:临时目录检测异常
问题原因分析及排查方向
针对你遇到的Laravel 9文件上传报错、PHP未读取upload_tmp_dir配置的问题,可能的原因及对应排查方向如下:
1. PHP配置文件未正确加载或被覆盖
- 你修改的
php.ini可能不是当前运行PHP实例(Laravel部署通常用PHP-FPM)实际加载的文件。通过phpinfo()查看Loaded Configuration File项,确认配置文件路径是否与你修改的一致。EC2上常存在CLI和FPM两个独立的PHP配置目录,比如/etc/php/8.x/cli/php.ini和/etc/php/8.x/fpm/php.ini,若修改了CLI的配置,Laravel使用的FPM不会生效。 - 其他优先级更高的配置文件(如
/etc/php.d/目录下的.conf文件)可能覆盖了upload_tmp_dir的设置。检查这些文件中是否存在upload_tmp_dir = ""或其他路径的配置,后者会覆盖主php.ini的设置。
2. SELinux权限限制(AWS EC2默认开启)
尽管/tmp的权限为drwxrwxrwt+,但EC2默认启用的SELinux可能拦截PHP-FPM进程(运行用户通常为apache)访问/tmp:
- 检查SELinux状态:执行
sestatus,若显示enabled,可临时关闭测试:setenforce 0,然后重试文件上传。若恢复正常,说明是SELinux导致,需添加规则允许httpd访问临时目录:setsebool -P httpd_read_user_content 1 setsebool -P httpd_can_network_connect 1 - 查看审计日志确认:
grep denied /var/log/audit/audit.log,若存在httpd相关的拒绝记录,可验证SELinux拦截的推测。
3. 环境变量或代码层面的临时目录覆盖
- 检查Laravel根目录下的
.env文件,是否设置了TMPDIR或TEMP环境变量。若存在TMPDIR=/var/www/html/tmp,PHP的sys_get_temp_dir()会优先读取该变量值,而非系统默认或php.ini配置。 - 排查Laravel代码中是否有手动修改临时目录的逻辑,比如在
bootstrap/app.php、服务提供者或自定义中间件中,通过putenv()或直接修改PHP配置的方式更改了临时目录路径。
4. /var/www/html/tmp目录的权限问题
虽然sys_get_temp_dir()返回该目录,但如果它的权限不符合PHP进程的写入要求,也会触发"missing temporary directory"错误:
- 检查该目录权限:执行
ls -ld /var/www/html/tmp,确保属主包含apache用户(或PHP-FPM运行用户),权限至少为drwxrwxr-x(775)。若权限不足,执行:chown ec2-user:apache /var/www/html/tmp chmod 775 /var/www/html/tmp
内容的提问来源于stack exchange,提问作者farjam
相关产品推荐
相关产品推荐

