我正在创建一个分析存储进程(使用弹性搜索),我需要从控制器添加要存储在弹性中的项目。但是我想等到响应发送给用户之后才能实际进行处理。我不希望用户在获得服务器响应之前必须等待此过程完成。
我计划使用以下方法运行处理部分:
App::finish(function(){
// DO THE PROCESSING
})
我知道这将在发送响应后运行。但是,我不确定如何获取在控制器(或任何类)中编译的数据以在 App::finish() 闭包方法中引用。
我尝试使用App::singleton()
但在许多情况下,我需要能够持续"设置"数据,我不能只设置一次。我想我本质上是在寻找一个我可以操作的全局变量,但我知道这在 Laravel 中不存在。
另一种选择是使用 Session::push()
和 Session::get()
但现在我的会话存储为此应用程序使用 memcached 并且当我可以存储需要保存在临时内存中的数据时,我宁愿不在 memcached 上执行额外的 I/O。
似乎我只需要一个简单的容器来写入和读取,该容器仅保存在内存中,但我在 Laravel 文档中找不到它。
您可以在需要处理的任何控制器上使用 __destruct()
magic 方法。
如果它应该为所有控制器运行,您也可以在 BaseController
中实现它。
另一种选择是在内存中使用 sqlite。 只需创建一个新连接
'sqlite_memory' => array(
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
),
然后,您可以使用DB::connection('sqlite_memory')
使用该连接,并使用查询生成器存储/保存所需的任何内容。
您可以使用"use"将数据传递给闭包。
在 PHP 5.3.0 中,函数"use"标识符是什么?
我最终使用这样的东西在将数据返回给用户后将数据存储在缓存中。
App::finish(function($request, $response) use ($id, $json){
Cache::put('key_'.$id, $json, 1440);
});