我正在使用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...";
}
请提出一些建议。
答案 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这样的特殊服务器。最好的用途是从服务器获取实时通知。例如,如果我们有社交网站,我们需要朋友请求通知或接受通知。
如何使用步骤:
假设我们在朋友控制器中工作,然后在行动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;
}
编写一个可在布局中或布局中使用的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')
}