在蛋糕PHP中使用Server-Sent事件

时间:2014-05-29 04:38:29

标签: php mysql cakephp server-sent-events

我正在使用Server-Sent Event将数据从核心php发送到html并且运行正常..

我使用了参考http://www.w3schools.com/html/html5_serversentevents.asp

中的示例

但是当我尝试使用restful apis在CakePHP中做同样的事情时,它会产生问题。

这是我的代码:

控制器:sseController.php

           public function sseTest() {
                header('Content-Type: text/event-stream');
                header('Cache-Control: no-cache');

                $time = date('r');
                $this->set('finalData',"data: The server time is: {$time}\n\n");
            }

查看:sse_view.ctp

<?php
     echo json_encode($finalData);
     flush();
?>  

HTML调用api是......

    if(typeof(EventSource)!=="undefined")
    {
       var source=new EventSource('http://localhost/b2c/api/reports/sseTest');
       source.onmessage=function(event)
       {
          document.getElementById("result").innerHTML+=event.data + "<br>";
       };
    }
    else
    {
             document.getElementById("result").innerHTML="Sorry, your browser does not support   server-sent events...";
    }

请提出一些建议。

4 个答案:

答案 0 :(得分:0)

您在视图中尝试json_encode无效的JSON,这可能会导致您出现问题

"data: The server time is: {$time}\n\n" // this is not JSON

您需要根据HTML5 Server-Sent Events docs in w3schools

删除json_encode来更改视图

视图sse_view.ctp看起来像:

<?php
     echo $finalData;
     flush();
?>  

答案 1 :(得分:0)

更新:我在我当地尝试了这个,这是有效的!

Controller:sseController.php

public function sse_test() { //change your function to this (cakePHP standards)
header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    $time = date('r');
    $this->set('finalData',"data: The server time is: {$time}\n\n");
}

public function sse_view(){ //add this one

}

查看:sse_view.ctp

<div id="result"></div>
<script tye="text/javascript">
   if(typeof(EventSource)!=="undefined")
   {
         var source=new EventSource('<?php echo "http://localhost{$this->base}/reports/sse_test";?>'); //you  must check this one if the path is correct (modify if not correct or try to alert it)
        // alert('<?php echo "http://localhost{$this->base}/reports/sse_test";?>'); //uncomment to check if your using the correct path
   source.onmessage=function(event)
   {
      document.getElementById("result").innerHTML+=event.data + "<br>";
   };
}
else
{
       document.getElementById("result").innerHTML="Sorry, your browser does not support   server-sent events...";
}

在sse_view.ctp的相同路径下创建一个文件:sse_test.ctp

<?php
    echo $finalData;
    flush();
?> 

答案 2 :(得分:0)

将此代码更改为

$this->layout = false;

在控制器动作功能

答案 3 :(得分:0)

服务器发送事件是自动向服务器发送请求并在常规时间间隔后获得响应的方式.SSE使用HTTP协议,即它不需要像socket这样的特殊服务器。最好的用途是从服务器获取实时通知。例如,如果我们有社交网站,我们需要朋友请求通知或接受通知。

如何使用步骤:

  1. 假设我们在朋友控制器中工作,然后在行动get_friend_request_count

    function get_friend_request_count($user_id) {
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
    
        //example query
        $friend_count = $this->friend-  >find('count',array('conditions'=>array('user_id'=>$user_id)));
        echo "retry: 5000\n data: Friend count : { $friend_count }\n\n";
        flush();
        die;
    }
    
  2. 编写一个可在布局中或布局中使用的javascript代码:

    if (typeof(EventSource)!=="undefined") {
        var source = new EventSource('localhost/friends/get_friend_request_count'); //modify path as correct path
        source.onmessage = function(event) {
            $('#friend_count').html(event.data);
        };
    }
    else {
        alert('Server sent event does not work with IE')
    }