PHP可同时连接PostgreSQL、MongoDB和Redis,但三者协议与驱动互不兼容:PostgreSQL需PDO或pg_connect(禁用mysqli),MongoDB须php-mongodb扩展+Composer库mongodb/mongodb,Redis推荐C扩展phpredis(非Predis),各自需独立安装驱动、配置连接参数并实例化客户端。
PHP 能同时连接 PostgreSQL、MongoDB 和 Redis,但三者底层机制完全不同:PostgreSQL 是关系型数据库,走 SQL 协议;MongoDB 是文档型 NoSQL,依赖 BSON 通信;Redis 是内存键值存储,用 RESP 协议。不能共用同一套客户端或扩展,必须分别安装对应驱动、实例化各自客户端。
PostgreSQL 连接必须用 PDO 或 pg_connect,别试 mysqli
mysqli 扩展只认 MySQL 协议,硬连 PostgreSQL 会直接报
或
。正确路径只有两条:
用
:统一接口、支持预处理、异常可控,推荐生产环境使用
用
:轻量、无额外依赖,适合简单脚本或遗留项目
示例(PDO):
注意:
必须在构造时传入,之后调用
无效;持久连接不自动清理事务状态,若前一个请求中断在事务中,下次复用可能卡住。
立即学习
“
PHP免费学习笔记(深入)
”;
MongoDB 需要
php
-
mongodb
扩展 + Composer 包双加载
仅装
扩展(
)还不够——它只提供底层驱动,没封装高级 API。必须再用 Composer 加载官方库
,否则会提示
。
检查扩展是否启用:
,没输出就去改
安装客户端库:
连接字符串里不要漏掉
,
是强制前缀,写成
直接失败
示例:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
如果用 Docker 或远程服务器,确保 MongoDB 绑定地址不是
(默认只监听本地),得改成
并开防火墙端口。
Redis 推荐 php
redis
扩展,Predis 只适合开发调试
是 C 扩展,性能高、内存占用低、支持管道和连接池;
是纯 PHP 实现,调试方便但慢 3–5 倍,且在高并发下容易触发 PHP 内存限制。生产环境用
等于主动给自己埋坑。
装扩展:
,然后在
加
连接前先确认 Redis 是否启用了密码:
在
里,代码里就得带
参数
超时设置很关键:
第三个参数是秒级超时,不设默认是无限等待
示例(带认证与超时):
如果 Redis 启用了
(默认开启),又没配
或
,连接会静默失败,只报
,查日志才能定位。
三个数据库的连接初始化顺序无所谓,但销毁时要注意:Redis 客户端对象不用显式 close,PHP 请求结束自动释放;MongoDB 的
实例也无需手动断开;而 PostgreSQL 的
对象设为
可提前释放连接资源——这点常被忽略,尤其在长脚本或 CLI 场景下容易堆积空闲连接。
PDOExceptionConnection refusedPDOpg_connect()$dsn = 'pgsql:host=localhost;port=5432;dbname=myapp';
$pdo = new PDO($dsn, 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_PERSISTENT => true
]);
PDO::ATTR_PERSISTENTsetAttribute()mongodbextension=mongodb.somongodb/mongodbClass 'MongoDB\Client' not foundphp -m | grep mongodbphp.inicomposer require mongodb/mongodbschememongodb://localhost:27017use MongoDB\Client;
$client = new Client('mongodb://127.0.0.1:27017');
$db = $client->selectDatabase('mydb');
127.0.0.10.0.0.0phpredisPredisPredispecl install redisphp.iniextension=redis.sorequirepassredis.confauth$redis->connect('127.0.0.1', 6379, 2.5)$redis = new Redis();
$redis->connect('127.0.0.1', 6379, 2.5);
$redis->auth('mysecret');
$redis->set('key', 'value');
protected-mode yesbindrequirepassConnection refusedClientPDOnull