2015-01-08 1 views
0

Я создаю процесс хранения аналитических данных (используя поиск по эластичности), где мне нужно добавить элементы, которые нужно сохранить в эластичный от моего контроллера. Но затем я хочу подождать, пока ответ не будет отправлен пользователю для фактической обработки. Я не хочу, чтобы пользователь должен был дождаться завершения этого процесса до получения ответа сервера.В Laravel, как я могу добавлять элементы в массив в контроллере, а затем обрабатывать после ответа через App :: finish()

Я планирую запустить часть обработки с помощью:

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

Я знаю, что это будет работать после того, как ответ был послан. Тем не менее, я не уверен, как получить данные, которые были скомпилированы в контроллере (или любом классе) для ссылки в методе закрытия App :: finish().

Я пробовал использовать App::singleton(), но есть много случаев, когда мне нужно иметь возможность постоянно «устанавливать» данные, я не могу просто установить его один раз. Я предполагаю, что в основном ищу глобальную переменную, с которой я могу манипулировать, но я знаю, что этого не существует в Laravel.

Другой вариант заключается в использовании Session::push() и Session::get(), но сейчас у меня есть хранилище сеансов с использованием Memcached для этого приложения, и я предпочел бы не делать дополнительный ввод/вывод на Memcached, когда я мог бы просто быть хранящей данные, необходимые для сохранения в временная память.

Кажется, мне просто нужен простой контейнер для записи и чтения, из которого сохраняется только в памяти, но я не могу найти это в документах Laravel.

+0

Насколько я знаю, вы не можете что-то сделать после того, как запрос был отправлен клиенту. Я думаю, что очереди - это путь ... – lukasgeiter

+0

@lukasgeiter - hmm похоже на 'App :: finish()' будет делать трюк. скрещенные пальцы. – phirschybar

+0

Действительно? Меня это удивляет ... Итак, единственная проблема заключается в использовании данных, установленных в контроллере в 'App :: finish()'? – lukasgeiter

ответ

0

Возможно, вы используете магический метод __destruct() на тех контроллерах, которые вам нужны для обработки.

Вы также можете реализовать его в BaseController, если он должен работать для всех контроллеров.

Другим вариантом будет использование sqlite в памяти. Просто создайте новое соединение

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

Затем вы можете использовать DB::connection('sqlite_memory') использовать эту связь и хранить/сохранить все, что вам нужно с помощью конструктора запросов.

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