能直接装,但需PHP与ES服务端版本匹配:v8.x SDK要求PHP≥8.0且仅兼容ES 8.x,需先用php -v和curl检查版本;实例化必须用ClientBuilder::create()->setHosts(['http://localhost:9200'])->setSSLVerification(false)->build(),不可new Elasticsearch\Client。

composer require elasticsearch/elasticsearch 能直接装吗
能,但得看 PHP 版本和 Elasticsearch 服务端版本是否匹配。官方 SDK elasticsearch/elasticsearch 的每个大版本只兼容特定范围的 ES 服务端(比如 v8.x SDK 默认只连 ES 8.x,不兼容 7.x),且要求 PHP ≥ 8.0(v8.x SDK)或 ≥ 7.4(v7.x SDK)。
执行前先确认:
- 运行
php -v查 PHP 版本 - 运行
curl -X GET 'http://localhost:9200/'看 ES 返回的version.number
BadMethodCallException 或连接后返回 406 Not Acceptable。
如何用 composer 引入并实例化 Elasticsearch 客户端
推荐使用 v8.x SDK(对应 ES 8.x),安装命令:
composer require elasticsearch/elasticsearch:^8.0
PHP 中初始化 client 示例(注意:ES 8.x 默认启用 HTTPS + Basic Auth,本地开发若用 HTTP 且无认证,必须显式关闭 SSL 验证):
$client = \Elasticsearch\ClientBuilder::create()
->setHosts(['http://localhost:9200'])
->setSSLVerification(false) // 开发环境必需,否则报 cURL error 60
->build();
关键点:
-
setHosts()必须传数组,即使只有一个地址 -
setSSLVerification(false)在 HTTP 环境下漏掉会卡在连接阶段 - 不要手动 new
Elasticsearch\Client,必须用ClientBuilder
为什么 new Client() 报 Class 'Elasticsearch\Client' not found
因为官方 SDK v7.4+ 已移除直接构造 Elasticsearch\Client 的方式,类名已改为 Elasticsearch\ClientBuilder,且整个命名空间结构变了。
常见错误写法:
-
new \Elasticsearch\Client()→ 错,类不存在 -
use Elasticsearch\Client;→ 错,该类已被删除 - 没加
require 'vendor/autoload.php';→ 错,自动加载没触发
ClientBuilder::create() → build()。
配置连接超时、重试、日志等实用参数
ClientBuilder 支持链式配置,常用选项有:
$client = \Elasticsearch\ClientBuilder::create()
->setHosts(['http://localhost:9200'])
->setSSLVerification(false)
->setRetries(2) // 连接失败时重试 2 次
->setConnectionPool(
\Elasticsearch\ConnectionPool\StaticConnectionPool::class,
['connections' => [['host' => 'localhost', 'port' => 9200]]]
)
->setLogger(new \Monolog\Logger('es')) // 需额外 require monolog/monolog
->build();
注意:
-
setRetries()不影响请求级失败(如文档不存在),只对网络层断连有效 -
setLogger()需提前composer require monolog/monolog,否则报 class not found - 生产环境务必删掉
setSSLVerification(false),改用证书路径或系统 CA
$client->info() 调用,如果 host 写错或端口不通,也会直接抛出 Exception 而非返回 false。










