2015-04-23 141 views
5

我目前使用laravel-elasticsearch供应商进行我的ES查询。我在我的laravel队列(使用beanstalkd)处理的作业中使用了这个。我遇到的问题是,在长时间运行的作业中,最终我不能再将数据插入到elasticsearch中。这项工作只是挂起了(没有例外),我将它缩小到我正在进行ES调用的代码。有可能我的连接可能会变得过时而无法重新连接?我的另一个想法是,它与使用Facade和它是一个单身人士有关。ElasticSearch查询在laravel作业队列中挂起

这是我在做什么,这不是我确切的代码。但是当代码在长时间运行的作业中运行时,代码工作得很好。我只是想提供一些context.it插入很好,直到它在长时间运行的进程之后运行才能正常运行。

UPDATE:

我已经缩小问题下到elasticsearch-PHP库持续的连接。我有一个负载均衡器后面的ES,它在5分钟后超时TCP连接。问题是在ES php库中不存在活着。 5分钟后连接关闭,但它不会关闭我的连接。有没有办法为elasticsearch-php设置保持活动状态?或打电话重置连接?

//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

看起来像失业的问题,而不是ES。你是否在处理失败的工作? –

+0

我正在处理失败的作业,但作业没有失败,它只是挂起,就好像它试图连接到ES而没有超时 – arrowill12

回答

0

我最终什么事做来解决这个问题是创建ES客户端时添加以下设置。

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

希望这可以帮助别人。

4

收集各地,让我们讨论持久的队列过程。

Laravel排队工作,与工人。那些无租金精灵从我们的队列服务中获取工作并及时处理它们。

然而,经过长时间的不停的工作,我们的精灵开始变得疲倦并随机产生错误。错误类型包括故障to send mail using SwiftMailer,处理数据库事务或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

与laravel的路径替换/path/to/my/laravel/installation

yourenvironment与您的laravel的环境名称。

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

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

+0

不会重新启动队列会终止当前正在处理的作业吗? – arrowill12

+0

我已经尝试重新启动队列,但没有运气。请看看我上面的更新。 – arrowill12

+0

重新启动队列将等待当前正在处理的作业完成。因此没有数据丢失。 – Mysteryos