PHP 8 SSE Kullanımı 2023
27 Eylül 2023
Php ile composer paket yüklemeden Server-Side Event kullanımı nasıl yapılır ? Event kullanımını araştırdığınızda oldukça demode bir yöntemin tüm kaynaklarda yer verildiğini görürsünüz, ancak güncel tarayıcılar bu demode yöntem işlevini yerine getirememektir. Bu sorunu çözmek için paket yüklemenize gerek kalmayacak şekilde çıktıyı tanımlanmanız gerekmektedir.
Saatlerimi harcadığım bu sorunun çözümü umarım ihtiyacınızı karşılayacaktır.
SSE.php
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no'); // Nginx: unbuffered responses suitable for Comet and HTTP streaming applications
$i = 0;
function line(){
global $i;
$event = [];
$event[] = sprintf(': %s', "event");
$event[] = sprintf('id: %s',++$i);
$event[] = sprintf('retry: %s', "no");
$event[] = sprintf('event: %s', "veriseti"); // event adı
$event[] = sprintf('data: %s', json_encode( ['message' => "Merhaba dünya"])); // event çıkısı
return implode("\n", $event) . "\n\n";
}
while (true) {
try {
echo line();
} catch (Exception $e) {
return;
}
if (ob_get_level() > 0) {
ob_flush();
}
flush();
// if the connection has been closed by the client we better exit the loop
if (connection_aborted()) {
return;
}
sleep(1);
}
JS ile bu datayı nasıl yakalayacağımıza örnek bir kod
<!DOCTYPE html>
<html>
<head>
<title>SSE Örneği</title>
</head>
<body>
<div id="sse-data"></div>
<script>
const sseData = document.getElementById('sse-data');
// withCredentials=true: pass the cross-domain cookies to server-side
const source = new EventSource('sse.php', {withCredentials: true});
source.addEventListener('news', function (event) {
console.log(event.data);
sseData.innerHTML += event.data;
}, false);
</script>
</body>
</html>
Server Side Event işlemini composer ile yapmak için hhxsv5 bu paketi projenize dahil edebilirsiniz.