使用WorkerMan开发的应用程序不依赖php-fpm、apache、nginx这些容器就可以独立运行。 这使得PHP开发者开发、部署、调试应用程序非常方便。
为了充分发挥服务器多CPU的性能,WorkerMan默认支持多进程多任务。WorkerMan开启一个主进程和多个子进程对外提供服务, 主进程负责监控子进程,子进程独自监听网络连接并接收发送及处理数据,由于进程模型简单,使得WorkerMan更加稳定,更加高效。
WorkerMan支持TCP和UDP两种传输层协议,只需要更改一个属性便可以更换传输层协议,业务代码无需改动。
很多时候需要PHP应用程序要与客户端保持长连接,比如聊天室、游戏等,但是传统的PHP容器(apache、nginx、php-fpm)很难做到这一点。 使用WorkerMan,只要服务端业务不主动调用关闭连接接口,便可以使用PHP长连接。WorkerMan单个进程可以支持上万的并发连接,多进程则支持数十万的甚至百万并发连接。
WorkerMan接口上支持各种应用层协议,包括自定义协议。在WorkerMan中更换协议同样非常简单,同样只是配置一个字段,协议自动切换,业务代码零改动,甚至可以开启多个不同协议的端口,满足不同的客户端需求。
WorkerMan相关应用中已经用到的协议有统计监控系统(HTTP协议、自定义Statistic二进制协议)、 WorkerMan-chat\WorkerMan-Todpole\WorkerMan-Flapyy-Bird(Websocket协议)、WorkerMan-thrift-rcp(Thrift协议)、WorkerMan-json-rpc(自定义json协议)。以上应用中的协议可以拿来直接用, 或者开发者选择使用自己的协议。
WorkerMan支持Libevent事件轮询库(需要安装Libevent扩展), 使用Libevent在高并发时性能非常卓越,如果没有安装Libevent则使用PHP内置的Select相关系统调用,性能也同样非常强悍。
当需要重启服务时(例如发布版本),我们不希望正在处理用户请求的进程被立刻终止,更不希望重启的那一刻导致客户端通讯失败。WorkerMan提供了平滑重启功能,能够保障服务平滑升级,不影响客户端的使用。
在开发过程中,我们希望在我们改动代码后能够立刻生效,以便查看结果。WorkerMan提供了文件检测及自动加载功能,只要文件有更新,WorkerMan会自动运行reload,以便加载新的文件,使之生效。
因为子进程是实际处理用户请求的进程,为了安全考虑,子进程不能有太高的权限,所以WorkerMan支持设置子运行进程运行的用户,使你的服务器更加安全。
WorkerMan在运行过程中只会载入解析一次PHP文件,然后便常驻内存,这使得类及函数声明、PHP执行环境、符号表等不会重复创建销毁,这与Web容器下运行的PHP机制是完全不同的。在WorkerMan中,一个进程生命周期内静态成员或者全局变量在不主动销毁的情况下是永久保持的,也就是将对象或者链接等资源放到全局变量或者类静态成员中则整个进程生命周期内的所有请求都可以复用。例如只要单个进程内初始化一次数据库连接,则以后这个进程的所有请求都可以复用这个数据库连接,避免了频繁连接数据库过程中TCP三次握手、 数据库权限验证、断开连接时TCP四次握手的过程,极大的提高了应用程序效率。
由于php文件从磁盘读取解析一次后便会常驻内存,下次使用时直接使用内存中的opcode, 极大的减少了磁盘IO及PHP中请求初始化、创建执行环境、词法解析、语法解析、编译opcode、请求关闭等诸多耗时过程, 并且不依赖nginx、apache等容器,少了nginx等容器与PHP通信的开销,最主要的是资源可以永久保持,不必每次初始化数据库连接等等, 所以使用WorkerMan开发应用程序,性能非常高。
支持在HHVM虚拟机上运行,可成倍提升PHP性能。尤其是在cpu密集运算业务中,性能非常优异。通过实际压力测试对比,在没有负载业务的情况下,WorkerMan在HHVM下运行比在Zend PHP5.6运行网络吞吐量提高了30-80%左右