2012-09-14 40 views
4

是否有可能像使用Ajax一样使用SSE将POST数据发送到PHP?通过服务器发送事件向PHP发布POST?

我一直在使用AJAX很长一段时间,但在长轮询技术中效果不好。我也一直在思考WebSockets,但似乎有点多余。

+1

SSE是专为单向推动,而不是双向通信 - 此Web套接字可能是更合适的 – tomfumb

+0

怎么样的node.js, http://nodejs.org – FirmView

+0

@tomfumb我只POST 2字节的数据 – user1431627

回答

4

不,SSE不能发送任何数据到服务器。

您仍然可以使用SSE实时读取数据并使用AJAX上传任何数据(您可能需要共享数据库在AJAX接收过程和SSE发送过程之间传递信息)。

0

您可以通过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

+0

欢迎来到Stack Overflow!虽然这可能会在理论上回答这个问题,[这将是更可取的](// meta.stackoverflow.com/q/8259)在这里包括答案的基本部分,并提供参考链接。 –