httpd側でpostを受ける用のカスタムログファイルを作っておき
「tail -f」で監視続ければよいのでは?
sse.php
php
1<?PHP
2header("Cache-Control: no-store");
3header("Content-Type: text/event-stream");
4date_default_timezone_set("Asia/Tokyo");
5
6$logFile = 'post.log'; // apacheのCustomLogを指定
7$command= 'tail -f -1 ' .$logFile;
8
9// winならpowershell
10//$command= 'powershell -Command "Get-Content ' .$logFile .' -wait -Tail 1"';
11
12$handle = popen($command, 'r');
13if ($handle) {
14 while (!feof($handle)) {
15 $buffer = fgets($handle);
16 if ($buffer === false) break;
17 $t=date("Y-m-d H:i:s");
18 print "data:".json_encode(["message"=>htmlspecialchars($buffer, ENT_QUOTES, 'UTF-8'),"time"=>$t]).PHP_EOL.PHP_EOL;
19 if ( connection_aborted() ) break;
20 ob_flush();
21 flush();
22 }
23 pclose($handle);
24}
ブラウザ側の処理
javascript
1<script>
2const evtSource = new EventSource("sse.php");
3evtSource.onmessage = function (event) {
4 console.log(event.data );
5};
6</script>
httpd.confの設定
「IfModule log_config_module」に以下追記してください
SetEnvIf Request_Method POST post_request
CustomLog "logs/post.log" combined env=post_request
上記post.logをsse.phpで指定してやればpostされるたびにSSEでデータが飛んできます