当前位置:   article > 正文

php使用thinkphp快速搭建swoole玩转协程_thinkphp swoole

thinkphp swoole

swoole4开始支持了类似go的协程,以下是进程、线程、协程之间的联系。

1,进程
经典定义:一个执行中程序的实例。系统中的每个程序都运行在某个进程的上下文中。(-摘自 CSAPP)

进程是系统资源分配的最小单位

2,线程(thread)
线程就是运行在进程上下文中的逻辑流。

线程是操作系统能够进行运算调度的最小单位。

3,协程
相对 子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。

根据维基百科对子例程的描述:是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。我可以将子例程理解为一个函数。
 

协程与线程的区别:


1 一个线程可以多个协程,一个进程也可以单独拥有多个协程。

2 线程进程都是同步机制,而协程则是异步。

3 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。

4线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。

5协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。

6 线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。

7 极高的执行效率:因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显;

8 不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
 

废话有点密了哈哈,本文将采用宝塔+thinkphp6+swoole搭建。具体流程如下:

首先让我们来看看thinkphp6的手册,据说是支持了swoole扩展快速搭建。

链接:Swoole · ThinkPHP6.0完全开发手册 · 看云

说真的,文档写的太对付了,不像workerman那样直接简单。

这里我打算用另一种方式快速搭建。

thinkphp支持自定义指令,链接:自定义指令 · ThinkPHP6.0完全开发手册 · 看云

根据这个创建一个swoolews指令,如下:

1、安装宝塔(可略过):

宝塔面板下载,免费全能的服务器运维软件

2、安装thinkphp6(可略过):

安装 · ThinkPHP6.0完全开发手册 · 看云

3、创建自定义指令:

 

 

'swoolews' => 'app\command\Swoolews',

 

 

 4、直接去swoole官方文档(抄代码!哈哈!):

Swoole4 文档

 

 

  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\command;
  4. use think\console\Command;
  5. use think\console\Input;
  6. use think\console\input\Argument;
  7. use think\console\input\Option;
  8. use think\console\Output;
  9. class Swoolews extends Command
  10. {
  11. protected function configure()
  12. {
  13. // 指令配置
  14. $this->setName('swoolews')
  15. ->setDescription('the swoolews command');
  16. }
  17. protected function execute(Input $input, Output $output)
  18. {
  19. // 指令输出
  20. $output->writeln('swoolews');
  21. //创建WebSocket Server对象,监听0.0.0.0:9502端口
  22. $ws = new \Swoole\WebSocket\Server('0.0.0.0', 9501);
  23. //监听WebSocket连接打开事件
  24. $ws->on('Open', function ($ws, $request) {
  25. $ws->push($request->fd, "hello, welcome\n");
  26. });
  27. //监听WebSocket消息事件
  28. $ws->on('Message', function ($ws, $frame) {
  29. echo "Message: {$frame->data}\n";
  30. $ws->push($frame->fd, "server: {$frame->data}");
  31. });
  32. //监听WebSocket连接关闭事件
  33. $ws->on('Close', function ($ws, $fd) {
  34. echo "client-{$fd} is closed\n";
  35. });
  36. $ws->start();
  37. }
  38. }

 

 5、在项目目录下启动ws服务并测试(注意!记得服务器和宝塔开启9501端口,咱们服务配置的是9501端口):

 测试ws网站链接:在线websocket测试-online tool-postjson

 

 随便发送个消息:

 

 

 有回应就说明没有问题喽,当然上述代码可能不易于维护,你也可以根据swoole官方文档给的基础知识改写一下:

Swoole4 文档

6、测试协程

协程文档链接:Swoole4 文档

 

 

 

  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\command;
  4. use think\console\Command;
  5. use think\console\Input;
  6. use think\console\input\Argument;
  7. use think\console\input\Option;
  8. use think\console\Output;
  9. use Swoole\Coroutine;
  10. use function Swoole\Coroutine\go;
  11. class Swoolews extends Command
  12. {
  13. protected function configure()
  14. {
  15. // 指令配置
  16. $this->setName('swoolews')
  17. ->setDescription('the swoolews command');
  18. }
  19. protected function execute(Input $input, Output $output)
  20. {
  21. // 指令输出
  22. $output->writeln('swoolews');
  23. //创建WebSocket Server对象,监听0.0.0.0:9502端口
  24. $ws = new \Swoole\WebSocket\Server('0.0.0.0', 9501);
  25. //监听WebSocket连接打开事件
  26. $ws->on('Open', function ($ws, $request) {
  27. $ws->push($request->fd, "hello, welcome\n");
  28. });
  29. //监听WebSocket消息事件
  30. $ws->on('Message', function ($ws, $frame) {
  31. echo "Message: {$frame->data}\n";
  32. //协程测试
  33. for($i=0;$i<10;$i++) {
  34. go(function () use ($ws ,$frame, $i) {
  35. for ($n = 100; $n--;) {
  36. usleep(1000);
  37. }
  38. });
  39. }
  40. $ws->push($frame->fd, "server: 完成");
  41. });
  42. //监听WebSocket连接关闭事件
  43. $ws->on('Close', function ($ws, $fd) {
  44. echo "client-{$fd} is closed\n";
  45. });
  46. $ws->start();
  47. }
  48. }

 重启服务

 

 效果还是不错的!

7、swoole协程与go协程的区别

go语言协程相对智能很多,使用的是MPG模式调度协程~ 简单说就是产生的所有协程其它的线程是有空就能去执行的,是多cpu调度的,相当于有一个协程池,空闲的cpu会去池子里执行协程任务,相比swoole的单cpu调用更有效地利用系统资源。可以方便的实现API的并行处理,达到处理效率的最大化。 

所以咱们也不去夸大swoole的能力,真正要说协程比较强大的还是goroutine,这个咱不犟。

swoole协程还是在io操作上能提高效率,其他情况还是考虑php多进程,java多线程或go的goroutine吧!

记得三连哦!

海蜘蛛:只要自己足够废物,那么就没有天敌!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/351380
推荐阅读
相关标签
  

闽ICP备14008679号