在PHP中,有两大利器可以办理这些问题,即是Workerman和Swoole。

Workerman

workerman是一个高性能的PHP socket 做事器框架,workerman基于PHP多进程以及libevent事宜轮询库,PHP开拓者只要实现一两个接口,便可以开拓出自己的网络运用,例如Rpc做事、谈天室做事器、手机游戏做事器等。

workerman的目标是让PHP开拓者更随意马虎的开拓出基于socket的高性能的运用做事,而不用去理解PHP socket以及PHP多进程细节。
workerman本身是一个PHP多进程做事器框架,具有PHP进程管理以及socket通信的模块,以是不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。

php54forlinux办事器解决PHP高等问题的两年夜利器 Docker

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

Swoole

Swoole使 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和Swoole

workerman和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措辞的协程来实现高并发的网络做事器。