PHP Swoole 基本使用

embedded/2024/10/20 17:32:03/

在这里插入图片描述
背景

在项目中,我们使用了PHP语言,但由于存在长耗时的任务,所以需要服务器端异步响应。为了实现异步响应,我们有多种方案可选,包括MQ(消息队列)、fsocket(文件套接字)、Swoole等。

其中,Swoole是一个使用纯C语言编写的工具,它提供了PHP语言的异步多线程服务器、异步TCP/UDP网络客户端、异步MySQL、异步Redis、数据库连接池、AsyncTask、消息队列、毫秒定时器、异步文件读写、异步DNS查询等功能。此外,Swoole还内置了Http/WebSocket服务器端/客户端以及Http2.0服务器端。

最重要的是,Swoole完美支持PHP语言。因此,我们选择使用Swoole搭建了一个异步服务器,以实现异步响应、推送、定时任务等一系列工作。

安装

Swoole是用C语言编写的,并且需要通过编译安装来进行安装。

安装前请确保已经安装以下依赖项:

  • PHP 5.3.10或更高版本

  • GCC 4.4或更高版本

  • make

  • autoconf

  • pcre(对于CentOS系统,可以执行命令:yum install pcre-devel来安装)

安装步骤如下:

  1. 执行命令phpize(如果命令不存在,请使用实际的PHP路径来执行此命令)

  2. 运行命令./configure

  3. 执行命令make

  4. 使用sudo权限运行命令make install

安装完成后,需要在php.ini文件中添加Swoole扩展:

extension=swoole.so

使用

服务端

class Server{private $serv;public function __construct() {$this->serv = new swoole_server("0.0.0.0", 9501);$this->serv->set(array(//'worker_num' => 1,  //一般设置为服务器CPU数的1-4倍'daemonize' => 1,  //以守护进程执行'max_request' => 10000,'task_worker_num' => 1,  //task进程的数量"task_ipc_mode " => 3 ,  //使用消息队列通信,并设置为争抢模式'open_length_check'    => true,'dispatch_mode'        => 1,'package_length_type'  => 'N',  //这个很关键,定位包头的'package_length_offset' => 0,      //第N个字节是包长度的值'package_body_offset'  => 4,      //第几个字节开始计算长度'package_max_length'    => 2000000,  //协议最大长度"log_file" => "/tmp/swoole_test.log"  //日志));$this->serv->on('Receive', array($this, 'onReceive'));$this->serv->on('Task', array($this, 'onTask'));$this->serv->on('Finish', array($this, 'onFinish'));$this->serv->start();}public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {//放入任务队列,开始执行$task_id = $serv->task( $data );}public function onTask($serv,$task_id,$from_id, $data) {//做一些事情}

客户端

class Client{private $client, $ip, $port, $params;public function __construct($ip, $port, $params){$this->ip = $ip;$this->port = $port;$this->params = $params;$this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);$this->client->set(array('open_length_check'    => true,'package_length_type'  => 'N','package_length_offset' => 0,      //第N个字节是包长度的值'package_body_offset'  => 4,      //第几个字节开始计算长度'package_max_length'    => 2000000,  //协议最大长度));//设置事件回调函数$this->client->on('Connect', array($this, 'onConnect'));$this->client->on('Receive', array($this, 'onReceive'));$this->client->on('Close', array($this, 'onClose'));$this->client->on('Error', array($this, 'onError'));//发起网络连接$this->client->connect($ip, $port, 3);}public function onReceive( $cli, $data ) {echo "Received: " . $data . "\n";}public function onConnect($cli) {$data = pack('N', strlen($data)) . $data;$cli->send($data);$cli->close();}public function onClose( $cli){echo "Connection close\n";}public function onError(){echo "Connect failed\n";}}

注意问题

'open_length_check'    => true,
'package_length_type'  => 'N',
'package_length_offset' => 0,      //第N个字节是包长度的值
'package_body_offset'  => 4,      //第几个字节开始计算长度
'package_max_length'    => 2000000,  //协长度

这几个是定义帧定界的,因为Swoole的客户端和服务器端通信是TCP连接的,因此得给帧定界符,有多种帧定界方式,具体参考Swoole官方文档。这里其中是用头额外加长度的方式。


http://www.ppmy.cn/embedded/118244.html

相关文章

代码随想录算法训练营DAY09之动态规划(一)基础题目

理论基础: 如果某一问题有很多重叠子问题,使用动态规划是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。 例子: 例如&a…

Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题

背景 因为组员对于 Electron 打包过程存在比较迷糊的状态,且自己也没主动探索 Electron-vue 打包细节,导致每次打包过程都消耗 5-6 分钟的时间,在需要测试生产打包时,极其浪费时间,为此针对 Electron-vue 打包的几个环…

华为OD机试真题- MELON的难题-2024年OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,持续跟新。 题目描述 MELON 有一堆精美的雨花石…

聊一聊测试用例的重要性

对于测试从业人员,测试用例术语应该不会陌生,在工作中用到的概率就像医生的药方,厨师心中的菜配方等等。 不过前者对项目组内人员都是公开的,后者的药方和配方大概率不会公开;前者项目内公开为了让测试用例覆盖率更高…

Hive基本原理与数据开发

目录 1.什么是Hive 2.Hive的特点和优势 2.1.Hive的特点 2.1.1.易用性 2.1.2.高效性 2.1.3.兼容性 2.1.4.可扩展性 2.1.5.容错性 2.2.与传统数据库的区别 3.hive的架构 3.1.hive的核心组件(如 Metastore、Driver、Query Compiler、Execution Engine 等) 3.1.1.用户接…

c++ day06

类的栈 实现 #include <iostream>using namespace std;class Stack { private:static const size_t MAX 100; // 定义固定容量int data[MAX]; // 存储栈元素的数组size_t len; // 当前栈的大小public:// 构造函数Stack() : len…

【MATLAB源码-第176期】基于matlab的16QAM调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在通信系统中&#xff0c;频率偏移是一种常见的问题&#xff0c;它会导致接收到的信号频率与发送信号的频率不完全匹配&#xff0c;进而影响通信质量。在调制技术中&#xff0c;QPSK&#xff08;Quadrature Phase Shift Keyi…

Python操作系统的6个自动化脚本

在Python中&#xff0c;实现操作系统自动化的脚本可以涵盖从文件操作、系统监控到网络任务等多种功能。下面我将详细介绍六个不同类别的Python自动化脚本示例&#xff0c;这些示例将帮助你理解如何用Python来自动化日常操作系统任务。 1. 文件与目录管理自动化 场景&#xff…