在PHP中,有两大利器可以办理这些问题,即是Workerman和Swoole。
Workermanworkerman是一个高性能的PHP socket 做事器框架,workerman基于PHP多进程以及libevent事宜轮询库,PHP开拓者只要实现一两个接口,便可以开拓出自己的网络运用,例如Rpc做事、谈天室做事器、手机游戏做事器等。
workerman的目标是让PHP开拓者更随意马虎的开拓出基于socket的高性能的运用做事,而不用去理解PHP socket以及PHP多进程细节。 workerman本身是一个PHP多进程做事器框架,具有PHP进程管理以及socket通信的模块,以是不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。
1、环境哀求
Windows用户
Windows用户只能利用windows版本的Workerman(Workerman-for-win)。
1、须要PHP>=5.3.3,并配置好PHP的环境变量。
2、Windows版本的Workerman不依赖任何扩展。
3、安装利用以及把稳事变拜会这里。
====本页面以下只适用于Linux用户,Windows用户请忽略。 ====
Linux用户(含Mac OS)
Linux用户只能利用Linux版本的Workerman。
1、安装PHP>=5.3.3,并安装了pcntl、posix扩展
2、建议安装event或者libevent扩展,但不是必须的(把稳event扩展须要PHP>=5.4)
Linux环境检讨脚本
Linux用户可以运行以下脚本检讨本地环境是否知足WorkerMan哀求
curl -Ss http://www.workerman.net/check.php | php
如果脚本中全部提示ok,则代表知足WorkerMan运行环境
(把稳:检测脚本中没有检测event扩展或者libevent扩展,如果并发连接数大于1024建议安装event扩展或者libevent扩展,安装方法拜会下一节)
关于WorkerMan依赖的扩展
1、pcntl扩展
pcntl扩展是PHP在Linux环境下进程掌握的主要扩展,WorkerMan用到了其进程创建、旗子暗记掌握、定时器、进程状态监控等特性。此扩展win平台不支持。
2、posix扩展
posix扩展使得PHP在Linux环境可以调用系统通过POSIX标准供应的接口。WorkerMan紧张利用了其干系的接口实现了守护进程化、用户组掌握等功能。此扩展win平台不支持。
3、libevent扩展 或者 Event扩展
libevent扩展(或者event扩展)使得PHP可以利用系统Epoll、Kqueue等高等事宜处理机制,能够显著提高WorkerMan在高并发连接时CPU利用率。在高并发长连接干系运用中非常主要。libevent扩展(或者event扩展)不是必须的,如果没安装,则默认利用PHP原生Select事宜处理机制。
2、安装
和nginx+PHP-FPM下的PHP运用程序一样,WorkerMan中的运用程序也须要一个入口文件,入口文件名没有哀求,并且这个入口文件因此PHP Cli办法运行的。
1、任意位置建立项目目录
如 SimpleChat/
2、引入Workerman/Autoloader.php
3、选定协议
这里我们选定Text文本协议(WorkerMan中自定义的一个协议,格式为文本+换行)
(目前WorkerMan支持HTTP、Websocket、Text文本协议,如果须要利用其它协议,请参照协议一章开拓自己的协议)
4、根据须要写入口启动脚本
如下:
示例代码
3、实用案例
实例一、利用HTTP协议对外供应Web做事
示例代码
实例二、利用WebSocket协议对外供应做事
做事器端
浏览器客户端
实例三、直策应用TCP传输数据
示例代码
实例四、定时器
示例代码
实例5、异步任务
任务进程做事端
异步任务客户端
把稳:
workerman不依赖apache或者nginx,只要PHP环境OK workerman就可以运行
workerman是命令行启动的,启动办法类似apache利用命令启动(一样平常网页空间无法利用workerman)
长连接必须加心跳,长连接永劫光不通讯肯定会被防火墙干掉而断开
客户端和做事端协议一定要对应才能通讯,不要考试测验在浏览器地址栏访问websocket协议端口,不要考试测验用webscoket协议访问裸tcp协议端口,协议一定要对应
不要利用exit die语句,否则进程会退出,并显示WORKER EXIT UNEXPECTED缺点。当然,进程退出了会急速重启一个新的进程连续做事。如果须要返回,可以调用return
改代码要重启,workerman是常驻内存的框架,改代码要重启workerman才能看到新代码的效果
Worker::runAll()实行后将永久壅塞,也便是说位于Worker::runAll()后面的代码将不会被实行。所有Worker实例化该当都在Worker::runAll()提高行。
workerman官网:http://www.workerman.net
SwooleSwoole使 PHP 开拓职员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 做事。Swoole 可以广泛运用于互联网、移动通信、企业软件、云打算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 利用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升,更加专注于开拓创新产品。
1、环境哀求
仅支持 Linux,FreeBSD,MacOS,3类操作系统
Linux 内核版本 2.3.32 以上
PHP-5.3.10 以上版本,包括PHP7
gcc4.4 以上版本或者clang
cmake2.4+,编译为 libswoole.so 作为 C/C++ 库时须要利用 cmake
建议利用 Ubuntu14、CentOS7 或更高版本的操作系统
2、编译安装
Swoole扩展是按照PHP标准扩展构建的。利用phpize来天生编译检测脚本,./configure来做编译配置检测,make进行编译,make install进行安装。请下载releases版本的swoole,直接从github主干上拉取最新代码可能会编译不过。如果当前用户不是root,可能没有PHP安装目录的写权限,安装时须要sudo或者su。如果是在git分支上直接git pull更新代码,重新编译前务必要实行make clean
下载地址:
https://github.com/swoole/swoole-src/releases
http://pecl.php.net/package/swoole
http://git.oschina.net/swoole/swoole
下载源代码包后,在终端进入源码目录,实行下面的命令进行编译和安装
编译安装成功后,修正php.ini加入
extension=swoole.so
通过php -m或phpinfo()来查看是否成功加载了swoole,如果没有可能是php.ini的路径不对,可以利用php -i |grep php.ini来定位到php.ini的绝对路径。
3、实用案例
案例一、创建TCP做事器
示例代码
案例二、创建Web做事器
Http做事器只须要关注要求相应即可,以是只须要监听一个onRequest事宜。当有新的Http要求进入就会触发此事宜。事宜回调函数有2个参数,一个是$request工具,包含了要求的干系信息,如GET/POST要求的数据。
示例代码
案例三、创建WebSocket做事器
WebSocket做事器是建立在Http做事器之上的长连接做事器,客户端首先会发送一个Http的要求与做事器进行握手。握手成功后会触发onOpen事宜,表示连接已就绪,onOpen函数中可以得到$request工具,包含了Http握手的干系信息,如GET参数、Cookie、Http头信息等。
示例代码
案例四、设置定时器
swoole供应了类似JavaScript的setInterval/setTimeout异步高精度定时器,粒度为毫秒级。利用也非常大略。
示例代码
案例五、实行异步任务
在Server程序中如果须要实行很耗时的操作,比如一个谈天做事器发送广播,Web做事器中发送邮件。如果直接去实行这些函数就会壅塞当提高程,导致做事器相应变慢。
Swoole供应了异步任务处理的功能,可以投递一个异步任务到TaskWorker进程池中实行,不影响当前要求的处理速率。
示例代码
把稳:
不要在代码中实行sleep以及其他就寝函数,这样会导致全体进程壅塞
exit/die是危险的,会导致worker进程退出
可通过register_shutdown_function来捕获致命缺点,在进程非常退出时做一些清理事情
PHP代码中如果有非常抛出,必须在回调函数中进行try/catch捕获非常,否则会导致事情进程退出
swoole不支持set_exception_handler,必须利用try/catch办法处理非常
Worker进程不得共用同一个Redis或MySQL等网络做事客户端,Redis/MySQL创建连接的干系代码可以放到onWorkerStart回调函数中
异步程序哀求代码中不得包含任何同步壅塞操作
异步与同步代码不能混用,一旦运用程序利用了任何同步壅塞的代码,程序即退化为同步模式
由于swoole是常驻内存的,以是加载类/函数定义的文件后不会开释。因此引入类/函数的php文件时必须要利用include_once或require_once,否会发生cannot redeclare function/class 的致命缺点。
PHP守护进程与普通Web程序的变量生命周期、内存管理办法完备不同。请参考 swoole_server内存管理 页面。编写swoole_server或其他常驻进程时须要特殊把稳。
进程隔离也是很多新手常常碰着的问题。修正了全局变量的值,为什么不生效,缘故原由便是全局变量在不同的进程,内存空间是隔离的,以是无效。以是利用swoole开拓Server程序须要理解进程隔离问题。
swoole官网:https://www.swoole.com
Workerman和Swooleworkerman和swoole都是办理PHP繁芜问题的利器,workerman是纯PHP开拓的,而swoole是C措辞开拓的,以是在性能方面,如内存管理、数据构造、通信协议解析,swoole强于workerman。
外部依赖上workerman须要依赖很多额外的第三方PHP扩展来实现,局限性比较大,这些扩展并非是PHP官方掩护的,掩护性方面良莠不齐,而Swoole基本上无依赖,底层的代码全部可控。
功能上swoole供应的高等特性很多,比如SSL/TLS隧道加密、http2.0、异步mysql驱动、异步redis驱动、异步的http/websocket客户端、process、lock、atomic、table。其余Swoole 2.0内置了PHP原生协程的支持,PHP代码也可以利用类似于Go措辞的协程来实现高并发的网络做事器。