zoukankan      html  css  js  c++  java
  • swoft2 小白教程系列-进程篇

    swoft2 自定义用户进程来定期执行用户自定义任务
    swoft2 支持进程池解决多进程并发执行用户自定义任务

    swoft2 进程详解

     

    多进程程序设计能解决很多有意义的问题,程序的主进程运行核心任务,一些辅助进程解决一些例如消息队列的处理,后台定期执行的任务处理,文件监控,定期日志上报等相关功能.每个进程都有独立的上下文,进程之间互不干扰.

    功能的相关配置选项

    1. 用户进程的配置一般需要在 bean.php 里注册,系统会自动加载用户配置的自定义进程
    2. 进程池的配置也需要在 bean.php 配置进程池配置项,但进程池不会自动加载,需要手动执行命令来启动用户进程

    用户进程配置简单示例

    修改 bean.php
    'httpServer' => [
                'class'    => HttpServer::class,
                'port'     => 18306,
                'listener' => [
                    'rpc' => bean('rpcServer')
                ],
                'process'  => [
                    'crontab' => bean(CrontabProcess::class)
                    'log' => bean(AppProcessLogProcess::class)
                ],
            ],

    上面的配置是 WEB服务器 的应用配置 如果是 WebSocket服务器 写在wsServer配置项里,定义 process 属性就好.

    注意process的值是一维数组,其中key你可以自己定义,只要合法且不重复即可,值则为你定义的进程类,请用工厂函数 bean 加载.

    进程池的配置简单示例

    修改 bean.php
    'processPool' => [
            'class' => SwoftProcessProcessPool::class,
            'workerNum' => 12
    ]

    上面的配置定了进程池,且分配了12个可用工作进程,实际生产中根据你的项目需求自行修改配置项.

    进程 workerid 的初始值是0,所以这里的 workerid 有效访问是0-11,请注意

    简单的示例

    用户进程代码预览

    namespace AppProcess;
    use SwoftBeanAnnotationMappingBean;
    use SwoftLogHelperCLog;
    use SwooleCoroutine;
    use Throwable;
    use SwoftProcessProcess;
    use SwoftProcessUserProcess;
    /**
     * Class LogProcess
     *
     * @since 2.0
     *
     * @Bean()
     */
    class LogProcess extends UserProcess
    {
        /**
         * @param Process $process
         *
         * @throws Throwable
         */
        public function run(Process $process): void
        {
               $process->name('swoft-monitor'); //设置用户进程名
                while (true) {
                    CLog::info('用户进程,每隔3秒输出一次');//需要处理的工作
                    Coroutine::sleep(3);//休眠3秒
                }
        }
    }
    • 注意事项
    1. 自定义进程类需要打上 Bean 注解
    2. 用自定义进程类必须继承 SwoftProcessUserProcess
    3. 用户自定义进程类的 run 方法是具体的任务执行代码
    4. 用户进程需要while循环来防止进程执行完毕后退出
    5. 休眠函数请使用 Coroutine::sleep(3) 参数根据项目实际情况配置,单位是秒.支持传小数,如果传入参数0.5,则代表每 500ms 执行一次
    6. 在run方法里不使用 while(true) 而使用 SwoftTimer::tick ,也是可以的,但tick更多的用于解决周期性任务,该函数需要维护更多的调用栈,并且触发 swoft 的内置事件,所以它更消耗性能,一般在执行频率要求不高的场景下使用,如果一些执行频率较高的任务推荐使用 while(true)

     

    控制台打印

    进程池代码预览

    namespace AppProcess;
    use SwoftLogHelperCLog;
    use SwoftProcessAnnotationMappingProcess;
    use SwoftProcessContractProcessInterface;
    use SwooleCoroutine;
    use SwooleProcessPool;
    use Throwable;
    /**
     * Class Worker2Process
     *
     * @since 2.0
     *
     * @Process(workerId={0,1})
     */
    class Worker2Process implements ProcessInterface
    {
        /**
         * @param Pool $pool
         * @param int  $workerId
         *
         * @throws Throwable
         */
        public function run(Pool $pool, int $workerId): void
        {
            while (true) {
                CLog::info('worker-' . $workerId.' context='.context()->getWorkerId());
                Coroutine::sleep(3);
            }
        }
    }

    注意事项

    1. 进程池进程类需要打上 Process 注解 且参数是 workerId 值为分配的进程池work进程的id数组.
    2. 进程池进程类需要实现 SwoftProcessContractProcessInterface 接口.
    3. 进程池 Process 注解的 workerId 不是越多越好,需要根据你的需要设置,设置的越多占用的内存越多.
    4. 每个 workerid 只允许分配一次,如果分配多个系统会抛出异常.
    5. workerid的取值范围是 0 到 bean.php 配置的 workerNum-1 本文的例子是 0-11

    启动说明

    前台启用进程

    php bin/swoft process:start

    后台启动进程

    php bin/swoft process:start -d

    重启所有 worker 进程

    php bin/swoft process:reload
    

    重新启动

    php bin/swoft process:restart

    停止服务

    php bin/swoft process:stop

    控制台打印

     

    以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处

  • 相关阅读:
    ES6变量的解构赋值、字符串的新增方法
    JavaScript的基础语法及DOM元素和事件
    ES 新特性、异步、TypeScript
    JS实现PC端URL跳转到对应移动端URL
    jquery版本过低安全漏洞问题
    重磅!华为云社区·CSDN【寻找黑马程序员】有奖征文活动奖项公布!!
    车标知识学习网页开发,与Flask通过base64展示二进制图片 #华为云·寻找黑马程序员#
    大型情感剧集Selenium:3_元素定位 #华为云·寻找黑马程序员#
    大型情感剧集Selenium:2_options设置 #华为云·寻找黑马程序员#
    【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署
  • 原文地址:https://www.cnblogs.com/a609251438/p/12178344.html
Copyright © 2011-2022 走看看