javascript・phpとServer-Sent Eventsでチャットを作成しています。
phpでjsonファイルを確認し、最新のメッセージがあればjavascript側に送信し、表示される仕組みなのですが、下のプログラムではファイルの末尾だけを取得しています。
これだと同時に複数人の書き込みがあった場合、最後に書きこんだ人のメッセージしか表示されません。
過去ログと最新データを比較して、差分を取得するにはどうすればよいでしょうか。
文章が伝わりにくかったら申し訳ございません。ご提示よろしくお願いいたします。
javascript
1var lastLog = []; 2var es = new EventSource('server.php'); 3 4//過去ログを取得 5function logDataRead(){ 6 es.addEventListener('log', function (event) { 7 var result = JSON.parse(event.data); 8 if(lastLog == false){ 9 for(var ct=0;ct < result.length;ct++){ 10 $("div").prepend(result[ct]); 11 } 12 if(result == false){ 13 lastLog = []; 14 }else{ 15 lastLog = result.slice(-1)[0]; 16 } 17 newDataRead(); 18 } 19 }); 20} 21 22//新着メッセージを取得 23function newDataRead(){ 24 es.addEventListener('newmessage', function (event) { 25 var result = JSON.parse(event.data); 26 lastLog = result; 27 $("div").prepend(result[ct]); 28 }); 29}
php
1<?php 2ignore_user_abort(true); 3header('Content-Type: text/event-stream'); 4header('Cache-Control: no-store'); 5session_start(); 6 7while(connection_aborted() !== CONNECTION_ABORTED) { 8 //ログデータ読み込み 9 $url = '../data/log.json'; 10 $json = file_get_contents($url); 11 $data = json_decode($json); 12 $cnt = count($data); 13 if($cnt > 20){ 14 $log_data = array_slice($data , $cnt-20, 20); 15 }else{ 16 $log_data = $data; 17 } 18 $log_data = json_encode($log_data); 19 $last_data = end($data); 20 $last_data = json_encode($last_data); 21 22 echo "id: $n\n"; 23 24 //過去ログ送信 25 if(empty($_SESSION['last_log'])){ 26 echo "event: log\n"; 27 28 printf("data: %s\n\n", $log_data); 29 echo "\n\n"; 30 31 $_SESSION['last_log'] = $last_data; 32 } 33 //新着メッセージ送信 34 if($last_data){ 35 echo "event: newmessage\n"; 36 37 printf("data: %s\n\n", $last_data); 38 39 echo "\n\n"; 40 41 $_SESSION['last_log'] = $last_data; 42 } 43 44 echo "retry: 1000\n"; 45 46 ob_end_flush(); 47 flush(); 48 session_write_close(); 49 sleep(1); 50} 51?>

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/25 08:43
2019/08/25 09:19