状態
JS+PHPでリアルタイムのチャットをロングポーリングで実装しています。
JS側でリクエストを投げ、PHP側で1秒間隔でチェックを行い、タイムアウトを考慮して20秒程度で一旦返す形で実装しております。
サーバにajaxでリクエストを投げてからサーバ側で処理している時に、ページ遷移(更新)を行うと
前述のリクエストが返ってくるまでページ読み込みがされない状態となり、最大20秒前後待つ形になってしまいました。
相談内容
次項の環境は変えずに、同一セッションからの複数リクエストが直列化されない様にすることは可能でしょうか。
ex)Apacheの設定変更や、jsでの設定項目など
難しい場合、素直にjs側でPromiseなりsetIntervalなどでポーリング処理を行いたいと思います。
環境
Apache2.4
PHP5.6
MySQL5.6
全て1台にまとまっております。
簡易ソース及び実行結果
js
1for(var i=0;i<5;i++){ 2 (function(i){ 3 console.log("sent"); 4 $.ajax({ 5 url:url, 6 type:"POST" 7 }).done(function (response) { 8 console.log("ok"); 9 }); 10 })(); 11}
php
1function xxxx(){ 2 for($i=0;$i<20;$i++){ 3 //更新チェック処理及び離脱処理 4 sleep(1); 5 } 6 echo (json_encode($result)); 7 exit(); 8}
(リクエストを投げる時はほぼ同時) sent sent sent sent sent (20秒間隔で結果が返ってくる) ok ok ok ok ok
試したこと
xhr.abort()でのリクエストキャンセル要求
→サーバ側の処理まで中断されないため、ロングポーリングが動ききってからページリロードなどのリクエストが処理されました。
## 試してみたいが試せてないこと
HTTP/2でのリクエストの場合どうなるのか?
APIサーバを独立させ冗長化した後にリクエストを分けた場合には解決するのか?
nginxなどのApache以外のWebサーバを選択した場合には解決するのか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/30 04:49
2018/05/30 10:18
2018/05/31 00:31