thinkphp5와 phpsocketio를 통합하는 과정은 제가 개인적으로 밟았던 함정이었습니다!

藏色散人
풀어 주다: 2021-09-07 11:34:10
앞으로
2520명이 탐색했습니다.

thinkphp프레임워크 튜토리얼 칼럼에서는 phpsocketio와 thinkphp 5.0의 통합에 대한 전체 가이드를 소개할 예정입니다. 필요한 친구들에게 도움이 되기를 바랍니다!

위험을 피하면서 phpsocketio를 thinkphp 5.0과 통합하는 방법에 대한 전체 가이드

사용 환경: thinkphp5.0

프로젝트 요구 사항

프런트 엔드에서 주문하고 백엔드에서 수락하고 즉시 메시지를 표시합니다. 예: Meituan Takeaway는 고객이 성공적으로 주문한 후 판매자에게 주문 접수에 대한 음성 안내를 즉시 제공합니다.

개발 환경

  • thinkphp5.0
  • phpsocketio

(소켓 서비스를 시작해야 하기 때문에 쉘을 만족시킬 수 있는 환경에서 사용해야 함)

socketio의 장점

이것은 단지 내 의견일 뿐이고, 결국 나는 Socketio를 깊이 연구하지 않았기 때문에 간단히 요약한 것 뿐이다:

  • 서버 IO 부하 감소
  • 긴 연결이 ajax 폴링보다 안정적입니다. 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    重启
서비스가 안정적이고 동적을 지원합니다.
php socketio.php status
초기 잠깐 살펴보니 메모리 사용량이 매우 적고 프로세스가 하나뿐이라는 것을 알게 되었습니다. 공식 보고서에 따르면 하나의 프로세스는 10,000명의 높은 동시성을 수용할 수 있습니다. 내 프로젝트에 충분합니다

공식 문서

https://github.com/walkor/php...
개발 시작

설치 phpsocketio

먼저 thinkphp의 프로젝트 루트 디렉터리로 이동합니다. 다음 명령어를 사용하세요
rrreee🎜(작곡가는 여기서 설명하지 않습니다. 문제가 있으면 저에게 물어보면 해결될 것입니다)🎜🎜설치 후 vendor 폴더 Workerman 폴더, 존재한다면 축하합니다. 설치되었습니다.🎜

서비스 항목 파일

🎜프로젝트 루트 디렉터리로 돌아가서 새 socketio.php를 만듭니다. 편집을 시작하세요 🎜rrreee🎜 여기에 적어주시면 됩니다. 이후의 모든 작업에서는 해당 존재를 무시해도 됩니다🎜🎜🎜서비스 컨트롤러 만들기🎜🎜🎜이전 단계의 socketio.php 파일에서 모듈은 'socketio/Server에 바인딩되어 있습니다. /index' , 여기에서 수동으로 생성해야 합니다. 이해하기 위해 디렉토리를 사용하여 🎜rrreee

Server.php

🎜를 표시합니다. 항목 파일은 이 컨트롤러에만 바인딩되므로 이것이 전체 소켓io의 핵심입니다. 🎜rrreee🎜🎜socketio를 트리거하는 API 만들기🎜🎜🎜마찬가지로 소켓io 아래에 새 API 컨트롤러를 만들 수 있습니다. 이는 테스트용입니다.🎜rrreee🎜이제 서버 서버, API가 있습니다. code>Trigger end, 다음에 표시해야 할 것은 우리의 front end🎜🎜🎜front end🎜🎜🎜지금 작성해야 할 것은 판매자가 받은 프롬프트입니다. 이전에 작성된 <code>서버 서버는 phpsocketio 모니터링 및 소켓 서비스를 제공합니다. API는 누군가 주문한 후 트리거되는 이벤트 트리거를 제공합니다. 서버 소켓입니다. 프런트 엔드에 응답하게 하세요🎜🎜코드를 시작하기 전에 주의하세요: 여기서 포트와 도메인 이름이 혼동됩니다🎜rrreee🎜전에 문제가 있었던 두 곳이 있습니다🎜🎜🎜포트와 도메인 이름: 도메인 이름 물론 외부 네트워크의 도메인 이름입니다. 소켓 서비스와 동일한 IP 아래에 있어야 합니다. 즉, 소켓은 114.114.114.114 IP 아래에 배포됩니다. 이 도메인 이름은 IP 114.114.114.114 아래에 있어야 합니다. 포트는 백엔드 서비스의 new SocketIO 포트입니다. 🎜🎜socket.on()문서는 모두 socket.on('content',function(msg){....})이지만 다음을 볼 수 있습니다. 서버 .php $io->emit('new_msg', '');에서 여기의 사용자 정의 이벤트는 분명히 new_msg라고 불리지만 로 작성됩니다. content , 제가 시력이 나빠서 잘 못 봤을 수도 있겠지만 여기서 콜백 이벤트 이름에 주의하셔야 한다는 점도 알려드리고 싶습니다🎜🎜🎜🎜배포 후 실행을 시작하세요🎜🎜🎜이제 모든 파일이 배포되었는지 확인하려면 서버 관리에 들어가서 shell을 엽니다. 프로젝트 루트 디렉터리에 cd합니다. 그런 다음 🎜rrreee🎜🎜
php 소켓io.php start 시작🎜🎜🎜🎜<table><thead><tr class="firstRow"><th> <code>php 소켓io.php 중지 중지🎜🎜🎜🎜
php 소켓io.php 재시작 재시작🎜🎜🎜🎜
php 소켓io.php status 현재 서비스 상태🎜🎜🎜🎜🎜🎜Summary🎜🎜🎜 이번 시간은 시간적 제약으로 인해 소켓티오에 대해 자세히 공부하지 못한 부분이 있을 수 있지만, 100% 나는 이것이 내 자신의 테스트임을 보장하며 언급된 모든 함정을 단계별로 통과했습니다. 잘못된 점이 있으면 알려주세요^_^🎜🎜

위 내용은 thinkphp5와 phpsocketio를 통합하는 과정은 제가 개인적으로 밟았던 함정이었습니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!