php 7.2 无法用 pdo 或 mysqli 连接 couchdb,因其非关系型、仅提供 http/rest 接口;必须用 curl 或 php-on-couch 等封装库,注意认证、json 头、\_rev 机制及数据库命名约束。

PHP 7.2 无法通过 PDO 或 mysqli 这类传统数据库扩展连接 CouchDB——它压根不支持,因为 CouchDB 不是关系型数据库,也没有原生 PHP 扩展。你必须走 HTTP 路线,用 cURL 或封装库发 REST 请求。
为什么不能用 PDO 或 ext-couchdb?
CouchDB 只暴露标准 HTTP/REST 接口(http://localhost:5984),所有操作都对应 HTTP 方法:PUT 创建库、POST 插入文档、GET 读取、DELETE 删除。PHP 7.2 官方从未提供过 ext-couchdb,社区也无稳定 C 扩展;PDO 更是完全不兼容文档模型和 JSON 协议。
- 搜
pdo_couchdb或pecl couchdb会一无所获——不存在 - 试图
new PDO('couchdb:host=localhost;port=5984')必然报错:PDO::__construct(): could not find driver - PHP 7.2 已废弃
mysql_*,但连带也让部分开发者误以为“所有数据库都该有扩展”,其实 CouchDB 的设计哲学就是“HTTP 即协议”
cURL 是最轻量、最可控的连接方式
不用装额外包,PHP 7.2 默认启用 cURL 扩展,直接构造请求即可验证连通性、创建库、存取文档。关键点在于头、认证、JSON 编码三者必须对齐。
- 必须设
Content-Type: application/json,否则 CouchDB 返回415 Unsupported Media Type - Basic Auth 要 Base64 编码用户名密码:
admin:admin→YWRtaW46YWRtaW4=,加在Authorization头里 - POST/PUT 请求体必须是合法 JSON 字符串,用
json_encode($data, JSON_UNESCAPED_UNICODE)避免中文乱码 - 务必检查
curl_getinfo($ch, CURLINFO_HTTP_CODE),CouchDB 成功响应是200、201,不是ok:true就算成功
示例:创建数据库
$ch = curl_init('http://localhost:5984/mydb');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Basic YWRtaW46YWRtaW4=',
'Content-Type: application/json'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 必须是 201
curl_close($ch);
推荐用 php-on-couch(Composer 兼容 PHP 7.2)
如果你不想手写一堆 cURL 配置,php-on-couch/php-on-couch 是目前对 PHP 7.2 支持最稳、文档最实的封装库。它不依赖任何扩展(仅需 cURL),且明确声明支持 PHP 5.6–7.4。
- 安装:
composer require php-on-couch/php-on-couch(PHP 7.2 的 Composer 1.x 或 2.0 均可) - 初始化时 URL 必须含认证信息:
new CouchClient('http://admin:admin@localhost:5984', 'mydb'),否则databaseExists()会静默失败 - 插入文档后,
$doc['_rev']会被自动注入,后续更新必须带上这个字段,否则返回409 Conflict - 注意:它默认不校验 SSL,若 CouchDB 部署在 HTTPS 后(如 Nginx 反代),需手动调
$client->setOption(CURLOPT_SSL_VERIFYPEER, false)
容易被忽略的三个硬约束
很多 PHP 开发者卡住,不是语法问题,而是 CouchDB 自身机制与直觉冲突:
-
_rev字段不是可选的——每次PUT更新文档都必须传上一次返回的_rev,否则 409;删除也要带_deleted:true+ 当前_rev - 数据库名只能小写字母、数字、下划线、短横线,不能含大写或点号,
my.db会返回400 Bad Request - CouchDB 5984 端口默认只监听
127.0.0.1,PHP 脚本若跑在 Docker 容器或远程服务器,要改bind_address = 0.0.0.0并重启服务,否则连接超时
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











