EventSource 是服务器推送的一个网络事件接口。一个EventSource实例会对HTTP服务开启一个持久化的连接,以text/event-stream 格式发送事件, 会一直保持开启直到被要求关闭。
一旦连接开启,来自服务端传入的消息会以事件的形式分发至你代码中。如果接收消息中有一个事件字段,触发的事件与事件字段的值相同。如果没有事件字段存在,则将触发通用事件。
与 WebSockets,不同的是,服务端推送是单向的。数据信息被单向从服务端到客户端分发. 当不需要以消息形式将数据从客户端发送到服务器时,这使它们成为绝佳的选择。例如,对于处理社交媒体状态更新,新闻提要或将数据传递到客户端存储机制(如IndexedDB或Web存储)之类的,EventSource无疑是一个有效方案。
public function mack(){
$fadata = [....];
$udata = [....];
$err = 0;
$ok = 0;
foreach ($udata as $k=>$t){
$f = dosometing();
if(!$f){
$err++;
cookie('errsum',$err);//发送错误的信息数
}else{
$ok++;
cookie('item',$ok); //已发送的信息数
}
}
echo 'ok';
}
//实际数据异步获取
public function source(){
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$zshu = (int)cookie('sum');
$shu = (int)cookie('item');
$errshu = (int)cookie('errsum');
if($shu + $errshu >= $zshu){
$echo['sta'] = 1;
$echo['str'] = '发送完毕,成功:'.$shu.', 失败:'.$errshu.'';
cookie('kefumsg_sum',null);
cookie('kefumsg_item',null);
cookie('kefumsg_errsum',null);
}else{
$echo['sta'] = 0;
$echo['str'] = '正在发送:'.$zshu .'/'.$shu;
}
$ech = json_encode($echo);
echo "data:{$ech}\n\n";
flush();
}
<div id="topjindu" style="right:10px; display:none; z-index:999; top:50%;position:absolute;background-color:#222; color:#FFF;height:30px;line-height:30px; padding-left:10px; padding-right:20px;">
发送中...
</div>
var topsc;
function jindu() {
$('#topjindu').show();
$.get('__CONTROLLER__/mack');
topsc = new EventSource("__CONTROLLER__/source");
topsc.onmessage=function(event){
var json = eval('['+event.data+']');
if(json[0].sta==1){
$('#topjindu').html(json[0].str);
topsc.close();
setTimeout(function(){ $('#topjindu').hide();location.reload();},5000);
}else{
$('#topjindu').html(json[0].str);
}
}
}