neo4j 5.x默认关闭http端口7474,需在neo4j.conf中设置dbms.connector.http.enabled=true并重启;连接时密码含特殊字符须url编码,docker内访问用host.docker.internal(mac/win)或宿主机ip;首次登录必须修改默认密码neo4j/neo4j,否则后续连接均失败。

用 graphaware/neo4j-php-client 连 HTTP(开发最省事)
Neo4j 5.x 默认只开 Bolt 端口(7687),HTTP(7474)是关的,直接连会报 Connection refused 或 404 Not Found。必须先改配置:dbms.connector.http.enabled=true 写进 neo4j.conf,然后重启服务。
连接字符串格式固定为 http://<user>:<pass>@<host>:<port></port></host></pass></user>,注意三点:
- 密码里有特殊字符(如
/、@)必须 URL 编码,否则解析失败 - 本地 Docker 容器别写
localhost,Mac/Windows 用host.docker.internal,Linux 用宿主机真实 IP - 首次登录后必须改默认密码
neo4j/neo4j,否则后续所有连接都抛AuthorizationFailedException
切 Bolt 协议(生产环境推荐)
Bolt 比 HTTP 快 3–5 倍,尤其在高并发读写时更稳。但要确认 Neo4j 开了 Bolt:dbms.connector.bolt.enabled=true(默认已开),端口是 7687。
连接串换成 bolt://neo4j:password@host:7687 即可,其余参数和 HTTP 一致。不过要注意:
-
graphaware/neo4j-php-client的 Bolt 实现不是协程安全的;Webman/Swoole 环境下不能复用连接句柄,得每次请求新建 session,或禁用协程 - 如果项目用了
neo4j-php-driver(C 扩展版),性能更好,但 PHP 8.3+ 兼容性不稳,Windows 下基本编译不过
连接对象怎么存才不翻车
Webman 是常驻内存模型,连接可以复用,但千万别用 static 或全局变量存 $client 实例——事务没结束就丢引用,连接池会卡死。
推荐做法:
- 在
app/bootstrap.php里初始化$client,绑定到容器(如Container::set('neo4j.client', $client)) - 或者封装成
Neo4jService类,构造时创建连接,方法内用$session = $this->client->createSession()拿新 session - 每次查询完显式调
$session->close(),避免长连接堆积
参数化查询漏掉这步,等于裸奔
Cypher 不支持预处理语句,但 graphaware/client 的 run() 方法支持数组传参,必须用:
$result = $session->run('MATCH (u:User) WHERE u.id = $id RETURN u.name', ['id' => $userId]);
以下不能参数化,必须白名单校验后拼接:
- 节点标签:
User、Post - 关系类型:
FOLLOWS、LIKES - 属性名:
name、created_at
直接拼字符串如 "WHERE u.name = '$name'",不仅可能被注入,遇到单引号还会崩 Cypher 语法。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











