HTTP 是唯一可行的通用选择。官方不提供原生 TCP 的 PHP 客户端,所有稳定库均基于 HTTP 接口;TCP 协议私有、无文档、易出错且缺乏生产级能力;正确配置 HTTP(压缩、超时、POST、Header 认证、settings 透传)可保障性能与稳定性。

ClickHouse PHP 客户端该走 HTTP 还是 TCP?
HTTP 是唯一可行的通用选择。ClickHouse 官方不提供原生 TCP 协议的 PHP 客户端,所有稳定、维护中的 PHP 库(如 clickhouse-php、laminas-http 驱动封装)底层都依赖 HTTP 接口(/? 端点),而非 TCP 二进制协议。
为什么不能用原生 TCP 协议直连?
ClickHouse 的 TCP 协议是私有二进制协议,未公开文档,且会随版本变动;PHP 没有官方支持的解码器或序列化器。尝试手写 TCP 客户端极易因以下原因失败:
-
Unknown packet type或Unexpected EOF错误 —— 协议握手/压缩/块格式不匹配 - 无法处理服务端返回的
Progress流式响应或Exception帧 - 缺少对
settings、session_id、query_id等关键上下文的透传支持 - 无连接池、重试、超时等生产级能力,需自行实现
HTTP 方案怎么配才稳?
用 HTTP 不等于随便发个 curl 就行。关键配置项必须显式设置:
- 始终启用
compress=1和decompress=1(URL 参数或 Header),否则大结果集传输慢、内存爆 - 设置
max_execution_time=60等超时参数,避免 PHP 进程卡死 - 用
POST方法提交查询(尤其含大量参数或长 SQL),避免 URL 长度限制和编码问题 - Header 中加
X-ClickHouse-User、X-ClickHouse-Key而非拼在 URL 里,更安全 - 若启用了
allow_experimental_lightweight_delete等特性,需通过settings参数传入,如settings[allow_experimental_lightweight_delete]=1
性能差?先检查是不是 HTTP 用错了
很多人抱怨“HTTP 比 TCP 慢”,实际往往是配置失当:
立即学习“PHP免费学习笔记(深入)”;
- 没开
compress=1→ 数据体积膨胀 3–5 倍,网络和解析都拖慢 - 用
GET提交带 100 行 VALUES 的 INSERT → URL 超长被 Nginx 截断或 414 错误 - 每次查询新建 cURL 句柄 → TCP 握手+TLS 开销远超查询本身
- 没设
session_id→ ClickHouse 无法复用临时表、缓存计划,重复解析 SQL
真实瓶颈通常不在协议层,而在没关压缩、没复用连接、没设 session —— 这些比纠结 HTTP/TCP 更影响表现。











