我正在创建一个分析存储过程(使用弹性搜索),我需要在控制器中添加要弹性存储的项目。但后来我想等到响应发送给用户后实际进行处理。我不希望用户在获得服务器响应之前必须等待此过程完成。
我打算使用以下方式运行处理部分:
App::finish(function(){
// DO THE PROCESSING
})
我知道这会在发送回复后运行。但是,我不确定如何在App :: finish()闭包方法中引用在控制器(或任何类)中编译的数据。
我尝试使用App::singleton()
,但在很多情况下,我需要能够不断地设置'数据,我不能只设置一次。我想我本质上是在寻找一个可以操纵的全局变量,但我知道Laravel中并不存在。
另一个选择是使用Session::push()
和Session::get()
但是现在我使用memcached为这个应用程序创建了Session存储,当我可以存储时,我宁愿不对memcached执行额外的I / O操作数据需要保存在临时内存中。
好像我只需要一个简单的容器来写入和读取只保存在内存中,但我在Laravel文档中找不到。
答案 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);
});