异步多进程任务处理框架 – swoole-task

weixin_38051538 2019-09-12 12:36:29
swoole-task swoole-task是基于PHP swoole扩展开发的一个异步多进程任务处理框架,服务端和客户端通过http协议进行交互。 它适用于任务需要花费较长时间处理,而客户端不必关注任务执行结果的场景.比如数据清洗统计类的工作,报表生成类任务。 环境要求 PHP 5.4 以上版本,强烈推荐适用5.6,性能更好 Swoole 1.8.7 以上版本 PDO PDO_Mysql 安装方法 鉴于目前composer已经成为PHP包管理事实的标准,swoole-task直接支持通过composer 命令安装使用。 关于composer的使用请参考 composer 官网学习。 假设当前我们项目的名称为play,需要在项目中集成swoole-task,服务,执行如下命令。 composer require ping/swoole-task 如果项目根目录中不存在composer.json文件,需要执行composer init 命令。 使用方法 安装完成之后,在项目的vendor/bin 目录下会有swoole-tssk.php这个脚本,此脚本就是swoole-task服务的管理脚本。 以默认配置启动swoole-task服务 php swoole-task.php start 第一次启动会执行初始化动作。 关于swoole-task.php脚本的详细说明 参数 --app 应用目录名称,默认 sw-app,可根据自己需求设置 --nodaemon 以非守护进程模式启动,默认读取配置文件http_server.php 中的 daemonize的值 --help 显示帮忙 --host 指定绑定的ip 默认读取配置文件 http_server.php中的host取值 --port 指定绑定的端口,默认读取配置文件中的 http_server.php中的port的取值 命令 start //启动服务 stop //停止服务 restart //重启,配置文件常驻内存,修改后需要重启 status //查看状态 list //swoole-task服务列表 用例说明: //启动swoole-task服务,以项目根目录下的sw目录为业务目录 php swoole-task.php --app sw start //停止swoole-task 服务 php swoole-task.php -app sw stop //启动swoole-task 服务,使用默认app目录(sw-app),使用host和port 覆盖默认配置 php swoole-task.php --host 127.0.0.1 --port 9520 start //显示服务状态 php swoole-task.php --app sw status 配置说明 第一次使用 php swoole-task.php start 启动服务的时候,默认的业务逻辑编写目录是sw-app,和vendor在同级目录。 自动生成如下目录结构 - sw-app 和vendor是同级目录 - Conf 配置文件目录,不可更改 - http_server.php 主要是针对HttpServer的配置 - app.php 主要是对实际业务的配置 - dev 开发环境配置文件目录(列如 db.php redis.php等等,文件名为key值) - test 测试环境配置文件目录 - prod 生产环境配置文件目录 - Runtime 运行时输出目录 - Ctrl controller目录,可修改app.php配置文件,使用别的名称来替代Ctrl - Dao 数据访问业务Dao,可修改app.php配置文件,使用别的名称替代Dao - Helper 帮助类,修改配置文件可以使用别的名称 默认配置文件说明 app.php(没强迫症建议直接使用默认配置不必修改) ns_pre 命名空间前缀,默认值 SwTask ns_ctrl ctrl类的命名空间,注意命名空间和ctrl类是一致的,遵循psr4规则, ns_dao dao类的命名空间 ns_helper heper类的命名空间 http_server.php(修改配置好之后需要重启加载配置文件) tz 时区设置,默认是上海时区,数据处理的时候非常重要 host 监听的主机ip地址,默认配置0.0.0.0 port 监听的主机端口,默认值 9523 app_env swoole-task 业务的环境,支持dev,test,prod三个值 ps_name 进程名称前缀 默认 swTask daemonize 是否守护进程模式 0 非守护进程 1 守护进程,默认0 worker_num worker 进程数量,推荐数量和cpu核数保持一致 task_woker_num 任务进程数量,根据机器配合和实际需求设置 task_max_request 每个任务进程最多可处理请求数,超过重启,保证内存不泄露的机制 swoole-task 服务启动流程说明 初次运行swoole-task,执行php vendor/bin/swoole-task.php 命令,不添加任何参数,会执行如下初始化工作 1 根据默认配置,创建Ctrl, Dao,Helper, Conf, Conf/test, Conf/dev, Conf/prod, Runtime, Runtime/log 目录, 2 创建TplCtrl,TplDao 文件,写入到Ctrl/Dao 目录下,作为模板文件 3 初始化配置文件app.php , http_server.php,写入到Conf目录下 运行 php swoole-task.php 命令,不添加任何参数,会在项目根目录下检查是否存在sw-app 目录。 如果不存在,执行初始化工作; 如果存在,加载sw-app/Conf目录下的相关配置,启动服务。 路由说明 客户端和服务端http协议交互,形式如下 curl “127.0.0.1:9523/ctrlName/actionName” curl “127.0.0.1:9523?op=ctrlName.actionName” 初始化后,默认生成的TplCtrl.php 文件,其中包含了一个 helloAction的方法 访问这个action的命令为 curl “127.0.0.1:9523/tpl/hello” 或者 curl “127.0.0.1:9523?op=tpl.hello”
...全文
212 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
Swoole-Crontab(基于Swoole扩展) 1.概述 基于swoole的定时器程序,支持秒级处理. 异步多进程处理。 完全兼容crontab语法,且支持秒的配置,可使用数组规定好精确操作时间 请使用swoole扩展1.7.9-stable及以上版本.Swoole 支持worker处理redis队列任务 2.配置的支持 具体配置文件请看 src/config/crontab.php 介绍一下时间配置 0 1 2 3 4 5 | | | | | | | | | | | ------ day of week (0 - 6) (Sunday=0) | | | | ------ month (1 - 12) | | | -------- day of month (1 - 31) | | ---------- hour (0 - 23) | ------------ min (0 - 59) -------------- sec (0-59)[可省略,如果没有0位,则最小时间粒度是分钟] 3.帮助信息 * Usage: /path/to/php main.php [options] -- [args...] * -h [--help] 显示帮助信息 * -p [--pid] 指定pid文件位置(默认pid文件保存在当前目录) * -s start 启动进程 * -s stop 停止进程 * -s restart 重启进程 * -l [--log] log文件夹的位置 * -c [--config] config文件的位置 * -d [--daemon] 是否后台运行 * -r [--reload] 重新载入配置文件 * -m [--monitor] 监控进程是否在运行,如果在运行则不管,未运行则启动进程 * --worker 开启worker 可以针对redis队列读取并编写处理逻辑 * --tasktype task任务获取类型,[file|mysql] 默认是file * --checktime 默认精确对时(如果精确对时,程序则会延时到分钟开始0秒启动) 值为false则不精确对时 4.worker进程配置 在src/config/worker.php 中写入配置,并且启动的时候加上 --worker选项就能启动worker工作进程 配置如下: return array( //key是要加载的worker类名 "ReadBook"=>array( "name"=>"队列1", //备注名 "processNum"=>1, //启动的进程数量 "redis"=>array( "host"=>"127.0.0.1", // redis ip "port"=>6379, // redis端口 "timeout"=>30, // 链接超时时间 "db"=>0, // redis的db号 "queue"=>"abc" // redis队列名 ) ) ); 具体的业务逻辑在src/worker/ 文件夹下。可以自己定义业务逻辑类,只需要继承WorkerBase.class.php中的WorkerBase基类就可以 5.例子 你可以在配置文件中加上以下配置: return array( 'taskid1' => array( 'taskname' => 'php -i', //任务名称 'rule' => '* * * * * *',//定时规则,可以使用数组精确设置时间 如:array("22:18","2015-11-11 00:00:00 ","10:20:39") "unique" => 2, //排他数量,如果已经有这么多任务在执行,即使到了下一次执行时间,也不执行 'execute' => 'Cmd',//命令处理类 'args' => array( 'cmd' => 'php -i',//命令 "ext": "" ), ), ); 然后去到src目录下,执行 /path/to/php main.php -s start 执行完成以后你就可以在/tmp/test.log看到输出了,每秒输出一次 如果你需要写自己的代码逻辑,你也可以到plugin目录下,实现一个PluginBase.class.php接口的类. 在其中写自己的逻辑代码。 6.TODO 分布式运行 restful增删改任务 标签:swoole
SwooleDistributed 是swoole分布式系统的实现,他提供了一套基于swoole扩展的分布式通讯框架。结构图:SwooleDistributed 不仅提供了分布式搭建的必要设施,还提供了4大组件帮助你提高编写代码的效率,你既可以部署成单机模式也可以搭配dispatch模块构建集群系统。有别于传统的MVC架构,SwooleDistributed 主要应对的是rpc服务或者是通讯服务,也就是说MVC中的View模块是没有实际意义的,所以在SwooleDistributed 中仅存在Model和Controller,另外为了方便开发我们额外添加了2个组件分别是Task和Timer。Task组件主要是处理异步任务,由于Task的设计结构简单只适合用于辅助swoole的worker进程,处理简单并不复杂的异步操作,如果你将他作为复杂耗时并且频繁调用的组件那是不可取的。Timer是封装好的定时器,他和Task组件关系密切,你可以通过Timer进行定时任务。目前提供便利的还有异步的Redis连接池,你可以方便简单的使用redis异步服务而不用担心连接池的问题,我们已经优雅的解决了。但值得注意的是所有的异步服务都只允许在worker进程中调用,task进程只能调用同步服务。未来将要实现的:1.异步的mysql服务,建立管理mysql连接池。2.mysql语法构建器,帮助快速构建mysql语句。3.Job服务组件的开发,结合消息队列系统实现分布式的异步任务。安装须知:php 7.0  2.需要使用最新版的swoole,请通过github下载编译swoole,1.8.7在php7.0下存在bug不建议使用  3.需要redis支持,安装redis扩展  swoole编译时选择异步redis选项  4.需要composer支持,安装composer,运行composer install安装依赖  5.如需集群自行搭建LVS  运行:php start_swoole_server.php start    启动swoole server服务器  2.php start_swoole_dispatch.php start    启动swoole dispatch服务器  3.单独启动swoole server不具备分布式特性,一台物理机只允许启动一个swoole server  4.swoole dispatch服务器可以和swoole server放在一个物理机上,一台物理机只允许启动一个swoole dispatch  5.可以启动多台swoole server和多台swoole dispatch搭建分布式系统(至少1台LVS,2台swoole server,1台swoole dispatch,1个redis)  6.单独启动swoole server可作为单机服务器。  7.修改config目录下配置,改为你自己的配置。  8.swoole server与swoole dispatch 必须在同一个网段。swoole dispatch无需配置,swoole server会自动发现  9.swoole server与swoole dispatch 都支持动态弹性部署,随时热插拔。swoole dispatch上线后30秒内被swoole server发现并建立连接  10.内置controller,model,task 3大模块  11.swoole server与swoole dispatch都被设计成无状态服务器,所有的信息共享都通过redis  12.最新版采用了异步redis进行数据存储,通过开启一个新的redis连接池进程,利用addProcess和sendMessage技术进行结果分发,优雅解决异步问题。  13.注意taskproxy为单例,不要变成成员变量使用,用到时load 标签:通讯框架

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧