国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

開發(fā)前必讀

使用Workerman開發(fā)應用,你需要了解以下內容:

一、Workerman開發(fā)與普通PHP開發(fā)的不同之處

除了與HTTP協(xié)議相關的變量函數(shù)無法直接使用外,Workerman開發(fā)與普通PHP開發(fā)并沒有很大不同。

1、應用層協(xié)議不同

  • 普通PHP開發(fā)一般是基于HTTP應用層協(xié)議,WebServer已經(jīng)幫開發(fā)者完成了協(xié)議的解析
  • Workerman支持各種協(xié)議,目前內置了HTTP、WebSocket等協(xié)議。Workerman推薦開發(fā)者使用更簡單的自定義協(xié)議通訊

2、請求周期差異

  • PHP在Web應用中一次請求過后會釋放所有的變量與資源
  • Workerman開發(fā)的應用程序在第一次載入解析后便常駐內存,使得類的定義、全局對象、類的靜態(tài)成員不會釋放,便于后續(xù)重復利用

3、注意避免類和常量的重復定義

  • 由于Workerman會緩存編譯后的PHP文件,所以要避免多次require/include相同的類或者常量的定義文件。建議使用require_once/include_once加載文件。

4、注意單例模式的連接資源的釋放

  • 由于Workerman不會在每次請求后釋放全局對象及類的靜態(tài)成員,在數(shù)據(jù)庫等單例模式中,往往會將數(shù)據(jù)庫實例(內部包含了一個數(shù)據(jù)庫socket連接)保存在數(shù)據(jù)庫靜態(tài)成員中,使得Workerman在進程生命周期內都復用這個數(shù)據(jù)庫socket連接。需要注意的是當數(shù)據(jù)庫服務器發(fā)現(xiàn)某個連接在一定時間內沒有活動后可能會主動關閉socket連接,這時再次使用這個數(shù)據(jù)庫實例時會報錯,(錯誤信息類似mysql gone away)。Workerman提供了數(shù)據(jù)庫類,有斷開重連的功能,開發(fā)者可以直接使用。

5、注意不要使用exit、die出語句

  • Workerman運行在PHP命令行模式下,當調用exit、die退出語句時,會導致當前進程退出。雖然子進程退出后會立刻重新創(chuàng)建一個的相同的子進程繼續(xù)服務,但是還是可能對業(yè)務產(chǎn)生影響。

6、改完代碼需要重啟服務才能生效

由于Workerman是常駐內存的,php類即函數(shù)的定義加載一次后便常駐內存,不會再次讀取磁盤加載,所以每次修改完業(yè)務代碼需要重啟才能生效。

二、需要了解的基本概念

1、TCP傳輸層協(xié)議

TCP是一種面向連接的、可靠的、基于IP的傳輸層協(xié)議。TCP傳輸層協(xié)議一個重要特點是TCP是基于數(shù)據(jù)流的,客戶端的請求會源源不斷的發(fā)送給服務端,服務端收到的數(shù)據(jù)可能不是一個完整的請求,也有可能是多個請求連在一起。這就需要我們在這源源不斷的數(shù)據(jù)流中區(qū)分每個請求的邊界。而應用層協(xié)議主要是為請求邊界定義一套規(guī)則,避免請求數(shù)據(jù)混亂。

2、應用層協(xié)議

應用層協(xié)議(application layer protocol)定義了運行在不同端系統(tǒng)上(客戶端、服務端)的應用程序進程如何相互傳遞報文,例如HTTP、WebSocket都屬于應用層協(xié)議。例如一個簡單的應用層次協(xié)議可以如下{"module":"user","action":"getInfo","uid":456}\n"。此協(xié)議是以"\n"(注意這里"\n"代表的是回車)標記請求結束,消息體是字符串。

3、短連接

短連接是指通訊雙方有數(shù)據(jù)交互時,就建立一個連接,數(shù)據(jù)發(fā)送完成后,則斷開此連接,即每次連接只完成一項業(yè)務的發(fā)送。像WEB網(wǎng)站的HTTP服務一般都用短連接。

短連接應用程序開發(fā)可以參考基本開發(fā)流程一章

4、長連接

長連接,指在一個連接上可以連續(xù)發(fā)送多個數(shù)據(jù)包。

注意:長連接應用必須加心跳,否則連接可能由于長時間不活躍而被路由節(jié)點防火墻斷開。

長連接多用于操作頻繁,點對點的通訊的情況。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多。所以長連接在每個操作完后都不斷開,下次處理時直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。例如:數(shù)據(jù)庫的連接用長連接,如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創(chuàng)建也是對資源的浪費。

當需要主動向客戶端推送數(shù)據(jù)時,例如聊天類、即時游戲類、手機推送等應用需要長連接。
長連接應用程序開發(fā)可以參考Gateway/Worker開發(fā)流程

5、平滑重啟

一般的重啟的過程是把所有進程全部停止后,再開始創(chuàng)建全新的服務進程。在這個過程中會有一個短暫的時間內是沒有進程對外提供服務的,這就會導致服務暫時不可用,這在高并發(fā)時勢必會導致請求失敗。

而平滑重啟則不是一次性的停止所有進程,而是一個進程一個進程的停止,每停止一個進程后馬上重新創(chuàng)建一個新的進程頂替,直到所有舊的進程都被替換為止。

平滑重啟Workerman可以使用 php your_file.php reload命令,能夠做到在不影響服務質量的情況下更新應用程序。

注意:只有在on{...}回調中載入的文件平滑重啟后才會自動更新,啟動腳本中直接載入的文件或者寫死的代碼運行reload不會自動更新。

三、區(qū)分主進程和子進程

有必要注意下代碼是運行在主進程還是子進程,一般來說在Worker::runAll();調用前運行的代碼都是在主進程運行的,onXXX回調運行的代碼都屬于子進程。注意寫在Worker::runAll();后面的代碼永遠不會被執(zhí)行。

例如下面的代碼

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// 運行在主進程
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// 賦值過程運行在主進程
$tcp_worker->onMessage = function(TcpConnection $connection, $data)
{
    // 這部分運行在子進程
    $connection->send('hello ' . $data);
};

Worker::runAll();

注意: 不要在主進程中初始化數(shù)據(jù)庫、memcache、redis等連接資源,因為主進程初始化的連接可能會被子進程自動繼承(尤其是使用單例的時候),所有進程都持有同一個連接,服務端通過這個連接返回的數(shù)據(jù)在多個進程上都可讀,會導致數(shù)據(jù)錯亂。同樣的,如果任何一個進程關閉連接(例如daemon模式運行時主進程會退出導致連接關閉),都導致所有子進程的連接都被一起關閉,并發(fā)生不可預知的錯誤,例如mysql gone away 錯誤。

推薦在onWorkerStart里面初始化連接資源。

編輯于2024-03-13 17:37:18 完善本頁 +發(fā)起討論
贊助商