如何在PHP中使用Swoole实现一个演员并发模型

  介绍

如何在PHP中使用Swoole实现一个演员并发模型?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强>什么是演员吗?

演员对于PHP来说,可能会比较陌生,写过Java的同学会比较熟悉,Java一直都有线程的概念(虽然PHP有Pthread,但不普及),它是一种非共享内存的并发模型,每个演员内的数据独立存在,演员之间通过消息传递的形式进行交互调度,且演员是一种高度抽象化的编程模型,非常适合于游戏,硬件行业。

<强> Swoole协程与信箱

得益于Swoole4。x,我们可以基于Swoole的协程与通道快速实现一个信箱模式调度。模拟代码如下:

use  Swoole \协同程序\通道;   去(function  () {//才能创建十个信箱通道   时间=美元才能mailBoxes  [];   for 才能;($小姐:=,1;美元小姐:& lt;=, 10;美元我+ +){   ,,,邮箱美元($ i),=, new 通道(16);   ,,}//模才能拟master 邮局调度,随机像一个信箱投递消息   (才能function ()使用(邮箱美元){   ,,,while  (1) {   ,,,,,\有限公司::睡眠(2);   ,,,,,key 美元;=,兰德(10);   ,,,,,(邮箱美元[$ key])→推(());   ,,,}   ,,});//模才能拟actor 实体消费   for 才能;($小姐:=,1;美元小姐:& lt;=, 10;美元我+ +){   ,,,(function ()使用(邮箱、我美元){   ,,,,,while  (1) {   ,,,,,,,msg 美元;=,(邮箱美元[$ i])→pop ();   ,,,,,,,echo “Actor {$我},recv  msg :,{$味精},\ n";   ,,,,,}   ,,,});   ,,}   });

以上代码执行输出:

php测试。php
演员8 recv味精:1559622691
演员10 recv味精:1559622693
演员1 recv味精:1559622695
演员5 recv味精:1559622697

协程通道每次在流行遇到无数据的时候,都会自动让出执行权(具体可以去看Swoole协程调度)

<强>演员库

基于上面的原理,我们实行了一个多进程分布的协程演员库

composer  require  easyswoole/演员=2。x-dev

我们依赖dev库进行测试,生产可以自己依赖稳定版本

<强>进程关系

Easyswoole的演员模型中,存在两组进程,一组是代理进程,用来实现演员对外服务,一组是工人进程,代理进程与工人进程之间通过unixsock进行通讯,而演员实例就均匀的分布工人之中。

<强>样例代码

比如在一个聊天室中,我们可以定义一个房间模型。

namespace  Easyswoole \演员\测试;         use  EasySwoole \演员\ AbstractActor;   use  EasySwoole \演员\ ActorConfig;      class  RoomActor  extends  AbstractActor   {   public 才能;static  function 配置(ActorConfig  actorConfig美元)   {才能   ,,,美元actorConfig→setActorName(& # 39;房间# 39;);   ,,}   public 才能;function  onStart ()   {才能   ,,,//每当一个RoomActor实体被创建的时候,都会执行该回调   ,,,var_dump (& # 39; room  actor  & # 39;。$ this→actorId() # 39;公司,开始# 39;);   ,,}   public 才能;function  onMessage (msg)美元   {才能   ,,,//每当一个RoomActor实体收到外部消息的时候,都会执行该回调当   ,,,var_dump (& # 39; room  actor  & # 39;。$ this→actorId() # 39;公司,onmessage:, & # 39;味精美元);   ,,,return  & # 39; reply  at  & # 39; .time ();   ,,}   public 才能;function  onExit arg ($)   ,{大敌;   ,,,//每当一个RoomActor实体退出的时候,都会执行该回调   ,,,var_dump (& # 39; room  actor  & # 39;。$ this→actorId() # 39;公司,exit  at 参数:,& # 39;美元参数);   ,,,return  & # 39; exit  at  & # 39; .time ();   ,,}   protected 才能;function  onException (\ Throwable 可抛出美元)   {才能   ,,,//每当一个RoomActor出现异常的时候,都会执行该回调   ,,,var_dump (throwable→美元getMessage ());   ,,}   }

在cli模式下创建一个演员服务

use  EasySwoole \演员\演员;   use  EasySwoole \演员\ \ RoomActor测试;   use  EasySwoole \演员\ ProxyProcess;      演员::getInstance()→注册(RoomActor::类);   $ list =,演员:getInstance ()→generateProcess ();      foreach ($名单[& # 39;代理# 39;],as 美元代理){/* *,才能@var  ProxyProcess  proxy 美元;*/代理→美元才能getProcess()→开始();   }   foreach ($名单[& # 39;工人# 39;],as 演员美元){   foreach 才能;(actors 美元;as  actorProcess美元){   ,,,/* *,@var  ProxyProcess  actorProcess 美元;*/,,,美元actorProcess→getProcess()→开始();   ,,}   }   而(ret 美元;=,\ Swoole \过程::wait ()), {   echo 才能“PID={$ ret [& # 39; PID # 39;]} \ n";   }

如何在PHP中使用Swoole实现一个演员并发模型