PHP Swoole 基本使用

news2024/9/28 2:17:10

在这里插入图片描述
背景

在项目中,我们使用了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.coloradmin.cn/o/2167364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】渐进式遍历 数据库管理命令 RESP协议

目录 渐进式遍历 scan 数据库管理命令 切换数据库 获取当前数据库key的个数 删除当前数据库所有的key 删除所有数据库中所有的key RESP协议 渐进式遍历 Redis使用scan命令进行渐进式遍历键,进而解决直接使用keys获取键时可能出现的阻塞问题(因为…

多旋翼无人机光伏发电站吊运技术详解

随着清洁能源技术的快速发展,光伏发电站作为可再生能源的重要组成部分,其建设与维护对效率、安全性和成本控制的要求日益提高。多旋翼无人机光伏发电站吊运技术应运而生,该技术利用多旋翼无人机强大的垂直起降能力、灵活的飞行控制以及高效的…

CSS中的字体样式、文本样式、列表样式以及背景和渐变

一、字体样式和文本样式 1.span标签 span标签的作用&#xff1a;能让某几个文字或者是词语凸显出来 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-…

【深度学习基础模型】门控循环单元 (Gated Recurrent Units, GRU)详细理解并附实现代码。

【深度学习基础模型】门控循环单元 (Gated Recurrent Units, GRU) 【深度学习基础模型】门控循环单元 (Gated Recurrent Units, GRU) 文章目录 【深度学习基础模型】门控循环单元 (Gated Recurrent Units, GRU)1.门控循环单元 (Gated Recurrent Units, GRU) 原理详解1.1 GRU 概…

一个任务的一辈子

总览 孕育&#xff1a;这一步是生命的起源&#xff0c;对应"任务"就是&#xff1a;申办人因为办理业务而发起一个流程。这是任务产生的摇篮。 任务的使命就是为了完成业务;生产&#xff1a;这是新生命产生的过程&#xff0c;对应"任务"就是&#xff1a;任务…

IT运维挑战与对策:构建高效一体化运维管理体系

在当今数字化时代&#xff0c;IT运维作为企业运营的核心支撑&#xff0c;其重要性不言而喻。然而&#xff0c;随着业务规模的扩大和技术的不断革新&#xff0c;IT运维团队面临着前所未有的挑战。本文旨在深度剖析当前IT运维中存在的主要问题&#xff0c;并探索一体化解决方案&a…

1500PLC使用EPOS控制伺服电机

硬件配置与参数 硬件配置 名称 型号 数量 PLC 1512C-1 PN 1个 伺服放大器 V90 PN 1个 伺服电机 SIMOTICS 1个 V90 PN伺服驱动器&#xff1a; 伺服驱动器硬件参数 使用软件&#xff1a;V-ASSISTANT 软件连接时可选择USB连接或者Ethernet连接&#xff0c;根据实际…

【ComfyUI】生成图细节更清晰——Consistency_Decoder

原文&#xff1a;https://github.com/openai/consistencydecoder comfyui: https://github.com/gameltb/Comfyui_Consistency_Decoder_VAE 博文资料下载&#xff1a;https://pan.baidu.com/s/1SwfA4T6iMsA8IrRrGXm4sg?pwd0925 安装 【秋葉aaaki】comfyui一键运行包 夸克网盘…

Vue下载静态文件

1、需求&#xff1a;将静态文件放在本地&#xff0c;让用户进行下载。 2、文件位置&#xff1a; ① 原生js&#xff1a;直接将文件放在某个目录或者根目录下 ② Vue&#xff1a;将文件放在根目录的public文件夹下面 3、代码示例&#xff1a; const url "/模板.xlsx"…

音视频入门基础:AAC专题(9)——FFmpeg源码中计算AAC裸流每个packet的duration和duration_time的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

前言 动手学深度学习课程安排及介绍

前言 动手学深度学习课程安排及介绍 文章目录 前言 动手学深度学习课程安排及介绍课程预告课程安排深度学习介绍 课程预告 学习深度学习关键是动手。 深度学习是人工智能最热的领域核心是神经网络神经网络是一门语言应该像学习Python/C一样学习深度学习 课程安排 【动手学深…

Mysql 存储List类型的数据

python request 爬到的数据里面有一部分是List&#xff0c;一开始在建表时想当然地使用 create table if not exists demo (id TEXT, short_id TEXT, parent_ids LIST)结果报错syntax error&#xff0c;查半天才发现Mysql里没有LIST这个类型 所以存储一个List只能将List数据…

第十六章 模板与泛型编程

16.1 定义模板 模板是C泛型编程的基础。为模板提供足够的信息&#xff0c;就能生成特定的类或函数。 16.1.1 函数模板 在模板定义中&#xff0c;模板参数列表不能为空。 //T的实际类型在编译时根据compare的使用情况来确定 template <typename T> int compare(const …

乱篇弹(54)让子弹飞

创作者在知乎能挣到钱吗&#xff1f; 芝士平台的答案&#xff1a;“当然能&#xff0c;在知乎&#xff0c;无论是各领域的优秀回答者&#xff0c;还是拥有几百或几千关注者的潜力创作者&#xff0c;甚至是只在知乎创作过几篇回答的新人创作者&#xff0c;都有可能在知乎赚钱 。…

[Linux]从零开始的Linux的远程方法介绍与配置教程

一、为什么需要远程Linux 相信大家在学习Linux时&#xff0c;要么是使用Linux的虚拟机或者在物理机上直接安装Linux。这样确实非常方便&#xff0c;我们也能直接看到Linux的桌面或者终端。既然我们都能直接看到终端或者Linux的桌面了&#xff0c;那我们为什么还要远程Linux呢&a…

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法 在现代即时通讯&#xff08;IM&#xff09;系统和实时通信应用中&#xff0c;WebSocket作为一种高效的双向通信协议&#xff0c;得到了广泛应用。然而&#xff0c;在实际使用中&#xff0c;如何确保消息的可靠传输…

ai智能抠图有哪些?我只告诉你这些

在广告、设计、摄影以及视频剪辑等创意领域&#xff0c;抠图技术就像是一把神奇的钥匙&#xff0c;能够将图片中的精彩瞬间或独特元素巧妙地分离出来&#xff0c;并融入到全新的背景之中&#xff0c;创造出无限的可能性。 当面对复杂图形的挑战时&#xff0c;使用高效的在线智…

RabbitMQ基础使用

1.MQ基础介绍 同步调用 OpenFeign的调用。这种调用中&#xff0c;调用者发起请求后需要等待服务提供者执行业务返回结果后&#xff0c;才 能继续执行后面的业务。也就是说调用者在调用过程中处于阻塞状态&#xff0c;因此我们称这种调用方式为同步调用 异步调用 异步调用通…

Lucene 倒排索引原理详解:深入探讨相关算法设计

引言 随着互联网的快速发展&#xff0c;数据量呈现爆炸性的增长&#xff0c;如何从海量数据中快速准确地获取所需信息成为了一项挑战。全文搜索引擎的出现极大地解决了这个问题&#xff0c;而 Lucene 正是一款优秀的开源全文搜索引擎库。本文将深入探讨 Lucene 的核心技术之一…

NtripShare测量机器人自动化监测系统测站更换仪器后重新设站

NtripShare测量机器人自动化监测系统投入商业运营已经很久了&#xff0c;在MosBox与自动优化网平差技术的加持下&#xff0c;精度并不让人担心&#xff0c;最近基于客户需求处理了两个比较大的问题。 1、增加对反射片和免棱镜的支持。 2、进一步优化测站更换仪器或重新整平后重…