## 開發前必讀
使用HHPHP開發應用,你需要了解以下內容:
[TOC]
### 一、Swoole開發與普通PHP開發的不同之處
除了與HTTP協議相關的變量函數無法直接使用外,Swoole開發與普通PHP開發并沒有很大不同。
#### 1、應用層協議不同
普通PHP開發一般是基于HTTP應用層協議,WebServer已經幫開發者完成了協議的解析
Swoole支持各種協議,目前內置了HTTP、WebSocket等協議。WorkerMan推薦開發者使用更簡單的自定義協議通訊
由于非HTTP協議的應用,所以header(),setcookie(),session_start()等函數無法直接使用,需要使用Swoole提供的方法,具體參考高級應用[Swoole官方文檔](https://wiki.swoole.com/)
#### 2、請求周期差異
PHP在Web應用中一次請求過后會釋放所有的變量與資源
Swoole開發的應用程序在第一次載入解析后便常駐內存,使得類的定義、全局對象、類的靜態成員不會釋放,便于后續重復利用
#### 3、注意避免類和常量的重復定義
由于Swoole會緩存編譯后的PHP文件,所以要避免多次require/include相同的類或者常量的定義文件。建議使用require_once/include_once加載文件。
#### 4、注意單例模式的連接資源的釋放
由于Swoole不會在每次請求后釋放全局對象及類的靜態成員,在數據庫等單例模式中,往往會將數據庫實例(內部包含了一個數據庫socket連接)保存在數據庫靜態成員中,使得Swoole在進程生命周期內都復用這個數據庫socket連接。需要注意的是當數據庫服務器發現某個連接在一定時間內沒有活動后可能會主動關閉socket連接,這時再次使用這個數據庫實例時會報錯,(錯誤信息類似mysql gone away)。HHPHP提供了數據庫類,有斷開重連的功能,開發者可以直接使用。
#### 5、注意不要使用exit、die出語句
Swoole運行在PHP命令行模式下,當調用exit、die退出語句時,會導致當前進程退出。雖然子進程退出后會立刻重新創建一個的相同的子進程繼續服務,但是還是可能對業務產生影響。
### 二、需要了解的基本概念
#### 1、TCP傳輸層協議
TCP是一種面向連接的、可靠的、基于IP的傳輸層協議。TCP傳輸層協議一個重要特點是TCP是基于數據流的,客戶端的請求會源源不斷的發送給服務端,服務端收到的數據可能不是一個完整的請求,也有可能是多個請求連在一起。這就需要我們在這源源不斷的數據流中區分每個請求的邊界。而應用層協議主要是為請求邊界定義一套規則,避免請求數據混亂。
#### 2、應用層協議
應用層協議(application layer protocol)定義了運行在不同端系統上(客戶端、服務端)的應用程序進程如何相互傳遞報文,例如HTTP、WebSocket都屬于應用層協議。例如一個簡單的應用層次協議可以如下{"module":"user","action":"getInfo","uid":456}\n"。此協議是以"\n"(注意這里"\n"代表的是回車)標記請求結束,消息體是字符串。
#### 3、短連接
短連接是指通訊雙方有數據交互時,就建立一個連接,數據發送完成后,則斷開此連接,即每次連接只完成一項業務的發送。像WEB網站的HTTP服務一般都用短連接。
#### 4、長連接
長連接,指在一個連接上可以連續發送多個數據包。
注意:長連接應用必須加心跳,否則連接可能由于長時間不活躍而被路由節點防火墻斷開。
長連接多用于操作頻繁,點對點的通訊的情況。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多。所以長連接在每個操作完后都不斷開,下次處理時直接發送數據包就OK了,不用建立TCP連接。例如:數據庫的連接用長連接,如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。
當需要主動向客戶端推送數據時,例如聊天類、即時游戲類、手機推送等應用需要長連接。
#### 5、平滑重啟
一般的重啟的過程是把所有進程全部停止后,再開始創建全新的服務進程。在這個過程中會有一個短暫的時間內是沒有進程對外提供服務的,這就會導致服務暫時不可用,這在高并發時勢必會導致請求失敗。
而平滑重啟則不是一次性的停止所有進程,而是一個進程一個進程的停止,每停止一個進程后馬上重新創建一個新的進程頂替,直到所有舊的進程都被替換為止。
平滑重啟HHPHP可以使用 php your_file.php reload命令,能夠做到在不影響服務質量的情況下更新應用程序。
注意:只有在on{...}回調中載入的文件平滑重啟后才會自動更新,啟動腳本中直接載入的文件或者寫死的代碼運行reload不會自動更新。