PHP 8.3 下无法用 PDO 或 pecl cassandra.so 连接 Cassandra,因官方不提供 pdo_cassandra 扩展且旧版 cassandra.so 已停止维护、不兼容 PHP 8.1+;唯一可靠方案是使用 DataStax 官方维护的 datastax/php-driver Composer 包,支持 PHP 8.0–8.3,需手动管理 Session 并通过实际查询做健康检查。

PHP 8.3 下无法用 PDO 连接 Cassandra,官方驱动不提供 pdo_cassandra 扩展,new PDO('cassandra:...') 会直接报错或崩溃;唯一可靠路径是使用 DataStax 官方维护的 datastax/php-driver Composer 包,它原生支持 PHP 8.0–8.3,且无需系统级 cassandra.so 扩展。
为什么不能用 PDO 或 pecl cassandra.so
PHP 8.3 已彻底移除对旧版 pecl cassandra(即 cassandra.so)的支持:该扩展自 2021 年起停止维护,PHP 8.1+ 编译失败率超 90%,运行时常见 Segmentation fault 或 Class 'PDO' has no connection driver for 'cassandra'。即使强制编译成功,其内部未实现 PDO::ATTR_PERSISTENT,在常驻进程(如 Webman/Workerman)中极易连接泄漏。官方明确不支持 PDO 接口,fetch()、rowCount() 等方法根本不存在。
必须用 datastax/php-driver + 手动 Session 管理
这是目前唯一活跃维护、兼容 PHP 8.3、支持 Cassandra 4.x/5.x 的方案。它纯 PHP 实现(底层用 socket),通过 Composer 加载:
composer require datastax/php-driver
关键点不是“怎么连”,而是“怎么活”:
立即学习“PHP免费学习笔记(深入)”;
-
Cassandra::cluster()->build()是无状态工厂,开销极小,可复用 -
$cluster->connect('keyspace')才真正建连,返回Cassandra\Session实例,该实例协程安全但非进程安全,不能跨 Worker 共享 - 绝不能在
onWorkerStart中直连——Cassandra 不可用时会卡死整个 Worker 启动 - 必须封装懒加载 + 健康检查:每次请求前执行
$session->execute("SELECT now() FROM system.local"),捕获异常后重建$session
简单可用的初始化示例(非框架场景)
以下代码在 CLI 或短生命周期脚本中可直接运行,注意替换地址和 keyspace:
$cluster = Cassandra::cluster()
->withContactPoints(['127.0.0.1'])
->withPort(9042)
->build();
<p>try {
$session = $cluster->connect('my_keyspace');
$result = $session->execute("SELECT * FROM users LIMIT 1");
$row = $result->first();
if ($row) {
echo "Found: " . $row['name'] . "\n";
}
} catch (Cassandra\Exception\RuntimeException $e) {
// 连接失败或查询出错
error_log("Cassandra error: " . $e->getMessage());
}批量写入必须手写 BATCH CQL,不支持 prepare/bind 参数化插入多行;异步调用需自行封装 Worker::async()(Webman)或 Co::create()(Swoole),因为驱动本身是同步阻塞的。
最易被忽略的是连接健康检查的粒度——$session->isConnected() 在 PHP 8.3 的 datastax/php-driver v2.x 中已废弃,必须用实际查询探活;另外,CQL 中的 INSERT ... IF NOT EXISTS 或轻量级事务(LWT)在高并发下性能折损明显,别默认开启。



















