javascript - 为什么不能同时使用ajax和服务器发送事件?

标签 javascript php ajax server-sent-events

Ajax:每次点击,都会发送一个ajax请求,控制台会显示服务器发送的文本。

“服务器发送事件”:它随机发送文本到控制台

如果我只使用ajax,我会从服务器接收数据。但是如果我使用这两种方法,我没有从服务器接收到响应 ajax 请求的数据,但仍然接收到响应“服务器发送事件”的消息。我什至没有收到来自 ajax 请求的失败消息。有人能解释一下吗?

客户端

var evtSource = new EventSource("config/addRemoveEvent.php");
evtSource.onmessage = function(e) {
  //var newElement = document.createElement("li");
  console.log("listening: "+ e.data);
  //newElement.innerHTML = "message: " + e.data;
  //eventList.appendChild(newElement);
}   

var data = {
    'action':'Initiate brief calendar', 
    'selectedMonth': month, 
    'selectedYear': year
};

var $request = $.ajax({
    type: "GET",
    dataType: "text",
    url: "config/addRemoveEvent.php",
    data: data,
    beforeSend: function(){
        console.log('start sending request');

    }
});

$request.fail(function(){
    console.log('fail');
}); 
$request.done(function(data){
    // change bg color of the cells that contain events;
    console.log(data);
});

服务器

header("Content-Type: text/event-stream\n\n");
date_default_timezone_set("America/New_York");

while (1) {

  if (!$counter) {
    echo 'data: This is a message at time ' . $curDate . "\n\n";
    $counter = rand(1, 3);
  }

  ob_flush();
  flush();
  sleep($counter);
}

// return the date has event in a given month 
if($_GET['action'] == "Initiate brief calendar"){
    echo 'hello';
}

最佳答案

您的 php 脚本对于 SSE 是正确的:

  • 它发送内容类型:text/event-stream
  • 这是一个无限循环,不断向客户端发送数据

另一方面,当您使用 $.ajax 时,它需要一个服务器脚本向其发送一堆数据并关闭连接。

使用 PHP 脚本完成这两件事是可能的,尽管代码味道不好:两个脚本、两个 URL 会更好。

你的代码已经差不多了,实际上,你只需要先进行特殊操作处理,然后退出即可。

date_default_timezone_set("America/New_York");

// return the date has event in a given month 
if($_GET['action'] == "Initiate brief calendar"){
    echo 'hello';
    exit;
}

//session_write_close();  //See below

header("Content-Type: text/event-stream\n\n");
while (1) {

  if (!$counter) {
    echo 'data: This is a message at time ' . $curDate . "\n\n";
    $counter = rand(1, 3);
  }

  ob_flush();
  flush();
  sleep($counter);
}

顺便说一句,请小心 PHP session 处理,因为 PHP 将在脚本的生命周期内锁定 session 。当您的 SSE 脚本永远运行时,这将停止任何其他 PHP 脚本的运行。

因此,如果您使用 session ,但还计划在 SSE 脚本运行的同时进行 ajax 调用,请让您的 SSE 脚本与其 session 断开连接。我已经在上面显示了(已注释掉),您可以在其中放置 session_write_close() 来实现此目的。

关于javascript - 为什么不能同时使用ajax和服务器发送事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31624576/

相关文章:

javascript - 使用 3 种方法创建一个 JavaScript 对象会抛出 Object has no method

javascript - 使用 jQuery 的 PHP 用户登录

javascript - 如何根据 ajax 错误响应禁用元素

javascript - 将选定的多个单选按钮值和 uniqueId 添加到数组

javascript - 删除 div 的特定区域

php - 为什么 strtotime 对于不同时区返回相同的结果

php - 在 Apache2/Linux (LAMP) 上为 PHP 网站设置文件权限的最佳做法是什么?

jquery - 无法使用 jQuery.Get() 方法刷新

javascript - 如何在AngularJS中保存 View

php - 基于多个复选框运行查询