是否有可能像使用Ajax一樣使用SSE將POST數據發送到PHP?通過服務器發送事件向PHP發佈POST?
我一直在使用AJAX很長一段時間,但在長輪詢技術中效果不好。我也一直在思考WebSockets,但似乎有點多餘。
是否有可能像使用Ajax一樣使用SSE將POST數據發送到PHP?通過服務器發送事件向PHP發佈POST?
我一直在使用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 recommendation
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();
}
,如果你想送數組可以參考this
歡迎來到Stack Overflow!雖然這可能會在理論上回答這個問題,[這將是更可取的](// meta.stackoverflow.com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 –
SSE是專爲單向推動,而不是雙向通信 - 此Web套接字可能是更合適的 – tomfumb
怎麼樣的node.js, http://nodejs.org – FirmView
@tomfumb我只POST 2字節的數據 – user1431627