ElasticSearch 查询在 laravel 个作业队列中挂起

ElasticSearch query hangs in laravel job queue

我目前正在为我的 ES 查询使用 laravel-elasticsearch 提供程序。我在我的 laravel 队列(使用 beanstalkd)处理的作业中使用它。我遇到的问题是,在长时间的 运行ning 作业中,最终我无法再将数据插入到 elasticsearch 中。工作只是挂起(没有抛出异常)我已经将它缩小到我进行 ES 调用的代码。我的连接是否有可能变得陈旧而不重新连接?我的另一个想法是它与使用 Facade 和它是一个单例有关。

这是我正在做的,这不是我的确切代码。但是当它不是 运行 in a long 运行ning job.I 只是想提供一些 context.it 插入就好了,代码没有问题经过漫长的 运行ning 过程后一直运行到 运行。

更新:

我已将问题缩小到 elasticsearch-php 库保持连接。我的 ES 位于负载均衡器后面,该负载均衡器在 5 分钟后使 TCP 连接超时。问题是 ES php 库中没有 keep alive。 5 分钟后连接关闭,但它不会关闭我这边的连接。有没有办法为elasticsearch-php设置一个keep alive?或重置连接的电话?

//run some functions....
$params = array();
$params['body']  = array('somefield' => 'some data');
$params['index'] = 'my_index';
$params['type']  = 'my_type';
$params['id']    = 'my_id';
$ret = Es::update($params);//this is working just fine

//long running function here
$newparams = array();
$newparams['body']  = array('somefield' => 'some data');
$newparams['index'] = 'my_index';
$newparams['type']  = 'my_type';
$newparams['id']    = 'my_id';
$return = Es::update($newparams);//this will just hang

聚在一起,我们来谈谈持久队列进程。

Laravel 队列工作,有工人。那些不租用的精灵从我们的队列服务中获取作业并及时处理它们。

然而,经过长时间不间断的工作,我们的小精灵们开始感到疲倦,并随机产生错误。错误类型包括失败 to send mail using SwiftMailer, to process database transactions or connect to SSL ports.

我们的精灵需要的是能量饮料,形式为 queue:restart,每 20 分钟一次。

实施步骤:

1) 如果您使用的是 linux,请在控制台中输入 sudo crontab -e

2) 使用 vim,输入以下行 0,20,40 * * * * cd /path/to/my/laravel/installation && php artisan queue:restart --env=yourenvironment 1>> /dev/null 2>&1

/path/to/my/laravel/installation 替换为您 laravel 的路径。

并且 yourenvironment 使用您的 laravel 的环境名称。

来源:我安装了一个正常运行时间为一个月的 elasticsearch,laravel 使用 shift31 的包实时轮询和更新数据。

文档:http://laravel.com/docs/5.0/queues#daemon-queue-worker

我最终解决这个问题的方法是在创建 ES 客户端时添加以下设置。

'guzzleOptions' => array(
              'curl.options' => [
                  CURLOPT_FORBID_REUSE => true
              ]
          ),

希望这对某人有所帮助。