Я хотел бы отправить данные для обновления в режиме реального времени, например, индикатор выполнения, показывающий статус действия. Каков наилучший способ сделать это в 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, но может ли кто-нибудь указать мне в правильном направлении?
В 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()));
Все эти фрагменты заимствованы из вышеупомянутой ссылки, и тщательное исследование рекомендуется для четкого понимания.
ура