菜鸟教程 myswli php,swoft2 小白教程系列-进程篇

搜索热词

swoft2 自定义用户进程来定期执行用户自定义任务

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

swoft2 进程详解

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

功能的相关配置选项

用户进程的配置一般需要在 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)

控制台打印

28bc7028f580d66d5a32443fff91a5ca.png

进程池代码预览

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

控制台打印

73775186fc5ab384f22a6d77b9f7c770.png

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

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值