swoole進程關(guān)系梳理

基于上一篇文章swoole+tp5異步多線程梅桩,發(fā)現(xiàn)很多問題讯私,所以深入理解一下swoole的進程模型

想探討一下swoole缀皱,swoole在大流量生產(chǎn)環(huán)境下需要哪些特別注意的地方, 求指導晒奕,聯(lián)系我就可以

運行環(huán)境linux? 服務(wù)開啟命令? php think Tcp

namespace app\swoole\command;

use app\common\cache\Redis;

use think\console\Command;

use think\console\Input;

use think\console\Output;

use think\Db;

use think\Log;

class Tcp extends Command{

TP5命令行使用方法闻书,手冊可以查到,原理是加載文件并執(zhí)行文件

? ? protected function configure(){

? ? ? ? $this->setName('Tcp')->setDescription('OK ');

? ? }

? ? public function execute(Input $input, Output $output){

參數(shù)配置

? ? ? ? $serv = new \swoole_server("0.0.0.0", 9501);

? ? ? ? $serv->set([

? ? ? ? ? ? 'reactor_num' => 1,//同服務(wù)器核心數(shù)

? ? ? ? ? ? 'worker_num' => 2,//同服務(wù)器核心數(shù)或1--4倍服務(wù)器核心數(shù)

? ? ? ? ? ? 'task_worker_num' => 4,//當task繁忙導致server沒有響應(yīng)請求時脑慧,可以適當增加num魄眉,具體根據(jù)官方文檔和試運行情況修改

? ? ? ? ? ? 'backlog' => 128,

? ? ? ? ? ? 'daemonize' => 0,//加入此參數(shù)后,執(zhí)行php server.php將轉(zhuǎn)入后臺作為守護進程運行

? ? ? ? ? ? 'max_conn' => 10000,//此參數(shù)用來設(shè)置Server最大允許維持多少個tcp連接闷袒。超過此數(shù)量后坑律,新進入的連接將被拒絕囊骤。

? ? ? ? ? ? 'max_request' => 2000,//此參數(shù)表示worker進程在處理完n次請求后結(jié)束運行。manager會重新創(chuàng)建一個worker進程也物。此選項用來防止worker進程內(nèi)存溢出宫屠。

//? ? ? ? ? 'log_file' => '/data/log/Swoole.log',//指定swoole錯誤日志文件滑蚯。在swoole運行期發(fā)生的異常信息會記錄到這個文件中抵栈。默>認會打印到屏幕。

? ? ? ? ? ? 'heartbeat_check_interval' => 30,//每隔多少秒檢測一次坤次,單位秒,Swoole會輪詢所有TCP連接缰猴,將超過心跳時間的連接關(guān)閉掉

? ? ? ? ? ? 'heartbeat_idle_time' => 60,//TCP連接的最大閑置時間,單位s , 如果某fd最后一次發(fā)包距離現(xiàn)在的時間超過? ? heartbeat_idle_time必須大于或等于heartbeat_check_interval

? ? ? ? ? ? 'task_max_request' => 100,//設(shè)置task進程的最大任務(wù)數(shù)滑绒。一個task進程在處理完超過此數(shù)值的任務(wù)后將自動退出闷堡。這個參數(shù)是為了防止PHP進程內(nèi)存溢出。如果不希望進程自動退出可以設(shè)置為0蹬挤。

? ? ? ? ? ? 'open_cpu_affinity' => 1,//啟用CPU親和性設(shè)置缚窿。在多核的硬件平臺中棘幸,啟用此特性會將swoole的reactor線程/worker進程綁定到固定的一個核上焰扳。可以避免進程/線程的運行時在多個核之間互相切換误续,提高CPU Cache的命中率吨悍。

? ? ? ? ]);

常用方法的回調(diào)函數(shù)

? ? ? ? $serv->on('start', function ($serv){

? ? ? ? ? ? $this->timter();

? ? ? ? ? ? echo "第一步master進程被拉起\n";

? ? ? ? });

注意:如果manager進程和worker進程存在多個,請不要在manager和worker進程中開啟全局任務(wù)

? ? ? ? $serv->on('ManagerStart', function ($serv){

? ? ? ? ? ? echo "第二步指定數(shù)目的調(diào)度reactor進程被拉起\n";

? ? ? ? });

? ? ? ? $serv->on('WorkerStart', function ($serv){

? ? ? ? ? ? echo "第三步指定數(shù)目的worker進程被拉起\n";

? ? ? ? });

? ? ? ? $serv->on('WorkerStop', function (){

? ? ? ? ? ? echo "第四步指定數(shù)目的worker進程被kill\n";

? ? ? ? });

? ? ? ? $serv->on('ManagerStop', function (){

? ? ? ? ? ? echo "第五步指定數(shù)目的reactor進程被kill\n";

? ? ? ? });

? ? ? ? $serv->on('shutdown', function (){

? ? ? ? ? ? echo "第六步master進程被kill\n";

? ? ? ? });

? ? ? ? $serv->on('receive', function($serv, $fd, $from_id, $data) {

? ? ? ? ? ? if(intval($data) == '9501'){

? ? ? ? ? ? ? ? $serv->reload();//觸發(fā)worker進程的stop方法

//? ? ? ? ? ? ? ? $serv->shutdown();//觸發(fā)所有進程的stop及shutdown方法

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? ? ? //投遞異步任務(wù)

? ? ? ? ? ? $task_id = $serv->task($data);

? ? ? ? ? ? echo "任務(wù)".$task_id."開始\n";

? ? ? ? });

? ? ? ? //模擬處理異步任務(wù)

? ? ? ? $serv->on('task', function ($serv, $task_id, $from_id, $data) {

? ? ? ? ? ? $begin = intval($data);

? ? ? ? ? ? $insertAll = [];

? ? ? ? ? ? for ($i = $begin; $i < $begin+20000; $i++){

? ? ? ? ? ? ? ? $insert = array();

? ? ? ? ? ? ? ? $insert['value'] = $i.mt_rand($i, $i+1000);

? ? ? ? ? ? ? ? $insert['addtime'] = time();

? ? ? ? ? ? ? ? $insert['from_id'] = $from_id;

? ? ? ? ? ? ? ? $insert['task_id'] = $task_id;

? ? ? ? ? ? ? ? $insertAll[] = $insert;

//? ? ? ? ? ? ? ? Db::table('test')->insert($insert);

? ? ? ? ? ? }

? ? ? ? ? ? Db::table('test')->insertAll($insertAll);

? ? ? ? ? ? //返回任務(wù)執(zhí)行的結(jié)果

? ? ? ? ? ? unset($insertAll);

? ? ? ? ? ? $serv->finish("ID".$task_id);

? ? ? ? });

? ? ? ? //處理異步任務(wù)的結(jié)果

? ? ? ? $serv->on('finish', function ($serv, $task_id, $data) {

? ? ? ? ? ? echo "任務(wù)".$data."結(jié)束\n";

? ? ? ? });

? ? ? ? $serv->start();

? ? }

定時器調(diào)用方法

? ? private function timter(){

? ? ? ? \swoole_timer_tick(3000, function () {

? ? ? ? ? ? //30S一次

? ? ? ? ? ? echo 1;

? ? ? ? ? ? $this->checkPort();

? ? ? ? });

? ? }

監(jiān)聽系統(tǒng)服務(wù)php-fpm/nginx/swoole

? ? private function checkPort(){

? ? ? ? $res = exec('netstat -apn | grep 9501');

? ? ? ? if(!$res){

? ? ? ? ? ? Log::write(time().'|9501|swooleStop');

? ? ? ? ? ? $this->sendEmail();

? ? ? ? }

? ? ? ? $res = exec('netstat -apn | grep 9000');

? ? ? ? if(!$res){

? ? ? ? ? ? Log::write(time().'|9000|fpmStop');

? ? ? ? ? ? $this->sendEmail();

? ? ? ? }

? ? ? ? $res = exec('netstat -apn | grep 80');

? ? ? ? if(!$res){

? ? ? ? ? ? Log::write(time().'|80|nginxStop');

? ? ? ? ? ? $this->sendEmail();

? ? ? ? }

}

郵件提醒

? ? private function sendEmail(){

? ? ? ? $email='xbc@gmail.com';

? ? ? ? $subject='線上提醒';

? ? ? ? $content='服務(wù)器出現(xiàn)問題請及時處理';

? ? ? ? send_email($email,$subject,$content);

? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹋嵌,一起剝皮案震驚了整個濱河市育瓜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌栽烂,老刑警劉巖躏仇,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腺办,居然都是意外死亡焰手,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門怀喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來书妻,“玉大人,你說我怎么就攤上這事躬拢《懵模” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵聊闯,是天一觀的道長工猜。 經(jīng)常有香客問我,道長菱蔬,這世上最難降的妖魔是什么篷帅? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上犹褒,老公的妹妹穿的比我還像新娘抵窒。我一直安慰自己,他們只是感情好叠骑,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布李皇。 她就那樣靜靜地躺著,像睡著了一般宙枷。 火紅的嫁衣襯著肌膚如雪掉房。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天慰丛,我揣著相機與錄音卓囚,去河邊找鬼。 笑死诅病,一個胖子當著我的面吹牛哪亿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贤笆,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蝇棉,長吁一口氣:“原來是場噩夢啊……” “哼芥永!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起埋涧,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤棘催,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后巧鸭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡呀袱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年郑叠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乡革。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡摊腋,死狀恐怖嘁傀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情细办,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布岛啸,位于F島的核電站茴肥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瓤狐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一芬首、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郁稍,春花似錦耀怜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至系洛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間描扯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工绽诚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杭煎,地道東北人卒落。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像犀勒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贾费,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349