我想在我的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();