介绍
如何在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实现一个演员并发模型