我目前正在使用laravel-elasticsearch提供程序进行ES查询。我在我的laravel队列(使用beanstalkd)处理的作业中使用它。我遇到的问题是,在长时间运行的作业中,最终我无法再将数据插入到elasticsearch中。工作刚刚挂起(没有异常被抛出)我已经缩小到我正在进行ES调用的代码。我的连接是否可能变得陈旧,如何重新连接?我的另一个想法是它与使用Facade有关,它是一个单身人士。
这是我正在做的,这不是我的确切代码。但是当代码没有在长时间运行的作业中运行时,代码工作得很好。我只是想提供一些context.it插入就好了,代码运行没有问题,直到它在长时间运行的进程之后运行。
更新
我已将问题缩小到持久连接的elasticsearch-php库。我的ES背后有一个负载平衡器,它在5分钟后超时TCP连接。问题是ES php库中没有活着。 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
答案 0 :(得分:5)
聚集在一起,让我们谈谈持久的队列流程。
Laravel与工人一起排队工作。那些无租金的精灵从我们的队列服务中取出工作并及时处理它们。
但是,经过长时间的不间断工作,我们的精灵开始感到疲倦并随意制造错误。错误类型包括失败to send mail using SwiftMailer
,以处理数据库事务或connect to SSL ports。
我们的精灵需要的是能量饮料,每隔20分钟以queue:restart
的形式出现。
实施步骤:
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的路径。
并使用您的laravel的环境名称yourenvironment
。
来源:我有一个弹性搜索安装,正常运行时间为一个月,并使用shift31的软件包进行实时评估和更新数据。
答案 1 :(得分:0)
我最终解决此问题的方法是在创建ES客户端时添加以下设置。
'guzzleOptions' => array(
'curl.options' => [
CURLOPT_FORBID_REUSE => true
]
),
希望这有助于某人。