当前位置: 首页 > article >正文

基于 Swoole 的高性能 RPC 解决方案

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了

文章正文

1. 什么是 RPC?

RPC(Remote Procedure Call,远程过程调用)是一种分布式计算技术,允许一个程序在不同的计算机上调用另一个程序的函数或方法,就像调用本地程序中的函数一样简单。RPC 隐藏了底层网络通信的细节,使得开发者能够专注于业务逻辑,而无需关心远程调用的复杂性。

  • 核心优势:简化分布式系统开发,提升开发效率。
  • 适用场景:微服务架构、分布式系统、跨语言服务调用。

2. Think-Swoole RPC 简介

Think-Swoole 是基于 Swoole 扩展的高性能框架,提供了基于 TCP 的 RPC 实现,使得传统 PHP 框架也能轻松构建分布式应用。

  • 节点角色
    Server:服务提供方,暴露服务接口。
    Client:服务消费方,调用远程服务。
    Registry:服务注册与发现的注册中心(Think-Swoole 中未直接实现,需自行扩展)。

3. 环境准备

3.1 PHP 扩展安装
  • 已安装 Swoole 扩展。
  • 注意:不能安装 Xdebug 扩展,否则会与 Swoole 冲突。
3.2 依赖包安装

通过 Composer 安装 Think-Swoole 扩展:

composer require topthink/think-swoole

安装完成后,项目 config 目录下会生成 swoole.php 配置文件。

4. 服务端配置与实现

4.1 HTTP 服务配置

config/swoole.php 中配置 HTTP 服务:

return ['http' => ['enable' => true,'host' => '0.0.0.0','port' => 8787,],
];
4.2 开启 RPC 并注册服务
  1. 配置 RPC 服务
    config/swoole.php 中启用 RPC:

    'rpc' => ['enable' => true,'server' => ['host' => '0.0.0.0','port' => 9502,],
    ],
    
  2. 定义 RPC 接口
    创建接口文件 app/rpc/contracts/UserInterface.php

    namespace app\rpc\contracts;interface UserInterface {public function add($name);public function list();
    }
    
  3. 实现 RPC 服务类
    创建服务类 app/rpc/service/UserService.php

    namespace app\rpc\service;use app\rpc\contracts\UserInterface;class UserService implements UserInterface {public function add($name) {return "【修改】你添加名称是:" . $name;}public function list() {return "list";}
    }
    
4.3 启动服务

运行以下命令启动 Swoole HTTP 服务:

php think swoole start

输出:

Starting swoole http server...
Swoole http server started: <http://0.0.0.0:8787>
You can exit with `CTRL-C`

5. 客户端配置与调用

5.1 HTTP 服务配置

config/swoole.php 中配置客户端 HTTP 服务:

return ['http' => ['enable' => true,'host' => '0.0.0.0','port' => 8787,],
];
5.2 配置 RPC 服务端连接信息
  1. 配置文件
    config/swoole.php 中配置 RPC 客户端:

    'rpc' => ['client' => ['host' => '127.0.0.1','port' => 9502,],
    ],
    
  2. 生成 RPC 服务接口
    运行以下命令生成 RPC 服务接口文件:

    php think rpc:interface
    

    生成的文件 app/rpc.php 内容如下:

    namespace rpc\contract\userservice;interface UserInterface {public function add($name);public function list();
    }return ['userservice' => ['rpc\contract\userservice\UserInterface']];
    
  3. 调用 RPC 服务
    在控制器中调用 RPC 服务:

    namespace app\controller;use rpc\contract\userservice\UserInterface;class Index {public function rpctest(UserInterface $userInterface) {return $userInterface->add('Tinywan');}
    }
    
  4. 客户端请求访问
    访问客户端接口,输出:

    【修改】你添加名称是:Tinywan
    

6. 热更新

由于 Swoole 服务运行时 PHP 文件常驻内存,修改代码后需手动重启服务。Think-Swoole 提供了热更新功能,方便开发调试。

  • 开启热更新
    .env 文件中设置:

    APP_DEBUG = true
    

    或在 config/swoole.php 中直接启用:

    'hot_update' => ['enable' => true,
    ],
    
  • 注意事项

    • 生产环境不建议开启热更新,以避免性能损耗和潜在风险。

7. 常见错误

错误一:与 Xdebug 冲突

错误信息:

Swoole\Server::start(): Using Xdebug in coroutines is extremely dangerous

解决方法:禁用 Xdebug 扩展。

8. 总结

Think-Swoole RPC 提供了一种简单高效的方式,帮助 PHP 开发者构建分布式系统。通过隐藏底层通信细节,开发者可以像调用本地函数一样调用远程服务,极大地提升了开发效率。无论是微服务架构还是分布式系统,Think-Swoole RPC 都是一个值得尝试的解决方案。

相关文章:

基于 Swoole 的高性能 RPC 解决方案

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

Photoshop 2025安装包下载及Photoshop 2025详细图文安装教程

文章目录 前言一、Photoshop 2025安装包下载二、Photoshop 2025安装教程1.解压安装包2.运行程序3.修改安装路径4.设安装目录5.开始安装6.等安装完成7.关闭安装向导8.启动软件9.安装完成 前言 无论你是专业设计师&#xff0c;还是初涉图像处理的小白&#xff0c;Photoshop 2025…...

CPU跑大模型怎么加速?

一、概念 近几年&#xff0c;大模型的规模越做越大。普通码农没几张显卡几乎都跑不动动辄几百B的模型了。当然&#xff0c;随着SLM进一步发展&#xff0c;移动端、PC端部署SLM变得轻松了起来。即便只有CPU也能带得起3B以内的SLM&#xff0c;只不过推理速度比较感人。因此&#…...

PostgreSQL详解

第一章&#xff1a;环境部署与基础操作 1.1 多平台安装详解 Windows环境 图形化安装 下载EnterpriseDB安装包&#xff08;含pgAdmin&#xff09; 关键配置项说明&#xff1a; # postgresql.conf优化项 max_connections 200 shared_buffers 4GB work_mem 32MB 服务管理命…...

SQL Server安装程序无法启动:系统兼容性检查失败

问题现象&#xff1a; 运行 SQL Server 2022 安装程序时&#xff0c;提示 “硬件或软件不满足最低要求”&#xff0c;安装向导直接退出或无法继续。 快速诊断 操作系统版本检查&#xff1a; # 查看 Windows 版本&#xff08;需 20H2 或更高&#xff09; winver 支持的系统&…...

期权合约作废的话,权利金和保证金会退还么?

在期权交易中&#xff0c;权利金是否可以退回&#xff0c;主要取决于期权的交易情况和合约条款。 期权作废的三种情形 一般来说期权作废一共有三种情况&#xff0c;分别是到期没有行权、主动放弃或者是标的退市了。 第一种是到期未行权&#xff0c;一般来说值得都是虚值期权&…...

MIPI计算ECC和CRC工具介绍

一、MIPI简介 MIPI联盟&#xff0c;即移动产业处理器接口&#xff08;Mobile Industry Processor Interface 简称MIPI&#xff09;联盟。MIPI&#xff08;移动产业处理器接口&#xff09;是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。MIPI官网https://mipi.org/…...

医院管理系统(源码)分享

「医院管理系统&#xff08;源码&#xff09; 源码&#xff1a; https://pan.quark.cn/s/b6e21488fce3 第1章 绪论 1.1 项目背景 随着计算机科学的迅猛发展和互联网技术的不断推进&#xff0c;人们的生活方式发生了巨大的变化&#xff0c;同时也推动了整个软件产业的发展。把…...

使用Geotools从DEM数据中读取指定位置的高程实战

目录 前言 一、GridCoverage2D对象介绍 1、GridCoverage2D的属性 2、GridCoverage2D核心方法 3、GridCoverage2D中的高级操作 二、指定位置的高程获取 1、存储原理 2、相关属性的获取 3、获取高程的方法 三、总结 前言 在地理信息科学领域&#xff0c;高程数据是至关重…...

uniapp 在app上 字体如何不跟着系统字体大小变

在UniApp开发中&#xff0c;默认情况下App的字体可能会跟随系统字体设置而变化。如果你希望保持固定的字体样式&#xff0c;不随系统字体设置改变&#xff0c;可以采用以下几种方法&#xff1a; 方法一&#xff1a;全局CSS设置 在App.vue的样式中添加以下CSS&#xff1a; /*…...

RAG优化:python从零实现GraphRag 一场文档与知识的“恋爱”之旅

嘿,亲爱的算法工程师们,准备好迎接一场文档与知识的“恋爱”之旅了吗?今天我们要介绍的 Graph RAG,就像是一位“红娘”,帮助文档和知识在图的世界里找到彼此,擦出智慧的火花! 文章目录 为什么需要 Graph RAG?Graph RAG 的“恋爱秘籍”准备好了吗?让我们开始吧!环境设…...

STM32F103_LL库+寄存器学习笔记05 - GPIO输入模式,捕获上升沿进入中断回调

导言 GPIO设置输入模式后&#xff0c;一般会用轮询的方式去查看GPIO的电平状态。比如&#xff0c;最常用的案例是用于检测按钮的当前状态&#xff08;是按下还是没按下&#xff09;。中断的使用一般用于计算脉冲的频率与计算脉冲的数量。 项目地址&#xff1a;https://github.…...

如何为你的github开源项目选择合适的开源协议?

如何为你的github开源项目选择合适的开源协议&#xff1f; 导言 在github开源世界中&#xff0c;选择一个合适的开源协议是至关重要的。它不仅定义了他人如何使用你的代码&#xff0c;还决定了你的项目能否被广泛接受和传播&#xff0c;还能避免侵权问题。 然而&#xff0c;面…...

【深度破解】爬虫反反爬核心技术实践:验证码识别与指纹伪装

一、反爬技术体系全景图 现代Web应用的常见反爬手段&#xff1a; mermaid&#xff1a; graph TDA[反爬体系] --> B[行为特征检测]A --> C[验证码体系]A --> D[指纹追踪]B --> B1[请求频率]B --> B2[鼠标轨迹]B --> B3[页面停留时间]C --> C1[图形验证码…...

dynamic_cast的理解

dynamic_cast&#xff1a;&#xff08;具体使用就不详细说明了&#xff09; C 中用于 安全的类层次结构转换 的类型转换运算符&#xff0c;主要用于 多态类型&#xff08;即包含虚函数的类&#xff09;的指针或引用之间的转换 前提条件&#xff1a; 必须要有虚函数才能使用 dy…...

MATLAB 编写的函数或算法生成可供 C++ 调用的库或组件

MATLAB 编写的函数或算法生成可供 C 调用的库或组件 使用 MATLAB Coder 生成 C/C 代码&#xff1a; MATLAB Coder 允许您将 MATLAB 函数转换为可移植的 C 或 C 代码。生成的代码可以作为静态库、动态库或源代码&#xff0c;供 C 项目直接调用。具体步骤包括&#xff1a; 准备…...

Java基础知识-反射

一、什么是反射&#xff1f; Java反射&#xff08;Reflection&#xff09;是Java语言的核心特性之一&#xff0c;它允许程序在运行时&#xff08;Runtime&#xff09;动态地操作类和对象。通过反射API&#xff0c;我们可以在程序运行期间&#xff1a; 获取任意类的Class对象构…...

【大模型学习】什么是具身智能

目录 一、技术背景与历史发展 二、什么是具身智能&#xff1f; 三、技术要点及具体实现细节 1. 感知技术&#xff1a; 2. 运动控制&#xff1a; 3. 学习机制&#xff1a; 4. 人机交互&#xff1a; 四、架构 五、应用 六、实际应用案例 一、技术背景与历史发展 人工智能的…...

直播预告 | TDgpt 智能体发布 时序数据库 TDengine 3.3.6 发布会即将开启

从海量监控数据&#xff0c;到工业、能源、交通等场景中实时更新的各类传感器数据&#xff0c;时序数据正在以指数级速度增长。而面对如此庞杂的数据&#xff0c;如何快速分析、自动发现问题、精准预测未来&#xff0c;成为企业数字化转型过程中的关键挑战。 TDengine 的答案是…...

服务器硬盘出现故障都有哪些解决方法?

服务器作为核心的硬件设施和互联网中必不可少的网络设备&#xff0c;承载着重要的数据信息和业务应用&#xff0c;但是服务器硬盘也会出现故障的情况&#xff0c;当服务器硬盘发生故障该如何进行解决呢&#xff0c;下面&#xff0c;我们就从以下几个方面进行探讨一下吧&#xf…...

vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu

vscode 通过Remote-ssh插件远程连接服务器报错 could not establish connection to ubuntu&#xff0c;并且出现下面的错误打印&#xff1a; [21:00:57.307] Log Level: 2 [21:00:57.350] SSH Resolver called for "ssh-remoteubuntu", attempt 1 [21:00:57.359] r…...

【JavaScript 简明入门教程】为了Screeps服务的纯JS入门教程

0 前言 0-1 Screeps: World 众所不周知&#xff0c;​Screeps: World是一款面向编程爱好者的开源大型多人在线即时战略&#xff08;MMORTS&#xff09;沙盒游戏&#xff0c;其核心机制是通过编写JavaScript代码来控制游戏中的单位&#xff08;称为“Creep”&#xff09;&#…...

Prometheus stack命令行接入springboot服务metrics

使用Prometheus Stack监控SpringBoot应用 本文将详细介绍如何使用Prometheus Stack监控SpringBoot应用的metrics。假设你已经安装了Kubernetes集群&#xff0c;并使用Helm安装了Prometheus Stack全家桶。SpringBoot应用已经配置好&#xff0c;暴露了相应的metrics端点。 Sprin…...

Git Bash 设置Notepad++作为默认编辑器

网上搜的时候发现别人搞得有点复杂 &#xff08;绝对正确的方法&#xff09;Git Bash 设置Notepad作为默认编辑器_git 通过notpad 编辑器-CSDN博客 最简单的方式就是重新安装git&#xff0c;然后在选择编辑器的时候&#xff0c;勾选notepad即可...

Qt 制作验证码

Qt 制作验证码 #include <QRandomGenerator> #include <QPainterPath> #include <QPainter>// 生成随机数 int r(int a,int b0){return b ? QRandomGenerator::global()->bounded(a, b): QRandomGenerator::global()->bounded(a); }// 生成随机多边形…...

WPF InkCanvas 控件详解

1. InkCanvas 是什么? InkCanvas 是 WPF 提供的一个手写绘图控件,它允许用户使用鼠标、触摸屏或手写笔在界面上进行绘图、标注等操作。 核心特点: ✅ 具备笔迹存储和管理功能。 ✅ 提供 Children 和 Strokes 两个集合,分别用于管理子控件和绘制的笔迹。 ✅ 通过 EditingM…...

【数据结构】二叉树 — 经典OJ面试题剖析!!!

目录 二叉树相关oj题 1. 检查两颗树是否相同 2. 另一棵树的子树 3. 翻转二叉树 4. 判断一颗二叉树是否是平衡二叉树 5. 对称二叉树 6. 二叉树的构建及遍历 7. 二叉树的层序遍历 8. 判断一棵树是不是完全二叉树 9. 二叉树的最近公共祖先 10. 根据前序与中序遍历序列构…...

【MySQL】用户账户、角色、口令、PAM

目录 查看用户账户设置 连接 1.本地连接 2.远程连接 账户 角色 操作用户账户和角色 配置口令和账户有效期限 手工使口令过期 配置口令有效期限 PAM身份验证插件 客户端连接&#xff1a;使用 PAM 账户登录 在连接到MySQL服务器并执行查询时&#xff0c;会验证你的身…...

Linux之 权限提升(Linux Privilege Escalation)

Linux 之权限提升 系统信息 1.获取操作系统信息 2.检查PATH&#xff0c;是否有任何可写的文件夹&#xff1f; 3.检查环境变量&#xff0c;有任何敏感细节吗&#xff1f; 4.使用脚本&#xff08;DirtyCow&#xff1f;&#xff09;搜索内核漏洞 5.检查sudo 版本是否存在漏洞…...

贪心算法经典应用:最优答疑调度策略详解与Python实现

目录 引言&#xff1a;从现实场景到算法设计 一、问题背景与数学建模 1.1 现实场景抽象 1.2 时间线分析 二、贪心策略的数学证明与选择依据 2.1 贪心选择性质 2.2 证明过程 三、算法实现与代码解析 3.1 算法步骤分解 3.2 代码亮点解析 四、测试案例与结果验证 4.1 …...