跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何用PHP连接PostgreSQL、MongoDB与Redis。

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 会直接报
PDOException
或
Connection refused
。正确路径只有两条: 用
PDO
:统一接口、支持预处理、异常可控,推荐生产环境使用 用
pg_connect()
:轻量、无额外依赖,适合简单脚本或遗留项目 示例(PDO):
$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_PERSISTENT
必须在构造时传入,之后调用
setAttribute()
无效;持久连接不自动清理事务状态,若前一个请求中断在事务中,下次复用可能卡住。 立即学习 “ PHP免费学习笔记(深入) ”; MongoDB 需要 php - mongodb 扩展 + Composer 包双加载 仅装
mongodb
扩展(
extension=mongodb.so
)还不够——它只提供底层驱动,没封装高级 API。必须再用 Composer 加载官方库
mongodb/mongodb
,否则会提示
Class 'MongoDB\Client' not found
。 检查扩展是否启用:
php -m | grep mongodb
,没输出就去改
php.ini
安装客户端库:
composer require mongodb/mongodb
连接字符串里不要漏掉
scheme
,
mongodb://
是强制前缀,写成
localhost:27017
直接失败 示例: PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载
use MongoDB\Client; $client = new Client('mongodb://127.0.0.1:27017'); $db = $client->selectDatabase('mydb');
如果用 Docker 或远程服务器,确保 MongoDB 绑定地址不是
127.0.0.1
(默认只监听本地),得改成
0.0.0.0
并开防火墙端口。 Redis 推荐 php redis 扩展,Predis 只适合开发调试
phpredis
是 C 扩展,性能高、内存占用低、支持管道和连接池;
Predis
是纯 PHP 实现,调试方便但慢 3–5 倍,且在高并发下容易触发 PHP 内存限制。生产环境用
Predis
等于主动给自己埋坑。 装扩展:
pecl install redis
,然后在
php.ini
加
extension=redis.so
连接前先确认 Redis 是否启用了密码:
requirepass
在
redis.conf
里,代码里就得带
auth
参数 超时设置很关键:
$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');
如果 Redis 启用了
protected-mode yes
(默认开启),又没配
bind
或
requirepass
,连接会静默失败,只报
Connection refused
,查日志才能定位。 三个数据库的连接初始化顺序无所谓,但销毁时要注意:Redis 客户端对象不用显式 close,PHP 请求结束自动释放;MongoDB 的
Client
实例也无需手动断开;而 PostgreSQL 的
PDO
对象设为
null
可提前释放连接资源——这点常被忽略,尤其在长脚本或 CLI 场景下容易堆积空闲连接。

相关文章