使用環境: thinkphp5.0
projectRequirements
フロントエンドが注文を出し、バックエンドがそれを受け入れてすぐにプロンプトを表示します。例: Meituan Takeaway では、クライアントが注文に成功すると、販売者にはすぐに注文を受け取るための音声プロンプトが表示されます。
開発環境
- thinkphp5.0
- phpsocketio
(ソケットサービスはシェルを満足できる環境で使用する必要があります)
socketio の利点
これは私の意見です。 Socketio については詳しく説明しているので、簡単にまとめます。
- サーバー IO 負荷の軽減
- 長い接続率
ajaxポーリングは信頼性があります - サービスは安定しており、動的をサポートしています
簡単に確認したところ、メモリ使用量は非常に少なく、プロセスは 1 つだけです。公式レポートによると、1 つのプロセスは 10,000 人の高同時実行にも対応できるとのことです。
公式ドキュメント
https://github.com/walkor/php...
開発を開始
phpsocketio のインストール
まず、thinkphp のプロジェクト ルート ディレクトリに cd します。次のコマンドを使用します。
composer require workerman/phpsocket.io
(Composer ではここでは説明しません。問題がある場合は、試してみてください。解決できるはずです。)
インストール後、 vendor フォルダーの下に workman フォルダーがあるはずです。存在する場合は、インストールされました。
サービス エントリ ファイル
に戻ります。プロジェクトのルートディレクトリに新規socketio.phpを作成し、編集を開始します
#!/usr/bin/env php <?php define('APP_PATH', __DIR__ . '/application/'); define('BIND_MODULE','socketio/Server/index'); // 加载框架引导文件 require __DIR__ . '/thinkphp/start.php';
ここに書くだけでOKです。以降のすべての作業では、この存在を無視してかまいません。
サービス コントローラーを作成します。
前の手順の socketio.php ファイルで、モジュール バインディングを作成します。 'socketio/Server/index' に到達したら、手動で作成する必要があります。理解するために、ディレクトリを使用して表示します。
├─application 应用目录 │ ├─socketio 新创建目录 │ │ ├─controller │ │ │ ├─Server.php 启动文件
Server.php
エントリ ファイルはこのコントローラーにのみバインドされているため、これがソケット全体のコアとなります。
<?php
/*
* (c) U.E Dream Development Studio
*
* Author: 李益达 - Ekey.Lee <ekey.lee@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace app\socketio\controller;
require_once VENDOR_PATH . "workerman/phpsocket.io/src/autoload.php";
use PHPSocketIO\SocketIO;
use Workerman\Worker;
class Server
{
public function index()
{
$io = new SocketIO(8080);//socket的端口
$io->on('workerStart', function () use ($io) {
$inner_http_worker = new Worker('http://0.0.0.0:5880');//这里IP不用改变,用的内网通讯,端口不能与socket端口想通
$inner_http_worker->onMessage = function ($http_connection, $data) use ($io) {
$io->emit('new_msg', '44444');//这里写了固定数据,请根据自己项目需求去做调整,不懂这里的可以看看官方文档,很清楚
$http_connection->send('ok');
};
$inner_http_worker->listen();
});
// 当有客户端连接时
$io->on('connection', function ($socket) use ($io) {
// 定义chat message事件回调函数
$socket->on('chat message', function ($msg) use ($io) {
// 触发所有客户端定义的chat message from server事件
$io->emit('chat message from server', $msg);
});
});
Worker::runAll();
}
}
socketio をトリガーする API を作成する
同様に、socketio の下に新しい API コントローラーを作成できます。これはテスト専用です
public function api()
{
// 推送的url地址,使用自己的服务器地址
$push_api_url = "http://0.0.0.0:5880";//这里同样不需要更改IP。只是端口一定需要和server.php onworker的一样
$post_data = array(
"type" => "publish",
"content" => "这个是推送的测试数据",
);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $push_api_url );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Expect:"));
$return = curl_exec ( $ch );
curl_close ( $ch );
var_export($return);
}
これでserverサーバー側、API トリガー側、それを表示する必要があります。これがフロントエンドです
フロントエンド
#今書きたいのは、マーチャントが受け取ったプロンプトです。前に作成したserver サーバーは phpsocketio 監視およびソケット サービスを提供し、API はイベント トリガー、つまり誰かが注文した後のトリガーを提供します。注文はトリガーするイベントとして使用されます。サーバーソケットを接続して、フロントエンドに応答できるようにします。
<script src='//cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>
<script>
// 连接服务端
var socket = io('http://xxxx.com:8080');//这里请填写你的域名,外网,端口为socket端口
// 后端推送来消息时
socket.on('new_msg', function (msg) {//这里的new_msg请一定要注意,官方文档都写的是content,但是后端发送的自定义是new_msg,后端定义成new_msg,前端却接受content的字段。所以是接受不了的
swal({ title: "包厢点餐提醒", text: "哆啦a梦包厢有新订单" })
//console.log("收到消息:" + msg);
});
</script>以前に問題が発生した場所が 2 か所あります
- ポート ドメイン名: ドメイン名は外部ネットワークのドメイン名です。もちろん、ソケット サービスと同じ IP の下にある必要があります。つまり、ソケットはIP は
- 114.114.114.114
です。このドメイン名は、IP114.114.114.114の下にある必要があります。ポートは、バックエンド サービスのnew SocketIOのポートです。 - socket.on()
このドキュメントにはsocket.on('content',function(msg){....})が含まれていますが、次のように読むことができます。 Server.php で$io->emit('new_msg', '');ここでのカスタム イベントは明らかにnew_msgと呼ばれていますが、と書かれています。コンテンツ、おそらく私は盲目ではっきりとは見えませんでしたが、コールバック イベント名
デプロイ後、開始する必要があることにも注意する必要があることを思い出していただきたいと思います。 running
すべてのファイルがデプロイされたので、サーバー管理に入り、shell を開きます。 cdプロジェクトのルート ディレクトリに移動します。次に、
php socketio.php start
Start# を実行します。
|
|---|
|
|---|
|
|---|
| まとめ
|---|


