メッセージを時間内にプッシュするために、インターネット上のさまざまな情報によると、ajax リクエストはページのロード時に開始され、その後サーバー側で保持されます。 1 秒。データ テーブルのカウント値が前の値より大きいかどうかを確認します (初期値は 0)。新しいメッセージがあることを意味し、そのカウント値を返します。多くのメッセージが存在する場合は、新しいリクエストを開始します。それ以外の場合、操作が 60 秒を超えると、メッセージが返され、新しいリクエストが開始されます。ただし、このリクエストを一時停止している間に他のリクエストを開始する必要がある場合、これらのリクエストは順番にブロックされ、ブロックされたリクエストを続行するには、一時停止されたリクエストが終了するまで待つ必要があります。明らかに私が望む結果ではありません。 webqqも見ましたが、iframeを使用しているようですが、リクエストブロックの問題を解決するためにiframeを使用する方法がわかりません。アドバイスをお願いします。 「プッシュプルモード」や「リバースAjax」などの大きな概念の使用は避けた方が良いでしょう。
返信内容:
ブロックの問題が発生しました。トラブルシューティングを行って情報を調べた結果、次のような理由がわかりました: 原因: セキュリティ上の理由 (セッション データの混乱を避けるため)単一ユーザーからの同時リクエストなど)、PHP は排他的ロックを使用してセッション データに相互にアクセスします(つまり、セッションを保存するためにセッション ファイルを使用するか memcache を使用するかに関係なく)。つまり、セッションが開かれた後は、単一ユーザーのみがアクセスできます。サイトにシリアルでアクセスし、同時に実行できるリクエストは 1 つだけです。すぐに応答され、他のリクエストはすべてブロックされます。
解決策:
- セッションは必要ありません
-
[推奨]時間内に使用してください
session_write_close() 関数はセッションを保存します (この関数はセッション データの排他ロックを解放します)
-
[非推奨]セッションを自分でシミュレートします。 session_start を呼び出さずに (この関数はセッション データをロックします)、Cookie を通じて session_id を取得してから、セッション データを取得します。 session_decode/encode のエンコードとデコードなどを通じてセッション データを保存します。
元の投稿者のリアルタイム プッシュ要件について話しましょう。私もこれを実行しました。 ajax は、より多くのサーバーを消費し、リアルタイムのパフォーマンスが十分に保証されないため、使用しないでください。
WebSocket (HTML5/Flash) + PHP ソケット サーバー (ワーカーマン、高性能 PHP ソケット サーバー フレームワーク
) を使用していますこのソリューションはリアルタイム パフォーマンスが高く、消費リソースが非常に少ないです。ブラウザのサポート。
デモ:
メッセージ送信用のバックエンド ページ: Web メッセージ プッシャー
リアルタイムでメッセージを受信するためのページ: Web メッセージ受付ページ
コード アドレス
: walkor/web-msg-sender · GitHub同様の原理を持つ PHP+WebSocket チャット ルームもあります:worker-chat
インストールして使用するには 2 つのステップしか必要ありません
(workerman は、Apache、nginx、php-fpm などのコンテナに依存せずに直接実行できます。Win はサポートされていません
): 1. コードをダウンロードします
2. ./bin/workermand start を実行します
すべて問題ありません
メッセージの送信の背景: http://ip:3333
メッセージの受信ページ: http: //ip:3333/web-msg -sender.html
「ノー」、「ノー」、そしてほとんど侮辱的な状況にもかかわらず、そのような特定の技術的問題の解決を喜んで手伝ってくれる人はいますか?
これは、セッションが占有されているため、長いサイクルによってセッションが操作されなくなることが原因です。問題を解決するには、session_write_close() 関数を使用します。
なぜ彗星を使わないのか
それを解決するにはどうすればよいですか? すべての PHP ロジック コードを削除し、インターフェイスの for ループで sleep(1) だけを 10 回削除しましたが、
を実行する前にループ ajax が完了するのを待機している ajax がまだ残っています。 session_write_close
ajax は同じドメイン名をリクエストするようで、一度に 2 つのリクエストしか送信できません。この制限を破るために iframe を使用してサブドメイン間でリクエストを送信できます。詳細については、
http://
を参照してください。 blog.zhaojie.me/2007/02
/break-the-browsers-restrictions-6.html
ありがとうございます。私はフロントエンドの人間で、PHP についてはほとんど知りません。助けていただきありがとうございます。