ホームページ  >  記事  >  PHPフレームワーク  >  phpsocketio と thinkphp5 を統合するプロセスは、私自身が踏んだ落とし穴でした。

phpsocketio と thinkphp5 を統合するプロセスは、私自身が踏んだ落とし穴でした。

藏色散人
藏色散人転載
2021-08-31 16:37:562530ブラウズ

thinkphp フレームワーク チュートリアルのコラムでは、phpsocketio と thinkphp 5.0 の統合に関する完全なガイドを紹介します。困っている友人の役に立てば幸いです。

thinkphp 5.0 phpsocketio を統合し、落とし穴を回避するための完全ガイド

使用環境: 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(&#39;APP_PATH&#39;, __DIR__ . &#39;/application/&#39;);
define(&#39;BIND_MODULE&#39;,&#39;socketio/Server/index&#39;);
// 加载框架引导文件
require __DIR__ . &#39;/thinkphp/start.php&#39;;

ここに書くだけで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=&#39;//cdn.bootcss.com/socket.io/1.3.7/socket.io.js&#39;></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 です。このドメイン名は、IP 114.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
#phpsocketio.php start
Start# を実行します。
#phpsocketio.php stop Stop
##phpソケットio.php再起動再起動
#phpソケットio.phpステータス現在のサービス状況まとめ
時間に追われて作業をしなかったので、今回は作業の概要のみです。お疲れ様です。Socketio についてさらに詳しく勉強するには、いくつかの欠陥があるかもしれませんが、これが私の個人的なテストであることを 100% 保証します。また、言及された落とし穴はすべて、段階的に私によって合格されました。何か間違っている場合は、教えてください^_^

以上がphpsocketio と thinkphp5 を統合するプロセスは、私自身が踏んだ落とし穴でした。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。