Как сделать так, чтобы веб-страница с отправленным сервером источником событий с использованием php-сокетов не зависала - PullRequest
0 голосов
/ 24 ноября 2018

Моя страница home.php содержит различные ссылки.При щелчке по одному из этих hrefs открывается второе окно с именем sseReceiver.php.Окно home.php также остается открытым.sseReceiver.php использует отправленный сервером источник событий, который называется theSource.php, для получения событий и их отображения в таблице.

theSource.php устанавливает сокетное соединение с сокетом, который был создан с использованием Java-сервера.Когда сервер Java генерирует сообщение, theSource.php получает его и сбрасывает.sseReceiver.php забирает это сообщение и отображает его.

Это хорошо работает.

Однако, пока sseReceiver.php открыт, если я нажимаю на любую другую ссылку на моей странице home.php,страница зависла при загрузке и в итоге выдает ошибку 504.

Вопрос Почему я не могу получить доступ к другим ссылкам на home.php, когда запущен sseReceiver.php?Есть ли способ запустить theSource.php в другой ветке, чтобы я мог получить доступ к остальной части сайта одновременно?

Ценю ваши предложения и помощь.

Спасибо.

Код для theSource.php

session_start();    
header("Content-Type: text/event-stream\n\n");
header('Cache-Control: no-cache');
set_time_limit(0);
ob_end_flush();
ob_implicit_flush(1);

function sendMessage($message)
{   
    $explodedData = explode(',', $message);
    $data = array();            
    foreach ($explodedData as $result) 
    {
        $b = explode('^', $result);
        $data[trim($b[0])] = trim($b[1]);
    }   
    //sse stuff
    echo("retry: 3000\n");
    echo('data: '. json_encode($data));             
    echo "\n\n";
    flush();
}


$serverAddress=SERVER_ADDRESS;
$serverListeningPort=SERVER_PORT;
//make a connection and get a socket object
if ( ($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE )
{
    echo "socket_create() failed: reason: " .socket_strerror(socket_last_error());
}
else
{
    echo("socket create was successful");
    echo("<br>");
}
echo ("Attempting to connect to host");
echo("<br>");
if ( ($result = socket_connect($socket, $serverAddress, $serverListeningPort)) === FALSE )
{

    echo ("socket_connect() failed. Reason:".socket_strerror(socket_last_error($socket)));
}
echo ("Reading response:");
$message="";

while(true)
{                           
    $message=socket_read($socket, 300);
    if($message!=='')
    {
        sendMessage($message);  
    }
}

Код для sseReceiver.php

var evtSource=new EventSource("theSource.php");     

evtSource.onmessage=function(event)
{           
    var payload=JSON.parse(event.data);     
    // code to display payload on webpage in a table
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...