События, отправленные сервером PHP Соединение не будет закрыто? - PullRequest
0 голосов
/ 26 апреля 2018

Я реализовал отправленные сервером события с источником событий в моем веб-приложении. В основном в JavaScript мой код выглядит так:

    var myEventSource;
    if (typeof(EventSource) !== "undefined" && !myJsIssetFunction(viridem.serverSideEvent.config.reindexProcessingEvent)) {
        myEventSource = new EventSource('/my/url/path.php?event=myevent');
        EventSource.onmessage = function(e) {
          [...] //Dealing with e.data that i received ...
        }
    }

на стороне PHP у меня что-то вроде этого:

<?php
  header('Content-Type: text/event-stream');
  header('Cache-Control: no-cache');
  header("Access-Control-Allow-Origin: *");

  //this or set_the_limit don't work but whatever I can deal without it
  ini_set('max_execution_time', 300);
  //ignore_user_abort(true); tried with true and false

  bool $mustQuit = false;

  while (!$mustQuit && connection_status() == CONNECTION_NORMAL) {
     if(connection_aborted()){
      exit();
     }
     [...] //doing some checkup

    if ($hasChange) {
      //Output stuffs
      echo 'data:';
      echo json_encode($result);
      echo "\n\n";
      ob_flush();
      flush();
      sleep(5);
    }

  }

из ответа, найденного по адресу: PHP Event Source продолжает выполнять , заголовки "text / event-stream" должны автоматически закрывать соединение, но в моем случае этого не происходит ..

Я добавил eventsource.close в событие window.onbeforeunload, но оно не закрыло событие.

window.onbeforeunload =  function() {
    myEventSource.close();
    myEventSource = null;
};

Если я просматриваю сетевой раздел моего браузера, я вижу заголовки (после добавления максимального цикла 30): Тип контента: текст / поток событий; кодировка = UTF-8

Заголовки ответа:

Access-Control-Allow-Origin: *

Cache-Control: без кеша

Подключение: Keep-Alive

Тип содержимого: текст / поток событий; кодировка = UTF-8

Сервер: Apache / 2.4.18 (Ubuntu)

Дата: четверг, 26 апреля 2018 20:29:46 GMT

Истекает: четверг, 19 ноября 1981 г. 08:52:00 по Гринвичу

Заголовки запроса:

Соединение: keep-alive

Принять: текст / событие-поток

Cache-Control: без кеширования

Примечание: я подтверждаю, что скрипт все еще работает с журналами и проверяя процесс apache2 с помощью bash (ps -ax | grep -c apache2), который всегда увеличивается.

1 Ответ

0 голосов
/ 27 апреля 2018

Благодаря помощи @LawrenceCherone я обнаружил, что вам нужно «вывести данные» для работы connection_aborted ...

В моем случае я выводил данные только тогда, когда мне нужно было ...

добавив

   if ($hasChange) {
      //Output stuffs
      echo 'data:';
      echo json_encode($result);
      echo "\n\n";
      ob_flush();
      flush();
      sleep(5);

    } else {
       echo 'data:';
       echo "\n\n";
       ob_flush();
       flush();
       if(connection_aborted()){
         exit();
       }
    }

connection_aborted начал работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...