php 8.0 连接 neo4j 必须使用专用驱动,不可用 pdo 或 mysqli;推荐 graphaware/neo4j-php-client(http)或 neo4j-php-driver(bolt),需注意认证、端口、参数化及事务手动管理。

PHP8.0 连接 Neo4j 需要官方驱动,不是 PDO
Neo4j 不支持 PDO 或原生 MySQL/PostgreSQL 那类通用协议,PHP8.0 必须用官方维护的 neo4j-php-driver(基于 Bolt 协议),不能靠 mysqli 或 PDO 硬连。这个驱动是纯 PHP 实现,不依赖扩展,但要求 PHP ≥ 7.4(PHP8.0 完全兼容)。
常见错误是试图用 file_get_contents() 直接调 REST 接口——虽然可行,但没事务、没连接池、没自动重试,生产环境极易出错。
- 安装命令:
composer require graphaware/neo4j-php-client(注意:不是neo4j-php-driver,后者已废弃,当前唯一推荐是graphaware/neo4j-php-client) - 必须启用
ext-curl(默认开启),否则客户端初始化会抛ClientException: cURL error - 若用 Docker 部署 Neo4j,确认
NEO4J_AUTH=neo4j/your_password已设,且dbms.connectors.default_listen_address=0.0.0.0在neo4j.conf中放开
初始化客户端时 URL 和认证必须显式传参
GraphAware\Neo4j\Client\ClientBuilder::create() 不会自动读取环境变量或配置文件,所有连接参数必须手动写死或从配置加载。漏掉认证或端口错位,会直接报 Connection refused 或 Unauthorized。
示例正确写法:
$client = \GraphAware\Neo4j\Client\ClientBuilder::create()
->addConnection('default', 'http://neo4j:password@localhost:7474') // HTTP
->addConnection('bolt', 'bolt://neo4j:password@localhost:7687') // Bolt(推荐)
->build();
- HTTP 连接走 7474 端口,适合调试;Bolt 连接走 7687,性能更好,PHP 客户端默认优先用 Bolt
- 用户名密码必须 URL 编码(如密码含
/或@,要用urlencode()包裹) - 本地开发用
localhost,Docker 内 PHP 容器连 Neo4j 容器时,必须用服务名(如neo4j),不能用127.0.0.1
执行 Cypher 查询必须用 run(),不能直接 execute()
客户端 API 是链式调用,run() 是入口方法,后面跟 first()、all()、column() 等获取结果。误用 execute() 会报 Call to undefined method —— 这个方法根本不存在。
简单查询示例:
$result = $client->run('MATCH (n:User) WHERE n.id = $id RETURN n', ['id' => 123]);
$user = $result->first()->get('n');
echo $user->value('name'); // 注意:不是 $user['name']
- 参数必须用命名占位符
$id,不能用?问号占位(Neo4j 不支持位置参数) - 返回的
Record对象需用get()提取字段,再用value()取值;直接->name或['name']会报错 - 批量插入建议用
UNWIND+ 参数数组,避免循环调run()——单次网络往返比 N 次快一个数量级
事务处理必须手动 begin/commit,没有自动 commit
Neo4j PHP 客户端不提供类似 PDO::beginTransaction() 的隐式事务封装。所有写操作默认非事务,跨语句一致性靠显式事务保证。
正确写法:
$tx = $client->transaction();
try {
$tx->run('CREATE (u:User {name: $name})', ['name' => 'Alice']);
$tx->run('CREATE (u:User {name: $name})', ['name' => 'Bob']);
$tx->commit();
} catch (\Exception $e) {
$tx->rollback();
throw $e;
}
- 事务对象
$tx生命周期很短,commit()或rollback()后不能再用 - PHP8.0 的
mixed类型提示会让 IDE 误报$tx->run()返回类型错误,可加@var \GraphAware\Neo4j\Client\Transaction $tx注解规避 - 长时间事务(>30s)可能被 Neo4j server 自动 kill,需在代码里控制逻辑复杂度,别在一个事务里跑大量 MATCH + CREATE
auth.ini 是否禁用了默认账号。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











