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


In Laravel, how can I add items to array in controller and then process after response via App::finish()

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

我计划使用以下方法运行处理部分:

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);
});