十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇内容主要讲解“什么是swoft2进程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是swoft2进程”吧!
为章贡等地区用户提供了全套网页设计制作服务,及章贡网站建设行业解决方案。主营业务为网站建设、网站制作、章贡网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
swoft2 自定义用户进程来定期执行用户自定义任务
swoft2 支持进程池解决多进程并发执行用户自定义任务
进程和线程的介绍 https://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
多进程程序设计能解决很多有意义的问题,程序的主进程运行核心任务,一些辅助进程解决一些例如消息队列的处理,后台定期执行的任务处理,文件监控,定期日志上报等相关功能.每个进程都有独立的上下文,进程之间互不干扰.
用户进程的配置一般需要在 bean.php 里注册,系统会自动加载用户配置的自定义进程
进程池的配置也需要在 bean.php 配置进程池配置项,但进程池不会自动加载,需要手动执行命令来启动用户进程
修改 bean.php
'httpServer' => [ 'class' => HttpServer::class, 'port' => 18306, 'listener' => [ 'rpc' => bean('rpcServer') ], 'process' => [ 'crontab' => bean(CrontabProcess::class) 'log' => bean(\App\Process\LogProcess::class) ], ],
上面的配置是 WEB服务器 的应用配置 如果是 WebSocket服务器 写在wsServer配置项里,定义 process 属性就好.
注意process的值是一维数组,其中key你可以自己定义,只要合法且不重复即可,值则为你定义的进程类,请用工厂函数 bean 加载.
修改 bean.php
'processPool' => [ 'class' => \Swoft\Process\ProcessPool::class, 'workerNum' => 12 ]
上面的配置定了进程池,且分配了12个可用工作进程,实际生产中根据你的项目需求自行修改配置项.
进程 workerid 的初始值是0,所以这里的 workerid 有效访问是0-11,请注意
namespace App\Process; use Swoft\Bean\Annotation\Mapping\Bean; use Swoft\Log\Helper\CLog; use Swoole\Coroutine; use Throwable; use Swoft\Process\Process; use Swoft\Process\UserProcess; /** * 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秒 } }
注意事项
自定义进程类需要打上 Bean 注解
用自定义进程类必须继承 Swoft\Process\UserProcess
用户自定义进程类的 run 方法是具体的任务执行代码
用户进程需要while循环来防止进程执行完毕后退出
休眠函数请使用 Coroutine::sleep(3) 参数根据项目实际情况配置,单位是秒.支持传小数,如果传入参数0.5,则代表每 500ms 执行一次
在run方法里不使用 while(true) 而使用 \Swoft\Timer::tick ,也是可以的,但tick更多的用于解决周期性任务,该函数需要维护更多的调用栈,并且触发 swoft 的内置事件,所以它更消耗性能,一般在执行频率要求不高的场景下使用,如果一些执行频率较高的任务推荐使用 while(true)
namespace App\Process; use Swoft\Log\Helper\CLog; use Swoft\Process\Annotation\Mapping\Process; use Swoft\Process\Contract\ProcessInterface; use Swoole\Coroutine; use Swoole\Process\Pool; 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); } } }
注意事项
进程池进程类需要打上 Process 注解 且参数是 workerId 值为分配的进程池work进程的id数组.
进程池进程类需要实现 Swoft\Process\Contract\ProcessInterface 接口.
进程池 Process 注解的 workerId 不是越多越好,需要根据你的需要设置,设置的越多占用的内存越多.
每个 workerid 只允许分配一次,如果分配多个系统会抛出异常.
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
到此,相信大家对“什么是swoft2进程”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!