Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Server-Sent Events with PHP

I have a web app which sends some data from a js script to a php server which inserts it into a mysql database. I also need to notify all other clients that the data has been sent and send it to them.

I'm trying to use Server-Sent Events to do this but I'm having some trouble grasping the concept. Here's my code:

$(document).ready(function() {
    var source = new EventSource("../Server/insertMessage.php");
    if(typeof(EventSource) == "undefined") {
        alert("event source doesnt work");
    } else { alert("event source works"); }

    source.onmessage = function(event) {
        alert(event.data);
        // do stuff with event.data
    };
});

Elsewhere in my js script, I send an AJAX request to insertMessage.php with POST parameters as the data details. Does this trigger the server-side event? Here's my server side code:

insertMessage.php

if(isset(// check POST to see if the right request was sent)) {
    // insert data into database
    // ...
    // ...

    // Send the new data to listeners
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    // Create data array
    $dataArray = array("data" => $data, "moreData" => $moreData);
    // Encode JSON
    $callback = json_encode($dataArray);
    // Send it
    echo "data: $callback";
    flush();
}

While the "event source works" alert is sent, I never get the event.data alert, even though I am making the AJAX call to insertMessage.php. I may not completely understand Server-Sent Events yet. What am I doing wrong?

like image 450
Youssef Moawad Avatar asked Feb 11 '26 10:02

Youssef Moawad


1 Answers

You cannot use server sent events on this way:

Use this:

session_write_close(); // Close the session before your response! It helps your client create new requests to you server during the execution.

$echo= "id: $time" . PHP_EOL; // Important!
$echo.= "retry: ".$retry_time."" . PHP_EOL;  // Handle reconnect time (ms)
$echo.= "event: message" . PHP_EOL; // Event message type
$echo.= "data: {\n"; // JSON
$echo.= "data: \"data\": \"$data\" \n";  // JSON
$echo.= "data: }\n"; // JSON
$echo.= PHP_EOL; // Important!

Line breaks are really important in Eventsource!

You are able to use PHP for SSE but always keep in mind you should close the SESSION a soon as possible during the execution!

My stress test results: (Server config: [email protected],8Gb Ram,100/100Mbit) Ubuntu 14.04+Apache, Max connection: 1024

With 100 Connection Load = 0.14, with 1 SQL query/tick and 1sec refresh rate.

Below 500-600 active user you are able to use PHP for SSE without any problem, even with Apache.

like image 61
regdvsgrevdafsy Avatar answered Feb 14 '26 00:02

regdvsgrevdafsy