Можно ли использовать SSE для отправки данных POST на PHP, например, в Ajax?
Я уже давно использую AJAX с плохими результатами в длинных опросах. Я также думал о WebSockets, но он кажется немного лишним.
Нет, SSE не может отправлять какие-либо данные на сервер.
Вы все же можете использовать SSE для чтения данных в реальном времени и использовать AJAX для загрузки любых данных (вам может понадобиться общая база данных для передачи информации между процессами приема AJAX и отправкой SSE).
Вы можете отправлять данные через GET.
например
name=john&name=lea
Это простой скрипт, который отправляет серверный номер итерации и возвращает сервер, используя SSE.
Этот проект состоит из двух файлов (index.php и ssedemo.php).
index.php содержат текстовое поле и кнопку. текстовое поле должно содержать число итераций цикла в ssedemo.php
<h2>Server Sent Event Test</h2> <form> <label>Process Duration</label> <input type="text" id="progVal"> <input type="button" value="Get Messages" onclick="updateProgress()"/> </form> <div id="container"> </div>
UpdateProgress
function updateProgress() { var input = $('#progVal').val(); var evtSource = new EventSource("ssedemo.php?duration=" + encodeURIComponent(input)); evtSource.addEventListener("progress", function (e) { var obj = JSON.parse(e.data); $('#container').html(obj.progress); if( parseInt(obj.progress) == 100){ evtSource.close(); } }, false); }
эта функция получает содержимое текстового поля с помощью jQuery, а затем создает eventSource . Конструктор EventSource () принимает один или два аргумента. Первый указывает URL-адрес для подключения. Второй указывает параметры, если они есть, в виде словаря EventSourceInit.
Вы можете передать то, что хотите, добавив его в URL-адрес, как в GET.
"ssedemo.php?duration=" + encodeURIComponent(input)
На стороне сервера вы должны установить тип заголовка и отключить кеш в соответствии с рекомендацией W3C
header("Content-Type: text/event-stream"); header("Cache-Control: no-cache");
то вы получаете данные с помощью $ _GET, как обычно.
$TotalNo = $_GET['duration']; for ($i = 1; $i <= $TotalNo; $i++) { updateProgress($i, $TotalNo); sleep(1); } function updateProgress($currentVal, $totalNo) { $completionPrecentage = $currentVal / $totalNo * 100; echo "event: progress\n"; echo 'data: {"progress": "' . $completionPrecentage . '"}'; echo "\n\n"; ob_flush(); flush(); }
если вы хотите отправить массив, вы можете обратиться к этому