配置 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 文档页面