質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • PHP

    17759questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    1445questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Ajax

    958questions

    Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

ロングポーリング(Comet)の処理について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 396

yuuhi

score 42

リアルタイムチャットを作成するにあたりComet処理を実装したいのですが、下記のような感じでいいのでしょうか。

laravel5.4で開発しています。
レンタルサーバー上で稼働させる予定です。

1.下記の関数にAjaxでアクセスしユーザーからの入力があるまでループ処理で待機
2.ユーザーからの入力があった場合ループを抜けてjavascriptに値を返す
3.javascript内で値をwebページに挿入する処理。直後に1の処理

これを繰り返しています。

  public function comet()
    {
        $db = new \App\Models\Chat\Api\Posts();//DB内のPostsテーブルを操作するモデルクラスのインスタンス生成
        $response = array();
        $timeout = 0;

        $lastMessage = $db->select('id')->latest()->first();//DBに接続し最後に挿入(ユーザーが入力)された値のid(一意な値)を取得

        if ($lastMessage !== null) {//DB内に値が挿入されていた場合
      //先ほど取得したidとここで取得した値が異なるまで(ユーザーから新たな入力があるまで)ループ
            while ($lastMessage->id === $db->select('id')->latest()->first()->id) {
      
                if ($timeout === 16000) {//Httpコネクションのタイムアウトを防ぐ
                    unset($timeout);
                    break;
                }

                $timeout++;
            }

        }else {//DB内に値がない(まだユーザーからの入力がない)場合
       //DBに値が挿入されるまで(ユーザーから入力があるまで)ループ
            while ($db->select('id')->latest()->first() === null) {

                if ($timeout === 16000) {//Httpコネクションのタイムアウトを防ぐ
                    unset($timeout);
                    break;
                }

                $timeout++;
            }
        }

        return json_encode(//DB内の値(ユーザーからの入力)の全てをjavascriptに返す
            [
                'status' => 'success_comet',
                'record' => $db->orderBy('created_at' , 'desc')->get();
            ],
            JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT
        );

    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+4

Comet処理として独自に実装するのも良いですが、LaravelにはLaravel EchoというWebSocketでリアルタイム通信を実現できる機能がライブラリとして準備されており、SaasのPusherか、Socket.ioのnodeサーバーと連携して実現できる機能があるので利用を検討しても良いかと思います。
Laravel 5.4 ブロードキャスト

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/28 20:42

    ありがとうございます。調べてみたいと思います(`・ω・´)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    [数値と文字列の判断方法]

    渡ってきたデータを変数へ格納し、それを使用する際、   文字列として渡ってきたのか数値として渡ってきたのかを   確認する方法はありますでしょうか?   数値で渡ってきた

  • 受付中

    wordpress カスタム投稿 一件ずつ表示

    wordpressのカスタム投稿について質問があります。 カスタム投稿タイプ(複数)の最新投稿を1ページに全て効率良く出力する方法はありますでしょうか? =======

  • 解決済

    php mysql pagination

    各カテゴリ一覧にて、各カテゴリに当てられた記事ページ一覧の表示はできていますがそこで各カテゴリーページにて、記事が多い時を想定してページネーションを作ったんですが現在いるカテゴリで

  • 解決済

    二次元配列で、特定Keyに対するValueが重複しているものを、1つ残して重複を無くすのではなく全部...

    二次元配列で、中の配列の特定keyに対するvalueが重複していた時に そのvalueを持つもの全てを削除したいです。 少しコード直してみて、動くには動いたのですが とて

  • 受付中

    時間の足し算

    以前moriss.jsというグラフ描写ライブラリの使い方がよくわからず、質問させて頂きました。 今回は、値の管理についてです。質問は2つあります。 現在、勉強時間の管理サイ

  • 解決済

    ループ処理のネストについて

    大きい構造情報を扱うことが多いのですが、その折連想配列の階層が深いためプログラムでそれを利用する際に 2重for文になってしまうことがあるのですが、綺麗に書く方法はありませんでし

  • 受付中

    素材を比較したidと共通項目数をデータベースに格納したい

    「まだ回答を求めています」 質問に「まだ回答を求めています」と表示し、閲覧者に状況を知らせることで、新たな回答を得られやすくなります。以下のような場合にご利用ください。 もらっ

  • 解決済

    PHPで画面遷移が遅い

    PHP+JAVASCRIPTでプログラムを書いていますが 画面の遷移が遅くて困っています。 テキストボックスに入力した値を、JAVASCRIPTで拾い JAVASCRIPTから

同じタグがついた質問を見る

  • PHP

    17759questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    1445questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Ajax

    958questions

    Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。