検索
ホームページバックエンド開発PHPチュートリアルPHPでオンラインチャット機能を実装

PHPベースの簡単なオンラインチャット機能の実装

ずっと欲しかったこの興味深い機能を実行した後、複雑なのはデータのやり取りやテーブル構造ではなく、フロントエンドの開発だと感じました...ということで...

要件分析

To 機能を実装するには、まずフロントエンドを構築する必要があります。他の Web サイトのオンライン チャット機能を比較した結果、基本的なチャット機能に加えて、次の点にも注意する必要があることがわかりました。

1.一次只能和一个人聊天,但是可以随意切换其他人.
2.如果用户是从"发送消息" 入口进来的,那么当前马上就切换到对应的聊天窗口,而且如果之前有过聊天记录,应该把聊天记录也展示出来.
3.如果是从"我的消息" 入口进来的,那么应该不显示任何聊天记录.等待选择聊天对象.
4."我"发送的消息显示在右边,"对方"发送的消息显示在左边,也可以相反,总之要不一样.
5.切换聊天的时候不能刷新整个页面,否则体验很差.  发送消息也同理,所以应该用ajax.
6.要保证在线聊天的及时性,应该每隔一段很短的时间,就要与服务端通信,也就是说要轮询ajax.

フロントエンドページ

簡単なニーズ分析を行った後、他のWebサイトを探し、インターフェース内の機能の表示を比較し、最終的にインターフェースを決定しました。その後、数時間かけて完成しました。


PHPでオンラインチャット機能を実装すべてが完了した後の最終結果です。

左側をクリックして切り替えます。下の複数行のテキスト ボックスにチャット メッセージを入力し、[送信] をクリックします。

全体のプロセスは大まかに次のとおりです。

データベース

要件を振り返ると、最初に 2 つの当事者間の対話を保存するテーブルが必要であることは明らかです。考えた結果、次のようにフィールドを定義することにしました。

主に次の 2 つのフィールド:

user_id は送信されたメッセージの件名を表します
chat_user は受信されたメッセージの件名を表します PHPでオンラインチャット機能を実装
この定義の利点は、ファイルから簡単に取得できることです。メッセージの送信者と受信者を識別し、フロントエンド表示の準備をします。

これだけでは十分ではありません

このテーブルを使用すると、現在のメッセージ内のユーザーを渡すことができます。ログインしたセッション ID を照会して誰とチャットしているのかを知ることができますが、これは不便であり、複雑な処理が必要です。

1. 自分のメッセージを挿入します。 「側」「相手」「内容」と同時に、現在のチャットにいる一人が「相手」であることが分かります

2. ただし、相手から送信されたメッセージがあると仮定します。 , 現在のユーザーにとって、データは「相手」「自分側」「コンテンツ」です。

つまり、多人数チャットを実現したい場合は、現在いるユーザーを取得する必要があります。 「私」とのチャットでは、相手から送信されたものであっても、「私」から送信されたものであっても、すべてが計算に含まれる必要があり、その多くは現時点では重複して役に立たないデータです。 「チャット相手の件名を取得する」ステップでは、2 人にチャット関係があるかどうかだけを知る必要があります。


そのため、チャット関係テーブルが必要です。次のようにフィールドを定義します。

User_id と chat_user は二重の主キーであり、同時に等しくすることはできません。この方法では、チャットではなくチャット関係のみが記録されます。
'私' は user_id 'other party' は chat_userPHPでオンラインチャット機能を実装

たとえば、最初のフィールドは、ID 9 のユーザーがチャットしていることを示します。同様に、2 番目のフィールドは相手が私とチャット関係を持っていることを意味するため、相手のインターフェースには私

が存在する必要があります。
一般に、チャット関係は相互関係ですが、チャット関係を削除することは、チャット履歴を削除することを意味しません。

たとえば、私のインターフェイスでは、ユーザー No. とのチャット関係を配置します。 9 チャット関係が削除されると、ユーザー No. 9 とのチャット情報を見ることができなくなりますが、ユーザー No. 9 に関しては、まだ彼のインターフェイスにいて、いつでもメッセージを送信できます。このとき、サーバーは「私」と「相手」という別のデータを生成します。これにより、私と相手とのチャット関係が再び確立されます。記録は削除されていないため、チャット関係が再確立されたときに、チャット履歴を表示できます。

また、チャット関係を削除した後、チャットを再開してチャット関係を確立することもできます。

したがって、このテーブルを作成すると、上で分析したニーズに合わせて、チャットの記録も非常にうまく完了できます。

コードは掲載しません。実装アイデア


まず、main 関数には 1 つのコントローラー、2 つのテーブル、2 つのモデルがあります。アバターについては、ニックネームなどは main 関数には含まれません。コントローラー MessageController には、非 Ajax リクエストに応答するために使用される合計 5 つのメソッドがあり、ユーザーがアクセスするとき、たとえば、チャット インターフェイスに入るときにブラウザーを渡します。初回はブラウザ経由でアクセスした場合、showPageメソッドが呼び出されます。このとき、バックグラウンドはチャット関係(4番目のメソッド)を取得するだけで、その他は取得しません。処理されました。

2.newChat(),用来应对非ajax请求, 比如我通过用户个人资料页面,点击发送消息,这时候就调用这个方法. 先判断聊天关系是否存在,如果存在就不处理,如果不存在,就插入一个聊天关系. 并且要获取所有聊天关系(第四个方法),最新的排上面,把用户ID转到界面上.为后面做准备.

3.getChatText(), 用来应对ajax请求. 用来获取聊天信息.
‘我’ 这个用户来到聊天界面上后, 前端就开始进行ajax轮询.不停访问getChatText()这个方法. 这时有两种情况.

1 当前正在与某个用户聊天,js就发送一个请求到getChatText方法,参数是对方的用户ID.  因为'我'的ID 可以从服务端session获取到.然后通过这两个信息去数据库获取聊天消息.返回json格式,js进行数据处理,节点操作,等等,然后把消息展示出来.

2.当前没有正在与某个用户聊天,那ajax暂不启动,当选择了聊天对象的时候再启动轮询.

4.getChatTemp()方法,获取当前登录用户的聊天关系. 作为一个工具函数,供第一个和第二个函数使用.

5.pushChat(),用来应对ajax请求, 也就是发送消息请求. 把聊天消息插入数据库而已.

差不多就这样.

总体实现了在线聊天的基本功能,但是有缺陷, 获取聊天消息的时候,我是无论有没有新消息,都全部获取到. 然后清空聊天框,再填充.
这样的结果是, 当聊天信息很多的时候,滚动条会有问题, 每次发送消息,滚动条都会先滚动到最上面,再滚动下来. 有个解决方案是,在聊天关系上加一个字段,存储两个人的消息数. 获取完数据的时候,先统计一下,看看是不是比原来的多了,如果多了,就只获取多的数据,然后更新消息数目. 如果没多,那就舍弃数据,不做处理.

其实一开始就是这么想的,但是不知道后面为什么又做成了全部获取.
失算啊失算.

以上.

声明
この記事はcsdnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?Apr 17, 2025 am 12:24 AM

PHPでは、クローンキーワードを使用してオブジェクトのコピーを作成し、\ _ \ _クローンマジックメソッドを使用してクローン動作をカスタマイズします。 1.クローンキーワードを使用して浅いコピーを作成し、オブジェクトのプロパティをクローン化しますが、オブジェクトのプロパティはクローニングしません。 2。\ _ \ _クローン法は、浅いコピーの問題を避けるために、ネストされたオブジェクトを深くコピーできます。 3.クローニングにおける円形の参照とパフォーマンスの問題を避けるために注意し、クローニング操作を最適化して効率を向上させます。

PHP対Python:ユースケースとアプリケーションPHP対Python:ユースケースとアプリケーションApr 17, 2025 am 12:23 AM

PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。

さまざまなHTTPキャッシングヘッダー(例:キャッシュコントロール、ETAG、ラスト変更)を説明してください。さまざまなHTTPキャッシングヘッダー(例:キャッシュコントロール、ETAG、ラスト変更)を説明してください。Apr 17, 2025 am 12:22 AM

HTTPキャッシュヘッダーの主要なプレーヤーには、キャッシュコントロール、ETAG、およびラスト修飾が含まれます。 1.Cache-Controlは、キャッシュポリシーを制御するために使用されます。例:キャッシュコントロール:Max-Age = 3600、public。 2。ETAGは、一意の識別子を介してリソースの変更を検証します。例:ETAG: "686897696A7C876B7E"。 3. Last-Modifiedは、リソースの最後の変更時間を示しています。

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか?PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか?Apr 17, 2025 am 12:06 AM

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

PHP:サーバー側のスクリプト言語の紹介PHP:サーバー側のスクリプト言語の紹介Apr 16, 2025 am 12:18 AM

PHPは、動的なWeb開発およびサーバー側のアプリケーションに使用されるサーバー側のスクリプト言語です。 1.PHPは、編集を必要とせず、迅速な発展に適した解釈言語です。 2。PHPコードはHTMLに組み込まれているため、Webページの開発が簡単になりました。 3。PHPプロセスサーバー側のロジック、HTML出力を生成し、ユーザーの相互作用とデータ処理をサポートします。 4。PHPは、データベースと対話し、プロセスフォームの送信、サーバー側のタスクを実行できます。

PHPとWeb:その長期的な影響を調査しますPHPとWeb:その長期的な影響を調査しますApr 16, 2025 am 12:17 AM

PHPは過去数十年にわたってネットワークを形成しており、Web開発において重要な役割を果たし続けます。 1)PHPは1994年に発信され、MySQLとのシームレスな統合により、開発者にとって最初の選択肢となっています。 2)コア関数には、動的なコンテンツの生成とデータベースとの統合が含まれ、ウェブサイトをリアルタイムで更新し、パーソナライズされた方法で表示できるようにします。 3)PHPの幅広いアプリケーションとエコシステムは、長期的な影響を促進していますが、バージョンの更新とセキュリティの課題にも直面しています。 4)PHP7のリリースなど、近年のパフォーマンスの改善により、現代の言語と競合できるようになりました。 5)将来的には、PHPはコンテナ化やマイクロサービスなどの新しい課題に対処する必要がありますが、その柔軟性とアクティブなコミュニティにより適応性があります。

なぜPHPを使用するのですか?利点と利点が説明されましたなぜPHPを使用するのですか?利点と利点が説明されましたApr 16, 2025 am 12:16 AM

PHPの中心的な利点には、学習の容易さ、強力なWeb開発サポート、豊富なライブラリとフレームワーク、高性能とスケーラビリティ、クロスプラットフォームの互換性、費用対効果が含まれます。 1)初心者に適した学習と使用が簡単。 2)Webサーバーとの適切な統合および複数のデータベースをサポートします。 3)Laravelなどの強力なフレームワークを持っています。 4)最適化を通じて高性能を達成できます。 5)複数のオペレーティングシステムをサポートします。 6)開発コストを削減するためのオープンソース。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール