配置 HTTP 客户端
编辑配置 HTTP 客户端
编辑Elasticsearch-php 使用 elastic-transport-php 来管理 HTTP 传输。这是一个由 Elastic 提供的 HTTP 客户端,可以配置为使用任何 PSR-18 客户端库。
Elasticsearch-php 默认使用 Guzzle 作为 HTTP 客户端,但您可以使用 setHttpClient()
函数指定任何其他客户端,如下所示
use Symfony\Component\HttpClient\Psr18Client; $client = ClientBuilder::create() ->setHttpClient(new Psr18Client) ->build();
例如,在此示例中,我们使用了 Symfony HTTP 客户端。
设置客户端选项
编辑如果您需要,可以使用 ClientBuilder::setHttpClientOptions($options)
方法为特定的 PSR-18 客户端设置选项。$options
是一个键值对的数组,其中包含所使用的 HTTP 客户端特定的选项。
例如,如果您正在使用 Guzzle (默认) 并且需要使用 代理,则可以使用以下设置
$client = ClientBuilder::create() ->setHttpClientOptions([ 'proxy' => 'https://127.0.0.1:8125' ]) ->build();
配置 HTTP 异步客户端
编辑Elasticsearch-php 可以使用实现 HttpAsyncClient 接口的异步 HTTP 客户端工作,该接口来自 HTTPlug 项目。
遗憾的是,目前还没有针对 HTTP 异步客户端的 PSR 标准。我们使用了 HTTPlug 接口,它非常简单,如下所示
namespace Http\Client; use Http\Promise\Promise; use Psr\Http\Message\RequestInterface; // PSR-7 response interface HttpAsyncClient { /** * @return Promise */ public function sendAsyncRequest(RequestInterface $request); }
您可以使用 setAsync()
函数在 elasticsearch-php 中启用 HTTP 异步,如下所示
$client = ClientBuilder::create() ->build(); $client->setAsync(true); $promise = []; for ($i=0; $i<10; $i++) { $promise[] = $client->index([ 'index' => 'my-index' 'body' => [ 'foo' => base64_encode(random_bytes(24)) ] ]); }
前面的示例使用 HTTP 异步功能存储 10 个随机文档。$promise
响应是 promises/a+ 接口的一个对象。
Promise 表示异步操作的单个结果。它不一定在特定时间可用,但应该在将来可用。
如果您需要知道响应,可以直接调用 wait()
函数,如下所示
$promise = $client->index([ 'index' => 'my-index', 'body' => [ 'foo' => 'bar' ] ]); $result = $promise->wait(); print_r($result->asArray());
wait()
函数会阻塞执行,直到我们从 Elasticsearch 收到 HTTP 响应为止。
除了等待之外,您还可以使用 then()
函数异步处理事情,如下所示
use Psr\Http\Message\ResponseInterface; // PSR-7 $promise = $client->index([ 'index' => 'my-index', 'body' => [ 'foo' => 'bar' ] ]); $promise->then( // The success callback function (ResponseInterface $response) { // Success // insert here the logic for managing the response return $response; }, // The failure callback function (\Exception $exception) { // Error throw $exception; } );
有关 Promise 的更多信息,请访问 HTTPlug 文档页面。