upload_tmp_dir用于指定swoole http server接收上传文件时临时存放$_files['tmp_name']的绝对路径,必须由worker进程用户可写且手动创建,否则上传失败或存在安全风险。

upload_tmp_dir 在 Swoole HTTP Server 中干啥用
它只控制 swoole_http_server 接收上传文件时,临时存放 $_FILES 中 tmp_name 所指文件的路径。和 PHP-FPM 的 upload_tmp_dir 配置无关,也不影响 sys_get_temp_dir() 或 tempnam() 等函数。Swoole 自己接管了 HTTP 请求体解析,所以必须显式指定这个目录,否则上传会失败或写入默认系统临时目录(比如 /tmp),带来安全与维护风险。
不设 upload_tmp_dir 会出什么问题
常见错误现象包括:move_uploaded_file(): Unable to move、file_exists() returns false on $_FILES['x']['tmp_name']、甚至整个上传请求被静默截断。根本原因是:Swoole 默认不设该值,会 fallback 到系统 sysconfdir 或环境变量 TMPDIR,但这些路径往往没权限、不可写、或被 SELinux 拦截。你查 $_FILES 会发现 tmp_name 是空字符串或指向一个根本不存在的路径。
- PHP-FPM 下上传正常,切到 Swoole 后上传失败 → 很可能漏配
upload_tmp_dir - 上传大文件时卡住或返回 400 → 临时目录磁盘满、inode 耗尽,或路径长度超 220 字节限制
- 日志里出现
open_basedir restriction in effect→ 虽然不是直接相关,但说明路径未被 PHP open_basedir 白名单包含,需同步检查
怎么正确配置 upload_tmp_dir
必须是绝对路径,且由 Swoole worker 进程用户(如 www-data)可写。注意:Swoole 不会自动创建该目录,也不会校验权限,全靠你手动保障。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 在
$server->set()中传入数组,键名为'upload_tmp_dir',值为字符串路径,例如:$server->set(['upload_tmp_dir' => '/var/tmp/swoole_uploads']) - 提前执行
mkdir -p /var/tmp/swoole_uploads,再运行chown www-data:www-data /var/tmp/swoole_uploads && chmod 755 /var/tmp/swoole_uploads - 若服务器启用了 SELinux,需追加上下文:
semanage fcontext -a -t httpd_tmp_t "/var/tmp/swoole_uploads(/.*)?" && restorecon -Rv /var/tmp/swoole_uploads - 路径总长度不能超过 220 字节(含末尾斜杠),超长会导致 Swoole 启动报错或上传失败
upload_tmp_dir 和 PHP 的 upload_tmp_dir 冲突吗
完全不冲突。Swoole 的 upload_tmp_dir 只作用于它自己实现的 HTTP 解析流程;而 PHP-FPM 或 Apache mod_php 的 upload_tmp_dir 是 PHP 内核层处理 multipart/form-data 时使用的。两者独立生效。如果你混用(比如 Nginx + Swoole FastCGI 回退模式),要注意区分哪条链路在处理上传——Swoole 直连模式下,PHP 的那个配置压根不生效。
真正容易被忽略的是:Swoole 的临时文件不会自动清理。PHP-FPM 通常依赖系统 cron 清理 /tmp,但你自定义的 /var/tmp/swoole_uploads 得自己加定时任务,否则磁盘迟早被占满。










