POST для PHP с событиями, отправленными сервером?

Можно ли использовать SSE для отправки данных POST на PHP, например, в Ajax?

Я уже давно использую AJAX с плохими результатами в длинных опросах. Я также думал о WebSockets, но он кажется немного лишним.

Solutions Collecting From Web of "POST для PHP с событиями, отправленными сервером?"

Нет, 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(); } 

если вы хотите отправить массив, вы можете обратиться к этому