upload_tmp_dir是PHP内置配置项,非Swoole提供;Swoole在CLI模式下需显式配置该值并确保目录存在、可写、权限正确,否则上传失败。

upload_tmp_dir 是 PHP 配置项,不是 Swoole 的配置
很多人搜 upload_tmp_dir 加上 “Swoole”,误以为这是 Swoole 提供的上传临时目录控制项。实际上,upload_tmp_dir 是 PHP 内置的 php.ini 配置项,Swoole 本身不接管或重写这个行为——它只在 CLI 模式下运行时,沿用 PHP 的原生文件上传逻辑(比如 $_FILES),所以必须靠 PHP 层面配置生效。
CLI 模式下 upload_tmp_dir 必须显式设置
PHP-FPM 或 Apache 下该配置通常已设好,但 Swoole 运行在 CLI 环境(如 php server.php),默认会使用系统临时目录(如 /tmp),而这个路径可能:权限不足、磁盘空间小、被清理脚本定期清空,导致上传失败且报错隐晦(例如 UPLOAD_ERR_NO_TMP_DIR 或直接 $_FILES 为空)。
- 确认当前生效的
php.ini路径:php --ini - 编辑对应
php.ini,添加或修改:upload_tmp_dir = /path/to/your/upload_tmp - 确保该目录存在、可写、不属于 root(Swoole 进程一般以普通用户运行):
mkdir -p /data/upload_tmp && chown www-data:www-data /data/upload_tmp - 重启 Swoole 服务(不是 reload,CLI 下没有 reload 概念,需 kill 后重新启动)
检查是否生效的最简方法
不要只看 phpinfo() —— CLI 和 Web SAPI 的配置可能不同。直接在 Swoole 启动脚本里加一行验证:
var_dump(ini_get('upload_tmp_dir'));
// 输出应为你的自定义路径,而非空字符串或 /tmp
如果输出为空,说明配置未加载成功,常见原因有:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 改错了
php.ini文件(CLI 用的是另一个,比如/etc/php/8.1/cli/php.ini,而非fpm子目录下的) - 用了
ini_set()动态设置 ——upload_tmp_dir是PHP_INI_SYSTEM级别,运行时不可修改 - 目录权限不对,PHP 启动时检测失败后静默回退到系统默认
替代方案:绕过 upload_tmp_dir,用 Swoole 原生接收
如果你用的是 Swoole\Http\Server,且上传文件较大、或想完全控制流程(比如分片、校验、直传对象存储),就不该依赖 $_FILES。而是用 $request->rawContent() + 手动解析 multipart body,或更稳妥地用 $request->files(Swoole 4.8+ 支持,但注意它仍会临时写入磁盘,默认位置就是 upload_tmp_dir)。
真正跳过它的办法是:禁用 PHP 的文件上传解析,在 php.ini 中设:file_uploads = Off,然后用 $request->rawContent() 自己处理 —— 这样就彻底不走 upload_tmp_dir 了,但你要自己实现 boundary 解析、文件流写入、安全校验等逻辑。
这个路径适合对上传有强定制需求的场景,但多数人只是想让 $_FILES 正常工作,那就老老实实配对 php.ini 里的 upload_tmp_dir。

















