You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:15:40