Heim  >  Artikel  >  PHP-Framework  >  Der Prozess der Integration von phpsocketio mit thinkphp5 war eine Falle, auf die ich persönlich getreten bin!

Der Prozess der Integration von phpsocketio mit thinkphp5 war eine Falle, auf die ich persönlich getreten bin!

藏色散人
藏色散人nach vorne
2021-08-31 16:37:562509Durchsuche

thinkphpDie Framework-Tutorial-Kolumne stellt Ihnen die vollständige Anleitung zur Integration von phpsocketio mit thinkphp 5.0 vor. Ich hoffe, dass sie Freunden in Not hilfreich sein wird!

Vollständige Anleitung zur Integration von phpsocketio mit thinkphp 5.0, um Fallstricke zu vermeiden

Nutzungsumgebung: thinkphp5.0

Projektanforderungen

Eine Bestellung am Frontend aufgeben, im Backend annehmen und abschließen fordert sofort auf. Beispiel: Meituan Takeaway: Nachdem der Kunde erfolgreich eine Bestellung aufgegeben hat, erhält der Händler sofort eine Sprachaufforderung zum Empfang der Bestellung.

Entwicklungsumgebung

  • thinkphp5.0
  • phpsocketio

(Da der Socket-Dienst gestartet werden muss, muss er in einer Umgebung verwendet werden, die die Shell erfüllen kann)

Socketio-Vorteile

Dies ist nur meine Meinung. Schließlich habe ich Socketio nicht eingehend studiert, daher habe ich nur eine kurze Zusammenfassung gegeben:

  • Reduzieren Sie die E/A-Last des Servers
  • Lange Verbindungen sind zuverlässiger als ajax-Abfragen ajax轮询靠谱
  • 服务稳定,支持动态

初略的看了一下,内存占用很小,而且只有1个进程,根据官方报道来说1个进程也能容纳1W人次的高并发,所以,对于我的项目来说,已经绰绰有余

官方文档

https://github.com/walkor/php...

开始开发

安装 phpsocketio

首先cd到thinkphp的项目根目录。使用以下命令

composer require workerman/phpsocket.io

( 这里composer不做解释,如果有什么问题,度娘一下,应该能够解决 )

安装好以后,vendor文件夹下面应该就有一个workerman的文件夹,如果存在,就恭喜你,已经安装完毕了

服务入口文件

回到项目根目录,新建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文件里面,模块绑定到了&#39;socketio/Server/index&#39;,这里就需要我们手动创建了。为了能理解,我用目录展示

├─application           应用目录
│  ├─socketio           新创建目录
│  │  ├─controller      
│  │  │  ├─Server.php   启动文件

Server.php

入口文件只是绑定到了这个控制器,所以这个是整个socketio的核心。

<?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();
    }
}

创建API 触发socketio

同样你可以在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监控与socket服务,API提供事件触发,也就是有人下单后的触发,下单作为事件去触发服务器socket,让他回应到前端

代码开始前请注意:这里的端口和域名比较的绕

 <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>

以上有两个我之前出问题的地方

  • 端口与域名:域名是外网的域名,当然是需要和你的socket服务在同一个IP下面,即:你的socket部署在114.114.114.114的IP下面。这个域名就必须是在114.114.114.114的IP下面。端口则是后端服务里面new SocketIO的端口了。
  • socket.on()文档里面都是socket.on('content',function(msg){....}),但是可以看我们Server.php里面$io->emit('new_msg', '');这里自定义的事件明明叫做new_msg,但是却被写成了content,可能是本人眼拙,没有看清楚,但是也提醒一下,这里确实要注意回调事件名

部署完毕开始运行

现在所有的文件就算是部署好了,进入服务器管理,打开shellcd到项目根目录。然后执行

php socketio.php start
php socketio.php start    启动
php socketio.php stop    停止
php socketio.php restart    重启
Der Dienst ist stabil und unterstützt dynamische
php socketio.php status
Anfänglich Nach einem kurzen Blick stellte ich fest, dass die Speichernutzung sehr gering ist und es nur einen Prozess gibt. Laut offiziellen Berichten kann ein Prozess eine hohe Parallelität von 10.000 Personen bewältigen. es ist also mehr als genug für mein Projekt

Offizielle Dokumentation

https://github.com/walkor/php...
Entwicklung starten

Installieren phpsocketio

Erste CD zum Projektstammverzeichnis von thinkphp. Verwenden Sie den folgenden Befehl
rrreee🎜(Der Komponist wird es hier nicht erklären. Wenn es irgendwelche Probleme gibt, fragen Sie mich bitte und Sie sollten es lösen können)🎜🎜Nach der Installation sollte es eines unter dem vendor-Ordner Workerman-Ordner, falls vorhanden, herzlichen Glückwunsch, er wurde installiert🎜

Diensteintragsdatei

🎜Gehen Sie zurück zum Projektstammverzeichnis und erstellen Sie einen neuen socketio.php Beginnen Sie mit der Bearbeitung 🎜rrreee🎜 Schreiben Sie es einfach hier und es ist OK. Für alle folgenden Dinge können Sie seine Existenz ignorieren🎜🎜🎜Erstellen Sie einen Service-Controller🎜🎜🎜In der Datei socketio.php im vorherigen Schritt ist das Modul an socketio/Server von gebunden /index' , wir müssen es hier manuell erstellen. Zum Verständnis verwende ich das Verzeichnis zur Anzeige von 🎜rrreee

Server.php

🎜Die Eintragsdatei ist nur an diesen Controller gebunden, daher ist dies der Kern des gesamten Socketio. 🎜rrreee🎜🎜API erstellen, um socketio auszulösen🎜🎜🎜Ebenso können Sie unter socketio einen neuen API-Controller erstellen, dies dient nur zum Testen🎜rrreee🎜Jetzt gibt es server server, API Code> Triggerende, als nächstes muss es angezeigt werden, was unser Frontend🎜🎜🎜Frontend🎜🎜🎜Was wir jetzt schreiben müssen, ist die vom Händler empfangene Eingabeaufforderung. Der zuvor geschriebene <code>server-Server stellt die PHPSocketio-Überwachung und die API bereit, die ausgelöst werden, nachdem jemand eine Bestellung aufgegeben hat Server-Socket. Lassen Sie ihn auf das Frontend antworten🎜🎜Bitte beachten Sie, bevor Sie mit dem Code beginnen: Der Port und der Domänenname sind hier verwirrend🎜rrreee🎜Es gibt zwei Stellen, an denen ich zuvor Probleme hatte🎜🎜🎜Port- und Domänenname: Der Domänenname ist natürlich der Domänenname des externen Netzwerks. Er muss sich unter derselben IP befinden wie Ihr Socket-Dienst, das heißt: Ihr Socket wird unter der IP 114.114.114.114 bereitgestellt. Dieser Domänenname muss unter der IP-Adresse 114.114.114.114 stehen. Der Port ist der Port von new SocketIO im Backend-Dienst. 🎜🎜socket.on()Die Dokumente sind alle socket.on('content',function(msg){....}), aber Sie können unsere sehen Server In .php $io->emit('new_msg', ''); heißt das benutzerdefinierte Ereignis hier eindeutig new_msg, wird aber als geschrieben Inhalt , vielleicht ist mein Sehvermögen schlecht und ich habe es nicht klar gesehen, aber ich möchte Sie auch daran erinnern, dass Sie hier wirklich auf den Namen des Rückrufereignisses achten sollten🎜🎜🎜🎜Nachdem die Bereitstellung abgeschlossen ist, es beginnt zu laufen🎜🎜🎜Da nun alle Dateien bereitgestellt wurden, rufen Sie die Serververwaltung auf und öffnen Sie die Shell. cd in das Projektstammverzeichnis. Führen Sie dann 🎜rrreee🎜🎜
php socketio.php start Start 🎜🎜🎜🎜<table><thead><tr class="firstRow"><th> <code>php socketio.php stop Stopp 🎜🎜🎜🎜
php socketio.php restart Restart🎜🎜🎜🎜
php socketio.php Status Aktueller Servicestatus🎜🎜🎜🎜🎜🎜Zusammenfassung🎜🎜🎜Aus Zeitgründen habe ich mich nicht mehr mit Socketio befasst. An einigen Stellen kann es jedoch zu Mängeln kommen Ich garantiere Ihnen zu 100 %, dass dies mein eigener Test ist und ich alle genannten Fallstricke Schritt für Schritt durchgegangen bin. Wenn etwas nicht stimmt, lassen Sie es mich bitte wissen ^_^🎜🎜

Das obige ist der detaillierte Inhalt vonDer Prozess der Integration von phpsocketio mit thinkphp5 war eine Falle, auf die ich persönlich getreten bin!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen