ホームページ バックエンド開発 PHPチュートリアル PHP 非同期コルーチン開発: 可用性の高いオンライン相談システムの構築

PHP 非同期コルーチン開発: 可用性の高いオンライン相談システムの構築

Dec 02, 2023 pm 02:09 PM
- PHP開発 - 非同期コルーチン - オンライン相談システム

PHP 非同期コルーチン開発: 可用性の高いオンライン相談システムの構築

PHP 非同期コルーチン開発: 可用性の高いオンライン相談システムの構築

在当今互联网时代,客户体验已成为企业竞争的关键因素之一。随着移动互联网的普及,业务处理速度和响应时间越来越成为用户选择的重要指标。在线咨询系统是供用户与客服进行实时交流的一种应用,被广泛应用于电商、客服、在线教育等领域。但同时,高并发和大流量的极限压力也对在线咨询系统提出了更高的要求。利用PHP异步协程技术,构建高可用的在线咨询系统可以有效地解决这一难题。

PHP异步协程简介

传统的PHP异步编程模型无法充分利用现代计算机的多核和异构计算能力,无法满足高并发和大量I/O密集型操作的需求。PHP应用程序在处理请求的时候,通常需要等待I/O操作(如网络请求、数据库查询等)完成后才能进行下一步操作。这时会出现阻塞现象,导致程序无法充分利用CPU资源,从而影响应用的并发能力和性能。

PHP协程是一种轻量级的线程,可以在一个线程内部创建多个协程,通过yield函数在不同的协程之间切换执行上下文。PHP7.0.0以后版本的swoole扩展实现了对协程的支持,可以通过swoole协程提供的一系列API来构建高性能的异步编程模型。利用PHP协程技术,可以很好地解决阻塞IO的问题,提高应用程序的并发性和性能。

在线咨询系统设计

在线咨询系统的主要功能是客服与用户之间的实时交流,需要实现多个客服同时在线服务多个用户。用户与客服之间需要实时交互,需要对话的发送和接收进行快速响应处理。在线咨询系统需要实时监控客户端和服务端的连接状态,及时处理异常情况,保证系统的高可用性和稳定性。

下面我们通过一个简单的在线咨询系统来具体介绍异步协程在实际应用中的使用。

1.服务器配置

考虑到在线咨询服务的高并发需求,我们需要将服务器的Nginx配置修改为upstream模块,支持反向代理和负载均衡。我们使用4台配置相同的服务器,通过Nginx反向代理进行负载均衡和高可用性。

upstream backend {

server 192.168.1.100:80;
server 192.168.1.101:80;
server 192.168.1.102:80;
server 192.168.1.103:80;
ログイン後にコピー

}

server {

listen 80;
server_name chat.example.com;
location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
ログイン後にコピー

}

2.客户端页面

我们通过Vue.js框架构建一个简单的客户端聊天室页面,提供客户端和服务端之间的实时通讯功能。

<script><br>export default {<br> data () {</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>return { ws: null, messages: [], msg: '' }</pre><div class="contentsignin">ログイン後にコピー</div></div><p>},<br> mounted () {</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>this.initWebSocket()</pre><div class="contentsignin">ログイン後にコピー</div></div><p>},<br> methods: {</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>initWebSocket () { if (this.ws) { this.ws.close() } const url = 'ws://' + window.location.host + '/ws' this.ws = new WebSocket(url) this.ws.onopen = () =&gt; { this.addMessage('已连接到聊天服务器') } this.ws.onmessage = (event) =&gt; { this.addMessage(event.data) } this.ws.onclose = () =&gt; { this.addMessage('聊天服务器已关闭') this.ws = null } this.ws.onerror = (event) =&gt; { this.addMessage('聊天服务器连接错误') } }, sendMessage () { if (!this.msg) { return } if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { this.addMessage('无法连接到聊天服务器') return } this.ws.send(this.msg) this.addMessage('我: ' + this.msg) this.msg = '' }, addMessage (message) { this.messages.push(message) this.$nextTick(() =&gt; { const scrollHeight = this.$el.scrollHeight this.$el.scrollTop = scrollHeight }) }</pre><div class="contentsignin">ログイン後にコピー</div></div><p>}<br>}<br></script>

3.服务端程序

在服务端实现中,我们使用swoole协程库提供的WebSocketServer类来实现WebSocket通信功能。WebSocketServer基于swoole的异步协程模型,可以支持高并发无阻塞的通信。在onMessage回调函数中处理客户端发送的消息,并将消息发送给所有已连接的客户端。onClose回调函数用于处理客户端离线事件。

$server = new SwooleWebSocketServer('0.0.0.0', 80);

$server->on('open', function (SwooleWebSocketServer $server, SwooleHttpRequest $request) {

echo "connection open: {$request->fd}
ログイン後にコピー

";
});

$server->on('message', function (SwooleWebSocketServer $server, SwooleWebSocketFrame $frame) {

echo "received message: {$frame->data}
ログイン後にコピー

";

foreach ($server->connections as $fd) {
    if ($server->isEstablished($fd)) {
        $server->push($fd, $frame->data);
    }
}
ログイン後にコピー

});

$server->on('close', function (SwooleWebSocketServer $server, $fd) {

echo "connection close: {$fd}
ログイン後にコピー

";
});

$server->start();

通过构建以上的客户端和服务端程序,我们实现了一个简单的在线咨询系统。但实际上,如果直接使用这个程序,系统的可用性和性能并不能满足我们的需求。接下来,针对在线咨询系统的高并发和大流量的极限压力,我们将利用PHP异步协程技术对系统进行进一步的优化。

4.异步协程优化

微信公众号后台是一个使用在线咨询系统的示例。在微信公众号后台中,一个客服可能需要服务数千个用户,系统需要处理大量的连接和消息发送操作。如果使用传统的同步编程方式,将会对服务器性能和响应时间造成严重的影响。

我们可以使用swoole协程库提供的一些API来实现异步操作,提高应用程序的性能和并发能力。下面是一个针对连接初始化的异步协程客户端初始化函数的实现:

function connectAsync($host, $port)
{

$client = new SwooleCoroutineClient(SWOOLE_SOCK_TCP);
$client->set([
    'open_length_check' => true,
    'package_max_length' => 1024 * 1024,
    'package_length_type' => 'N',
    'package_body_offset' => 4,
]);
$result = $client->connect($host, $port);
if (!$result) {
    throw new Exception('Failed to connect');
}
return $client;
ログイン後にコピー

}

使用协程客户端初始化函数后,我们可以在连接建立后异步发送和接收消息。下面实现一个异步协程客户端函数,用于向服务端发送消息:

function sendMessageAsync($client, $message)
{

$data = pack('N', strlen($message)) . $message;
$result = $client->send($data);
if (!$result) {
    throw new Exception('Failed to send message');
}
return true;
ログイン後にコピー

}

消息发送函数实现了在异步协程客户端上的消息发送操作,返回true代表发送成功。这里需要注意的是,协程客户端的send()方法并不是真正意义上的异步操作,它实际上是将消息写入缓冲区,调用yield语句后将会立即返回流程执行到协程栈中的其他协程。真正的异步操作是在协程内部的swoole_event_add()函数中实现。

下面是一个异步协程的消息接收函数的实现:

function recvMessageAsync($client, $timeout = 0.5)
{

$result = $client->recv(1024 * 1024, $timeout);
if ($result === '') {
    throw new Exception('Connection closed');
}
if (!$result) {
    throw new Exception('Failed to receive message');
}
$length = unpack('N', substr($result, 0, 4))[1];
$message = trim(substr($result, 4, $length));
return $message;
ログイン後にコピー

}

在消息接收函数中,我们调用recv()方法来接收响应并返回消息体。如果响应超时或连接异常,则抛出异常表示接收失败。

对于高并发的在线咨询系统,我们也可以使用swoole协程库提供的协程HTTP客户端实现异步Http请求。下面是一个异步Http请求函数的实现:

function requestAsync($url, $timeout = 0.5)
{

$cli = new SwooleHttpClient('127.0.0.1', 80);
$cli->set([
    'timeout' => $timeout,
]);
$cli->setHeaders([
    'Host' => 'localhost',
    'User-Agent' => 'swoole-http-client',
    'Accept-Encoding' => 'gzip',
]);
$cli->post($url, [
    'name' => 'swoole',
]);
return $cli;
ログイン後にコピー

}

使用协程HTTP客户端,我们可以在程序中发出大量的异步Http请求并处理响应,优化在线咨询系统的性能和响应时间。

需要注意的是,在协程中如果调用了不支持协程的阻塞函数,会导致协程堵塞,影响程序性能和响应效率。因此在使用协程时需要注意选择支持协程的方式,并避免使用不支持协程的函数。

总结

利用PHP异步协程技术,结合Nginx反向代理和负载均衡,我们可以实现高缩力度在线咨询系统。异步协程编程模型可以提高应用程序的并发性和性能,并且具有极低的系统开销和响应时间。在实际应用中,我们需要适当地使用异步协程优化程序性能,提高系统的可用性和稳定性。

以上がPHP 非同期コルーチン開発: 可用性の高いオンライン相談システムの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

モール PHP メンバーシップ レベルのスキル管理 モール PHP メンバーシップ レベルのスキル管理 Jun 30, 2023 am 10:41 AM

PHP Developer City でメンバーシップ レベル システムを導入するためのヒント 電子商取引の継続的な発展に伴い、ますます多くの企業が独自のオンライン モールを設立し始めています。モールにおいて会員レベル制度は、ユーザーの消費意欲を高め、顧客の定着率を向上させる重要な機能です。この記事では、PHP Developer City におけるメンバーシップレベル制度の導入スキルを紹介します。 1. 会員レベルの分割戦略 会員レベル システムの開発を開始する前に、会員レベルの分割戦略を決定する必要があります。会員レベルを分類するための一般的な戦略には、消費額、ポイント、賭け金が含まれます。

PHPを使った簡単なブログシステムの開発方法 PHPを使った簡単なブログシステムの開発方法 Sep 22, 2023 am 10:01 AM

PHP を使用して単純なブログ システムを開発する方法 インターネットの普及により、ブログは人々がアイデアや経験を共有するための重要なプラットフォームになりました。 PHP プログラミングをある程度理解していて、簡単なブログ システムを開発したい場合は、この記事で詳しく紹介します。 PHP と MySQL をインストールする まず、PHP と MySQL がマシンにインストールされていることを確認します。 PHP と MySQL はそれぞれ公式 Web サイトからダウンロードし、インストール手順に従ってインストールできます。データベースを作成するMySQL でデータベースを作成する

PHP を使用して Exchange メールボックス機能を開発する方法 PHP を使用して Exchange メールボックス機能を開発する方法 Sep 11, 2023 am 11:12 AM

PHP を使用して Exchange メールボックス機能を開発する方法 はじめに: インターネットの発展に伴い、電子メールは人々の生活や仕事に不可欠な部分になりました。 Exchange メールボックスは、一般的に使用される企業電子メール サービスとして、強力な機能と信頼性の高いパフォーマンスを備えており、企業ユーザーに広く支持されています。この記事では、読者がすぐに開始してカスタマイズされた開発を実行できるように、PHP を使用して Exchange メールボックス機能を開発する方法を紹介します。パート 1: PHP 開発環境をセットアップする まず、PHP 開発環境をセットアップする必要があります。

Alibaba Cloud OCR および PHP 開発: 実践的なチュートリアルの例 Alibaba Cloud OCR および PHP 開発: 実践的なチュートリアルの例 Jul 19, 2023 pm 04:29 PM

Alibaba Cloud OCR および PHP 開発: 実践的なチュートリアルの例 はじめに 人工知能とビッグデータ技術の発展に伴い、OCR (光学式文字認識、光学式文字認識) 技術の使用がさまざまな分野で増加しています。 Alibaba Cloud OCR は、Alibaba Cloud が提供する優れた OCR ソリューションで、画像内のテキストの認識、抽出、変換を実現できます。この記事では、Alibaba Cloud OCR と PHP を開発に使用する方法と、実践的なチュートリアルの例を紹介します。準備作業

WeChat パブリック アカウントの PHP 開発: インタラクティブな Q&A の作成方法 WeChat パブリック アカウントの PHP 開発: インタラクティブな Q&A の作成方法 Oct 27, 2023 pm 12:19 PM

WeChat 公開アカウントの PHP 開発: インタラクティブな Q&A の作成方法、具体的なコード例が必要 WeChat 公開アカウントの人気に伴い、公開アカウントにインタラクティブな Q&A 機能を実装する方法に注目する人が増えています。この記事では、PHP を使用して WeChat 公開アカウントを開発する方法を紹介し、読者がインタラクティブな Q&A 機能を迅速に実装できるようにする具体的なコード例を示します。 1. 開発環境をセットアップする 開発を開始する前に、PHP 開発環境をセットアップする必要があります。まず、XAMPP や WAMP などの PHP ランタイム環境をインストールする必要があります。それからあなた

PHP Developer Cityに製品プロモーションレコメンド機能を実装する方法 PHP Developer Cityに製品プロモーションレコメンド機能を実装する方法 Jun 30, 2023 am 08:44 AM

PHP Developer City における商品プロモーションレコメンド機能の実装方法 はじめに: 電子商取引の分野において、プロモーション活動は加盟店の売上向上や集客に貢献する非常に重要な戦略です。ショッピング モールの Web サイトを開発する場合、効果的な商品プロモーション レコメンデーション機能を使用すると、販売者がプロモーションを迅速に宣伝し、ユーザーに表示するのに役立ちます。この記事では、PHP を使用してモールに商品プロモーションのレコメンド機能を実装する方法について説明します。 1. ニーズの把握 商品プロモーションのレコメンド機能を導入する前に、ニーズを明確にする必要があります。

PHP 開発例: オンライン オーディオおよびビデオ コミュニティの作成 PHP 開発例: オンライン オーディオおよびビデオ コミュニティの作成 Oct 27, 2023 pm 02:36 PM

今日のデジタル時代において、インターネットは人々の生活に欠かせないものとなっています。情報爆発の時代において、人々はインターネットを通じてさまざまなエンターテイメントや社会体験を得ることを熱望しています。オンライン オーディオおよびビデオ コミュニティは時代の要求に応じて出現し、ユーザーがさまざまなオーディオおよびビデオ コンテンツを閲覧、アップロード、共有、コメントできるプラットフォームを提供しました。この記事ではこれを背景として、PHP 開発を例として、オンライン オーディオおよびビデオ コミュニティを作成する方法を紹介します。まず、Web サイトのセキュリティと信頼性を確保するには、適切な開発環境とツールを選択する必要があります。 PHP は

PHP 非同期コルーチン開発: 可用性の高いオンライン相談システムの構築 PHP 非同期コルーチン開発: 可用性の高いオンライン相談システムの構築 Dec 02, 2023 pm 02:09 PM

PHP 非同期コルーチン開発: 可用性の高いオンライン相談システムの構築 今日のインターネット時代において、顧客エクスペリエンスは企業競争の重要な要素の 1 つとなっています。モバイルインターネットの普及に伴い、業務処理速度と応答時​​間はユーザー選択の重要な指標となっています。オンライン相談システムは、ユーザーと顧客サービス間のリアルタイムのコミュニケーションを実現するアプリケーションであり、電子商取引、顧客サービス、オンライン教育などの分野で広く使用されています。しかし同時に、高い同時実行性と大規模なトラフィックという極度のプレッシャーにより、オンライン診療システムに対する要件も高くなります。 PHP 非同期コルーチン テクノロジを使用して高品質のコンポーネントを構築する

See all articles