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

開發(fā)前必讀

使用Workerman開發(fā)應(yīng)用,你需要了解以下內(nèi)容:

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

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

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

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

2、請(qǐng)求周期差異

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

3、注意避免類和常量的重復(fù)定義

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

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

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

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

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

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

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

二、需要了解的基本概念

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

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

2、應(yīng)用層協(xié)議

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

3、短連接

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

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

4、長連接

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

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

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

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

5、平滑重啟

一般的重啟的過程是把所有進(jìn)程全部停止后,再開始創(chuàng)建全新的服務(wù)進(jìn)程。在這個(gè)過程中會(huì)有一個(gè)短暫的時(shí)間內(nèi)是沒有進(jìn)程對(duì)外提供服務(wù)的,這就會(huì)導(dǎo)致服務(wù)暫時(shí)不可用,這在高并發(fā)時(shí)勢必會(huì)導(dǎo)致請(qǐng)求失敗。

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

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

注意:只有在on{...}回調(diào)中載入的文件平滑重啟后才會(huì)自動(dòng)更新,啟動(dòng)腳本中直接載入的文件或者寫死的代碼運(yùn)行reload不會(huì)自動(dòng)更新。

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

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

例如下面的代碼

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

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

Worker::runAll();

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

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

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