# 序言
**Workerman,让你看到PHP不为人知的一面。**
## Workerman是什么?
Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架。
Workerman不是重复造轮子,它不是一个MVC框架,而是一个更底层更通用的socket服务框架,你可以用它开发tcp代理、梯子代理、做游戏服务器、邮件服务器、ftp服务器、甚至开发一个php版本的redis、php版本的数据库、php版本的nginx、php版本的php-fpm等等。Workerman可以说是PHP领域的一次创新,让开发者彻底摆脱了PHP只能做WEB的束缚。
实际上Workerman类似一个PHP版本的nginx,核心也是多进程+Epoll+非阻塞IO。Workerman每个进程能维持上万并发链接。由于本身常住内存,不依赖Apache、nginx、php-fpm这些容器,拥有超高的性能。同时支持TCP、UDP、UNIXSOCKET,支持长链接,支持Websocket、HTTP、WSS、HTTPS等通讯协以及各种自定义协议。拥有定时器、异步socket客户端、异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件。
## Workerman的一些应用方向
Workerman不同于传统MVC框架,Workerman不仅可以用于Web开发,同时还有更广阔的应用领域,例如即时通讯类、物联网、游戏、服务治理、其它服务器或者中间件,这无疑大大提高了PHP开发者的视野。目前这些领域的PHP开发者奇缺,如果想在PHP领域有自己的技术优势,不满足于每天的增删改查工作,或者想向架构师方向或者技术大牛的方向发展,Workerman都是非值得学习的框架。建议开发者不仅会用,而且能基于Workerman开发出属于自己的开源项目,提升技能增加自己的影响力,比如[Beanbun多进程网络爬虫框架](https://github.com/kiddyuchina/Beanbun)就是一个很好的例子,刚刚上线不久就获得众多好评。
Workerman的一些应用方向如下:
1、即时通讯类
例如网页即时聊天、即时消息推送、微信小程序、手机app消息推送、PC软件消息推送等等
\[\[示例 workerman-chat聊天室\](http://www.workerman.net/workerman-chat) 、 \[web消息推送\](http://www.workerman.net/web-sender) 、 \[小蝌蚪聊天室\](http://www.workerman.net/workerman-todpole)\]
2、物联网类
例如Workerman与打印机通讯、与单片机通讯、智能手环、智能家居、共享单车等等。
\[客户案例如 易联云、易泊时代等\]
3、游戏服务器类
例如棋牌游戏、MMORPG游戏等等。\[\[示例 browserquest-php\](http://www.workerman.net/browserquest)\]
4、SOA服务化
利用Workerman将现有业务不同功能单元封装起来,以服务的形式对外提供统一的接口,达到系统松耦合、易维护、高可用、易伸缩。\[\[示例 workerman-json-rpc\](http://www.workerman.net/workerman-jsonrpc)、 \[workerman-thrift\](http://www.workerman.net/workerman-thrift)\]
5、其它服务器软件
例如 [GatewayWorker](http://doc2.workerman.net),[PHPSocket.IO](http://www.workerman.net/phpsocket_io),[http代理](https://github.com/walkor/php-http-proxy),[sock5代理](https://github.com/walkor/php-socks5),[分布式通讯组件](https://github.com/walkor/Channel),[分布式变量共享组件](https://github.com/walkor/GlobalData),[消息队列](https://github.com/walkor/workerman-queue)、DNS服务器、WebServer、CDN服务器、FTP服务器等等
6、中间件
例如 [异步MySQL组件](315213),[异步redis组件](315215),[异步http组件](315217),[异步消息队列组件](315219),[异步dns组件](315930),[文件监控组件](315203),还有很多第三方开发的组件框架等等
显然传统的mvc框架很难实现以上的功能,所以也就是workerman诞生的原因。
## Workerman理念
极简、稳定、高性能、分布式。
### **极简**
小即是美,Workerman内核极简,仅有几个php文件并且只暴露几个接口,学习起来非常简单。所有其它功能通过组件的方式扩展。
Workerman拥有完善的文档+权威的主页+活跃的社区+数个千人QQ群+众多的高性能组件+N多的例子,这一切都让开发者使用起来更得心应手。
### **稳定**
Workerman已经开源数年,被很多上市公司大规模使用,超级稳定。有些服务2年多没重启过仍然在飞速运行。没有coredump、没有内存泄漏、没有bug。
### **高性能**
Workerman因为常住内存,本身不依赖apache/nginx/php-fpm,没有容器到PHP的通讯开销,没有每个请求初始化一切又销毁一切的开销,具有超高的性能,比起传统的MVC框架,性能要高数十倍,PHP7下通过ab压力测试QPS甚至高于单独的nginx。
### **分布式**
现在早已经不是单枪匹马的时代了,单台服务器性能再强悍也有极限,分布式多服务器部署才是王道。Workerman直接提供了一套长链接分布式通讯方案[GatewayWorker框架](http://doc2.workerman.net),加服务器只需要简单配置下然后启动即可,业务代码零更改,系统承载能力成倍增加。如果你是开发TCP长链接应用,建议直接用[GatewayWorker](http://doc2.workerman.net),它是对Workerman的一个包装,针对长链接应用提供了更丰富的接口以及强悍的分布式处理能力。
## 本手册作用范围
WorkerMan有分为Linux版本[WorkerMan](https://github.com/walkor/workerman)和Windows版本[WorkerMan-for-win](https://github.com/walkor/workerman-for-win),windows版本说明参见[这里](http://www.workerman.net/windows)。Linux版本可用于开发调试及正式环境部署,而由于PHP-CLI在windows系统无法实现多进程以及守护进程,所以windows版本Workerman建议仅作开发调试使用。
注意:Windows版本WorkerMan无法在Linux平台使用,同时Linux版本WorkerMan也无法在Windows平台使用。
## windows用户(必读)
windows用户需要使用windows版本的workerman,windows版本workerman本身**不依赖任何扩展**,只需要配置好PHP环境变量即可,**windows版本workerman安装及注意事项参见[windows用户必看](http://www.workerman.net/windows)。**
## 客户端
WorkerMan的通信协议是开放的,又是可定制的,因此,理论上WorkerMan可以与使用任意协议的任意平台的客户端进行通信。当用户开发客户端时,可以根据相应的通信协议完成与服务端的通信。
- 序言
- 原理
- 开发必读
- 入门指引
- 特性
- 简单的开发示例
- 安装
- 环境要求
- 下载安装
- 启动停止
- 开发流程
- 开发前必读
- 目录结构
- 开发规范
- 基本流程
- 通讯协议
- 通讯协议作用
- 定制通讯协议
- 一些例子
- Worker类
- 构造函数
- 属性
- id
- count
- name
- protocol
- transport
- reusePort
- connections
- stdoutFile
- pidFile
- logFile
- user
- reloadable
- daemonize
- globalEvent
- 回调属性
- onWorkerStart
- onWorkerReload
- onConnect
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- runAll
- stopAll
- listen
- TcpConnection类
- 属性
- id
- protocol
- worker
- maxSendBufferSize
- defaultMaxSendBufferSize
- maxPackageSize
- 回调属性
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- send
- getRemoteIp
- getRemotePort
- close
- destroy
- pauseRecv
- resumeRecv
- pipe
- AsyncTcpConnection类
- 构造函数
- connect
- reconnect
- transport
- Timer定时器类
- add
- del
- 定时器注意事项
- WebServer
- 调试
- 基本调试
- 查看运行状态
- 网络抓包
- 跟踪系统调用
- 常用组件
- GlobalData数据共享组件
- GlobalDataServer
- GlobalDataClient
- Channel分布式通讯组件
- ChannelServer
- channelClient
- 例子-集群推送
- 例子-分组发送
- FileMonitor文件监控组件
- MySQL组件
- workerman/mysql
- swoole/mysql(异步)
- redis组件
- swoole/redis
- 异步http组件
- swoole/http-client
- 异步消息队列组件
- react/zmq
- react/stomp
- 异步dns组件
- swoole/dns
- 常见问题
- 心跳
- 客户端链接失败原因
- 是否支持多线程
- 与其它框架整合
- 运行多个workerman
- 支持哪些协议
- 如何设置进程数
- 查看客户端连接数
- 对象和资源的持久化
- 例子无法工作
- 启动失败
- 停止失败
- 支持多少并发
- 更改代码不生效
- 向指定客户端发送数据
- 如何主动推送消息
- 在其它项目中推送
- 如何实现异步任务
- status里send_fail的原因
- Windows下开发Linux下部署
- 是否支持socket.io
- 终端关闭导致workerman关闭
- 与nginx apache的关系
- 禁用函数检查
- 平滑重启原理
- 为Flash开843端口
- 如何广播数据
- 如何建立udp服务
- 监听ipv6
- 关闭未认证的链接
- 传输加密-ssl/tsl
- 创建wss服务
- 创建https服务
- workerman作为客户端
- 作为ws/wss客户端
- PHP的几种回调写法
- 附录
- Linux内核调优
- 压力测试
- 安装扩展
- websocket协议
- ws协议
- text协议
- frame协议
- 不支持的函数/特性
- 版权信息