设置elasticsearch php客户端的connecttimeout


set connect_timeout of elasticsearch php client

我想在我的elasticsearch php客户端和我的elaticsearch服务器之间配置一个小的超时。

我试图将一些参数传递给guzzle客户端,但似乎不起作用。这是代码:

$params = array();
$params['hosts'] = $hosts;
$params['guzzleOptions']['connect_timeout'] = 2.0;
$params['guzzleOptions']['timeout'] = 2.0;
$this->elastica_obj = new Elasticsearch'Client($params);

我搜索了一下,发现问题可能是因为在cURL层设置了超时(这比guzzle低)(限制与Guzzle HTTP PHP客户端的连接时间)

我想我需要以某种方式将CURLOPT_CONNECTTIMEOUT_MS参数设置为我想要的值(2000ms),但我认为没有任何好的方法可以通过elasticsearch php客户端传递它。

有人知道怎么做吗?

由于elasticsearch/elasticsearch v5.1.2,您还可以使用适用于所有请求的setConnectionParams()方法

use GuzzleHttp'RequestOptions;
use Elasticsearch'ClientBuilder;
ClientBuilder::create()
    ->setConnectionParams([
        'client' => [
            RequestOptions::TIMEOUT => 10,
            RequestOptions::CONNECT_TIMEOUT => 10,
        ],
    ])
    ->build();

谢谢Zack,我试过了,但没用。

我调试了客户端以及参数从guzzle传递到curl句柄的方式。

我发现实现它的方法是将此参数传递给Elasticsearch客户端

$params['guzzleOptions']['curl.options'][CURLOPT_CONNECTTIMEOUT] = 2.0;  // this applies 2 seconds connection_timeout

希望有帮助:)

Niv

对于最新版本2.x,它以不同的方式完成。引用Zach:

在ES-PHP 2.x中,现在为每个请求指定超时。请参阅此处的文档:https://www.elastic.co/guide/en/elasticsearch/client/php-api/2.0/_per_request_configuration.html#_curl_timeouts

$client = ClientBuilder::create()->build();
$params = [
    'index' => 'test',
    'type' => 'test',
    'id' => 1,
    'client' => [
        'timeout' => 10,        // ten second timeout
        'connect_timeout' => 10
    ]
];
$response = $client->get($params);

不过,在全球范围内这样做是不可能的。关注此问题以获取更新。

假设你指的是Elasticsearch PHP客户端(而不是Elastica):

guzzleOptions参数接受任何Guzzle参数,并遵循Guzzle使用的相同数组语法。所以你需要做:

$params = array();
$params['hosts'] = $hosts;
$params['guzzleOptions']['command.request_options']['connect_timeout'] = 2.0;
$params['guzzleOptions']['command.request_options']['timeout'] = 2.0;
$this->elastica_obj = new Elasticsearch'Client($params);

这将对通过客户端发送的所有请求应用2s超时

有一个"快捷方式"timeout参数应该适用于所有连接类型(Guzzle、CurlMultiConnection等)。。。但我现在正在查看代码,我认为它实际上不适用于Guzzle。我要开一张票。

在我的php中,弹性版本的解决方案是

retun ClientBuilder::create()
      ->setHttpClientOptions([
            'connect_timeout' => 10,//seconds
        ])
       ->build();

也许有人会有用=)

我使用的是8.x Elasticsearch客户端,我不得不手动设置HTTP客户端以解决问题https://stackoverflow.com/a/71754458/1475468.

对我来说,在Guzzle HTTP客户端中设置超时值就是答案。

$client = ClientBuilder::create()
    ->setHttpClient(new 'GuzzleHttp'Client([
        'connect_timeout' => 10, // seconds
        'timeout' => 10 // https://docs.guzzlephp.org/en/latest/request-options.html
    ])) 
    ->setHosts(config('elasticsearch.hosts'))
    ->setApiKey(config('elasticsearch.api_key'))
    ->build();