Обновление живых данных (например, индикатор выполнения) с Laravel 4

TL; DR

Я хотел бы отправить данные для обновления в режиме реального времени, например, индикатор выполнения, показывающий статус действия. Каков наилучший способ сделать это в laravel 4?


Настройка

Я работаю над проектом Laravel 4, где каждый пользователь может выкупить серийный ключ.

Я создал бэкэнд администратора, где я могу легко вставить список ключей или загрузить файл из них.

Предположим, что $key_string – это строка $key_string ключей, которые я загрузил, и хочу выполнить синтаксический анализ, чтобы затем загрузить содержащиеся строки ключей – вот упрощенный код, который добавляет ключи:

 $key_string = rtrim($key_string); $key_string = str_replace("\n\r", "\n", $key_string); $keys = explode( "\n", $key_string); foreach($keys as $index => $key) { Key::create( array( "serial" => trim($key) ) ); } 

Поскольку наборы ключей я загружаю в тысячах, это может занять около 30 секунд, в течение которого администратор панели ничего не показывает.

Теперь я не возражаю, принимая это время. Мне не нужно оптимизировать загрузку для использования одного запроса и т. Д., Но я хотел бы получить некоторую фактическую обратную связь, поэтому я знаю, как далеко загрузилась загрузка.


Вопрос

Когда я загружаю ключи, я бы хотел обновить индикатор выполнения или счетчик на мой взгляд каждые несколько секунд или процентные тики (используя текущий $index )

Есть ли простой способ справиться с этим безболезненно, желательно интегрироваться в Laravel 4? Я предполагаю, что это связано с ajax, но может ли кто-нибудь указать мне в правильном направлении?

Related of "Обновление живых данных (например, индикатор выполнения) с Laravel 4"

В PHP есть два варианта без перехода в Web Sockets или Push-Pull. На самом деле это не Laravel, это скорее цикл AJAX, который запрашивает JSON «вещь».

Короткие опросы

Olark использует эту методологию для своего сценария чата.

 setInterval(function() { $.getJSON("/path", function(data) { // update the view with your fresh data }); }, 5000); 

Длительный опрос

Javascript

 var eventName = function() { $.getJSON("/path", function(data) { // update the view with your fresh data if (data.progress < 100) eventName(); }); }; 

Логика контроллера

Я использую это, когда пользователи загружают CSV и ждут завершения его загрузки и обработки.

 // in your controller $check = true; while ($check) { // search database // compare values if ($newDataWasFound) $check = false; $progressFromAbove = 90; } return Response::json(array( 'newData' => $array, 'progress' => $progressFromAbove, )); 

Я сделал screencast на этом использовании Laravel 3, но Long Polling – это PHP, а не Laravel. https://www.youtube.com/watch?v=LDgJF77jELo

Примеры

Вы можете поместить его в сеанс и получить его из другой ссылки.

 $key_string = rtrim($key_string); $key_string = str_replace("\n\r", "\n", $key_string); $keys = explode( "\n", $key_string); $count = 0; foreach($keys as $key) { Key::create( array( "serial" => trim($key) ) ); $count++; if($count % 5== 0) Session::put('count',$count); } //route.php Route::get('/count', function() { if( Session::has('count')) return Session::get('count'); }); 

Независимо от того, используете ли вы код Laravel или Core PHP, отправьте события, отправленные сервером . Это легко выполнимо с помощью SSE.

В основном это две части: –

1. Javascript API (клиентская сторона). Вам придется подписаться на поток событий, создать объект EventSource и передать ему URL-адрес вашего потока следующим образом:

 if (!!window.EventSource) { var source = new EventSource('stream.php'); } else { // Result to xhr polling :( } 

Затем настройте обработчик события сообщения. Вы можете дополнительно прослушать открытые и ошибки: –

 source.addEventListener('message', function(e) { console.log(e.data); }, false); source.addEventListener('open', function(e) { // Connection was opened. }, false); source.addEventListener('error', function(e) { if (e.readyState == EventSource.CLOSED) { // Connection was closed. } }, false); 

2. PHP (серверная сторона). Вам нужно будет отправить заголовок Content-Type: text/event-stream а затем нажать ответ как и при обработке в предопределенном формате следующим образом:

 <?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); // recommended to prevent caching of event data. /** * Constructs the SSE data format and flushes that data to the client. * * @param string $id Timestamp/id of this connection. * @param string $msg Line of text that should be transmitted. */ function sendMsg($id, $msg) { echo "id: $id" . PHP_EOL; echo "data: $msg" . PHP_EOL; echo PHP_EOL; ob_flush(); flush(); } $serverTime = time(); sendMsg($serverTime, 'server time: ' . date("h:i:s", time())); 

Все эти фрагменты заимствованы из вышеупомянутой ссылки, и тщательное исследование рекомендуется для четкого понимания.

ура