配置 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+ 接口的对象。
一个承诺代表异步操作的单个结果。它不一定在特定时间可用,但将来应该会变得可用。
如果您需要知道响应,您可以直接调用 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 文档页面。