在Laravel中,如何在控制器中向数组添加项目,然后通过App :: finish()在响应后处理

时间:2015-01-08 18:04:55

标签: php laravel inversion-of-control

我正在创建一个分析存储过程(使用弹性搜索),我需要在控制器中添加要弹性存储的项目。但后来我想等到响应发送给用户后实际进行处理。我不希望用户在获得服务器响应之前必须等待此过程完成。

我打算使用以下方式运行处理部分:

App::finish(function(){
   // DO THE PROCESSING
})

我知道这会在发送回复后运行。但是,我不确定如何在App :: finish()闭包方法中引用在控制器(或任何类)中编译的数据。

我尝试使用App::singleton(),但在很多情况下,我需要能够不断地设置'数据,我不能只设置一次。我想我本质上是在寻找一个可以操纵的全局变量,但我知道Laravel中并不存在。

另一个选择是使用Session::push()Session::get()但是现在我使用memcached为这个应用程序创建了Session存储,当我可以存储时,我宁愿不对memcached执行额外的I / O操作数据需要保存在临时内存中。

好像我只需要一个简单的容器来写入和读取只保存在内存中,但我在Laravel文档中找不到。

2 个答案:

答案 0 :(得分:0)

您可以在需要进行处理的控制器上使用__destruct()魔术方法。

如果它应该针对所有控制器运行,你也可以在BaseController中实现它。

另一种选择是在内存中使用sqlite。只需创建一个新连接

    'sqlite_memory' => array(
        'driver'   => 'sqlite',
        'database' => ':memory:',
        'prefix'   => '',
    ),

然后,您可以使用DB::connection('sqlite_memory')来使用该连接,并使用查询构建器存储/保存您需要的任何内容。

答案 1 :(得分:0)

您可以使用“use”将数据传递给闭包。

In PHP 5.3.0, what is the function "use" identifier?

我最终使用这样的东西在将数据返回给用户后将数据存储在缓存中。

App::finish(function($request, $response) use ($id, $json){
    Cache::put('key_'.$id, $json, 1440);
});