说一下Workerman和Swoole

现在的PHPER们在做socket通信时,我想绝大部分人都会想到这两个框架,一个是Workerman,另外一个就是Swoole,其中Workerman是采用原生的PHP语言进行封装完成,而Swoole是用C/C++编写的一个PHP扩展。现在网络上绝大部分声音对于这两个框架,目前是Swoole一边倒的局势,我猜测很可能人们看到Swoole是用C语言编写的,在心里上就自然而然的认为Swoole更好。但是事实上并非如此,今天就来聊一聊这两个框架,看看到底有哪些差别。

首先开始的时候先说一下压测,这也是最核心的东西,东西好不好,先来看一下压测

环境 阿里云:Ubuntu 18.04.3 LTS; 4核 4G;php7.2;swoole 4.4.15; workerman 3.4.24;

swoole 压测脚本:

<?php
$http = new swoole_http_server("127.0.0.1", "1234");
$http->set(array(
    'worker_num' => 4, 
    'daemonize' => false, 
));
$http->on('request', function ($request, $response) {
    $response->end("hello");
});
$http->start();

workerman 压测脚本:

<?php
require_once __DIR__ . '/workerman/Autoloader.php';
use Workerman\Worker;
$worker = new Worker('http://0.0.0.0:12345');
$worker->count = 4;
$worker->onMessage = function($connection, $data) {
        $connection->send('hello');
};

swoole 结果:

ab -n1000000 -c1000 -k http://127.0.0.1:1234/
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Completed 1000000 requests
Finished 1000000 requests
Server Software:        swoole-http-server
Server Hostname:        127.0.0.1
Server Port:            1234
Document Path:          /
Document Length:        5 bytes
Concurrency Level:      1000
Time taken for tests:   11.421 seconds
Complete requests:      1000000
Failed requests:        0
Keep-Alive requests:    1000000
Total transferred:      157000000 bytes
HTML transferred:       5000000 bytes
Requests per second:    87561.23 [#/sec] (mean)
Time per request:       11.421 [ms] (mean)
Time per request:       0.011 [ms] (mean, across all concurrent requests)
Transfer rate:          13424.91 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1  26.0      0    1040
Processing:     2   11   5.2     11     244
Waiting:        2   11   5.2     11     244
Total:          2   11  29.6     11    1281
Percentage of the requests served within a certain time (ms)
  50%     11
  66%     12
  75%     12
  80%     12
  90%     13
  95%     13
  98%     16
  99%     21
 100%   1281 (longest request)

workerman结果:

 ab -n1000000 -c1000 -k http://127.0.0.1:12345/
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Completed 1000000 requests
Finished 1000000 requests
Server Software:        workerman
Server Hostname:        127.0.0.1
Server Port:            12345
Document Path:          /
Document Length:        5 bytes
Concurrency Level:      1000
Time taken for tests:   10.674 seconds
Complete requests:      1000000
Failed requests:        0
Keep-Alive requests:    1000000
Total transferred:      125000000 bytes
HTML transferred:       5000000 bytes
Requests per second:    93686.80 [#/sec] (mean)
Time per request:       10.674 [ms] (mean)
Time per request:       0.011 [ms] (mean, across all concurrent requests)
Transfer rate:          11436.38 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.7      0      29
Processing:     3   11   2.5     10      26
Waiting:        3   11   2.5     10      26
Total:          3   11   2.7     10      47
Percentage of the requests served within a certain time (ms)
  50%     10
  66%     10
  75%     11
  80%     11
  90%     11
  95%     19
  98%     20
  99%     21
 100%     47 (longest request)

从以上的压测结果来看,两者框架几乎无差别,甚至Workerman还比Swoole要略微好一点点,当然,这个是没有带上任何业务逻辑,直接输出hello的压测,那么如果在程序中写上业务逻辑比如io操作,数据库增删改写等再进行压测结果会是怎么样呢。

这里附一幅图,是专门做压测的第三方机构的2020年4月20号的压测结果,压测里包含了带数据库io的,包括单查、多查、多更新等:(数据来源:https://www.techempower.com/benchmarks/#section=test&runid=832828ba-3e18-415d-b492-461260ddc510&hw=ph&test=plaintext&l=zik073-3j

截图

从跑分来每个指标workerman都比swoole略高一些,总体来看看swoole和workerman结果差不多。

注:以上压测结果仅供参考

压测聊完了,我们再来聊一下开发效率,对于PHPER来说,没有什么比上手容易更幸福的事了吧,如果一个框架上手很困难需要查阅大量资料的话,那岂不是很痛苦了嘛

首先说一下Workerman,在其官网中能看到这样的一句话:“只要你会PHP,你就可以在这些应用的基础上快速的开发出自己的Socket应用服务。”这说的就真的太直白了,我当初也是看到了这句话之后,开始尝试用Workerman进行项目开发,结果事实证明确实如此,对于我来说,我认为Workerman开发甚至比Tinkphp开发还要简单,众所周知TP框架上手真的很简单

那么再来说一下Swoole框架,我也用过Swoole进行过项目开发,用于客户端的后端主要通讯,在开发过程中,有些简单的步骤真的变得特别繁琐。简单一句话概况就是,用Swoole做项目开发的话,你真的很需要很深的编程功底才能顺畅的完成项目,否则等待你的就是无休止的查阅资料。有很多时候,一些轮子需要自己去创造。当然在使用swoole的过程中发现了一个基于swoole的第三方框架,叫做easyswoole,这个框架有封装了很多的轮子可以直接使用,但是使用起来还是觉得有些繁琐。但是不得不说,Swoole采用C开发在内存管理上有绝大的优势,这也决定了他的使用场景,就是商业正式环境

上面说的基于swoole的第三方框架,当然workerman也有基于他的框架,也在workerman官网能找到,名字叫GatewayWorker,如果你使用了GatewayWorker,那么可以非常方便的和其他项目进行集成,只需要在要项目中安装gatewayclient即可

composer require workerman/gatewayclient

使用gatewayclient可以非常方便的和GatewayWorker进行通信

评论