# 序言
**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協議
- 不支持的函數/特性
- 版權信息