成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Swoole筆記(二)

jsummer / 596人閱讀

摘要:配置了參數(shù)后將會(huì)啟用功能,務(wù)必要注冊(cè)個(gè)事件回調(diào)函數(shù)。周期性定時(shí)器一次性定時(shí)器清除定時(shí)器定時(shí)器回調(diào)函數(shù)注意最大不得超過(guò)。進(jìn)程中不能添加定時(shí)器。建議在回調(diào)里寫(xiě)定時(shí)器。定時(shí)器示例防止重復(fù)每隔觸發(fā)一次后執(zhí)行此函數(shù)

本文示例代碼詳見(jiàn):https://github.com/52fhy/swoo...。

重新打開(kāi)日志

在1.8.11及之后版本支持重新打開(kāi)日志:向Server主進(jìn)程發(fā)送SIGRTMIN信號(hào)。假設(shè)主進(jìn)程id是3427,那么我們可以:

kill -34 3427

注:SIGRTMIN信號(hào)的id是34。通過(guò)kill -l查看。

那么如何利用這個(gè)特征實(shí)現(xiàn)每天自動(dòng)寫(xiě)入新的日志文件里面呢?

假設(shè)日志文件是/log/swoole.log,我們可以在每天0點(diǎn)運(yùn)行shell命令:

mv /log/swoole.log /log/$(date -d "-1 day" +%y-%m-%d).log
kill -34 $(ps aux|grep swoole_task|grep swoole_task_matser|grep -v grep|awk "{print $2}") # 找到主進(jìn)程,需要提前命名

我們也可以把master進(jìn)程的PID寫(xiě)入到文件:

$server->set(array(
    "pid_file" => __DIR__."/server.pid",
));

在Server關(guān)閉時(shí)自動(dòng)刪除PID文件。此選項(xiàng)在1.9.5或更高版本可用。

信號(hào)管理

Swoole支持的信號(hào):

SIGKILL -9 pid 強(qiáng)制殺掉進(jìn)程
SIGUSR1 -10 master_pid 重啟所有worker進(jìn)程
SIGUSR2 -12 master_pid 重啟所有task_worker進(jìn)程
SIGRTMIN -34 master_pid 重新打開(kāi)日志(版本1.8.11+)

master_pid代表主進(jìn)程pid。示例(假設(shè)主進(jìn)程名稱(chēng)是swoole_server,pid是3427):

# 殺掉進(jìn)程swoole_server
kill -9 $(ps aux|grep swoole_server|grep -v grep|awk "{print $2}")

# 重啟swoole_server的worker進(jìn)程
kill -10 $(ps aux|grep swoole_server|grep -v grep|awk "{print $2}")

# 重新打開(kāi)日志
kill -34 3427
Task

我們可以在worker進(jìn)程中投遞一個(gè)異步任務(wù)到task_worker池中。此函數(shù)是非阻塞的,執(zhí)行完畢會(huì)立即返回。worker進(jìn)程可以繼續(xù)處理新的請(qǐng)求。

通常會(huì)把耗時(shí)的任務(wù)交給task_worker來(lái)處理。

我們可以通過(guò)如下代碼判斷是Worker進(jìn)程還是TaskWorker進(jìn)程:

function onWorkerStart($serv, $worker_id) {
    if ($worker_id >= $serv->setting["worker_num"]) {  //超過(guò)worker_num,表示這是一個(gè)task進(jìn)程

    }
}

看一個(gè)示例:

set(array(
    "daemonize" => false,
    "reactor_num" => 2,
    "worker_num" => 1,
    "task_worker_num" => 1,
));

$server->on("start", function ($serv){ 
    swoole_set_process_name("swoole_task_matser"); //主進(jìn)程命名
});

$server->on("connect", function ($serv, $fd){ 
    echo "client connect. fd is {$fd}
";
});

$server->on("receive", function ($serv, $fd, $from_id, $data){
    
    echo sprintf("onReceive. fd: %d , data: %s
", $fd, json_encode($data) );
    
    $serv->task(json_encode([
        "fd" => $fd,
        "task_name" => "send_email",
        "email_content" => $data,
        "email" => "admin@qq.com"
    ]));
});

$server->on("close", function ($serv, $fd){
    echo "client close. fd is {$fd}
";
});

$server->on("task", function (swoole_server $serv, $task_id, $from_id,  $data){
    echo $data;
    
    $data = json_decode($data, true);
    $serv->send($data["fd"], "send eamil to {$data["email"]}, content is : {$data["email_content"]}
");
    
    //echo "task finished";
    //return "task finished";
    $serv->finish("task finished");
});

$server->on("finish", function (swoole_server $serv, $task_id, $data){
    echo "onFinish:" .$data;
});

$server -> start();

這里新建了一個(gè)tcp服務(wù)器,參數(shù)里設(shè)置worker_num進(jìn)程為1,task_worker_num為1。

配置了task_worker_num參數(shù)后將會(huì)啟用task功能,swoole_server務(wù)必要注冊(cè)onTask/onFinish2個(gè)事件回調(diào)函數(shù)。如果沒(méi)有注冊(cè),服務(wù)器程序?qū)o(wú)法啟動(dòng)。

onTask回調(diào)接收4個(gè)參數(shù),分別是serv對(duì)象、任務(wù)ID、自于哪個(gè)worker進(jìn)程、任務(wù)的內(nèi)容。注意的是,$data必須是字符串。我們可以在worker進(jìn)程里使用`swoole_server->task
($data)`進(jìn)行任務(wù)投遞。

onFinish回調(diào)用于將處理結(jié)果告知worker進(jìn)程,此回調(diào)必須有,但是否被調(diào)用由OnTask決定。在OnTask里使用return或者finish()可以將處理結(jié)果發(fā)生到onFinish回調(diào),否則onFinish回調(diào)是不會(huì)被調(diào)用的。也就是說(shuō):finish()是可選的。如果worker進(jìn)程不關(guān)心任務(wù)執(zhí)行的結(jié)果,不需要調(diào)用此函數(shù)。onFinish回調(diào)里的$data同樣必須是字符串。

我們新起一個(gè)窗口,使用telnet發(fā)送消息到服務(wù)端進(jìn)行測(cè)試:
client端:

telnet 127.0.0.1 8088
Trying 127.0.0.1...
Connected to 127.0.0.1.

hhh
send eamil to admin@qq.com, content is : hhh

server端:

client connect. fd is 1
onReceive. fd: 1 , data: "hhh
"
{"fd":1,"task_name":"send_email","email_content":"hhh
","email":"admin@qq.com"}
onFinish:task finished

onFinish回調(diào)里不使用return或者finish(),我們將看不到server端最后一行輸出。

此時(shí)服務(wù)器進(jìn)程模型:

pstree -ap | grep swoole
  |   |       `-php,3190 swoole_task.php
  |   |           |-php,3192 swoole_task.php
  |   |           |   |-php,3194 swoole_task.php
  |   |           |   `-php,3195 swoole_task.php

看到兩個(gè)worker進(jìn)程,其中一個(gè)是worker進(jìn)程,另外一個(gè)是task_worker進(jìn)程。

定時(shí)器

Swoole提供強(qiáng)大的異步毫秒定時(shí)器,基于timerfd+epoll實(shí)現(xiàn)。主要方法:
1、swoole_timer_tick:周期性定時(shí)器,類(lèi)似于JavaScript里的setInterval() 。
2、swoole_timer_after:一次性定時(shí)器。
3、swoole_timer_clear:清除定時(shí)器。

# 周期性定時(shí)器
int swoole_timer_tick(int $ms, callable $callback, mixed $user_param);

# 一次性定時(shí)器
swoole_timer_after(int $after_time_ms, mixed $callback_function, mixed $user_param);

# 清除定時(shí)器
bool swoole_timer_clear(int $timer_id)

# 定時(shí)器回調(diào)函數(shù)
function callbackFunction(int $timer_id, mixed $params = null);

注意:

$ms 最大不得超過(guò) 86400000。

manager進(jìn)程中不能添加定時(shí)器。

建議在WorkerStart回調(diào)里寫(xiě)定時(shí)器。

定時(shí)器示例:

$server->on("WorkerStart", function (swoole_server $server, $worker_id){
    if ($server->worker_id == 0){//防止重復(fù)
        //每隔2000ms觸發(fā)一次
        swoole_timer_tick(2000, function ($timer_id) {
            echo "tick-2000ms
";
        });
        
        //3000ms后執(zhí)行此函數(shù)
        swoole_timer_after(3000, function () {
            echo "after 3000ms.
";
        });
    }
});

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/23062.html

相關(guān)文章

  • PHP多進(jìn)程系列筆記(五)

    摘要:消息隊(duì)列更常見(jiàn)的用途是主進(jìn)程分配任務(wù),子進(jìn)程消費(fèi)執(zhí)行。子進(jìn)程前面加了個(gè),這是為了防止父進(jìn)程還未往消息隊(duì)列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴(kuò)展實(shí)現(xiàn)的多進(jìn)程程序。本節(jié)給大家介紹swoole擴(kuò)展的swoole_process模塊。 swoole多進(jìn)程 swoole_process 是swoole提供的進(jìn)程管理模塊,用來(lái)替代PHP的pcntl擴(kuò)展。 首先,確保安裝的swoole...

    qianfeng 評(píng)論0 收藏0
  • swoole 學(xué)習(xí)筆記swoole 真的優(yōu)秀一個(gè)框架

    摘要:所以,我感覺(jué)學(xué)習(xí),需要一個(gè)引導(dǎo)。學(xué)習(xí)參考鏈接喵星球特別厲害的一個(gè)官網(wǎng)的幾個(gè)框架文檔優(yōu)勢(shì)先看一下的結(jié)構(gòu)設(shè)計(jì)的應(yīng)用場(chǎng)景的設(shè)計(jì)項(xiàng)目中引入一個(gè)簡(jiǎn)易的具體參考一篇文章,集合和的簡(jiǎn)易實(shí)例項(xiàng)目中引入結(jié)合致敬 前期學(xué)完了操作系統(tǒng),特別是知道了進(jìn)程,線(xiàn)程 調(diào)度的問(wèn)題?;貋?lái)看,發(fā)現(xiàn)了很多細(xì)節(jié)。第三次看文檔,最初經(jīng)一個(gè)高手朋友的介紹,看swoole,說(shuō)文檔寫(xiě)的賊好。但是看的時(shí)候,也是很一頭霧水,只知道把de...

    13651657101 評(píng)論0 收藏0
  • Swoole筆記(一)

    摘要:修復(fù)添加超過(guò)萬(wàn)個(gè)以上定時(shí)器時(shí)發(fā)生崩潰的問(wèn)題增加模塊,下高性能序列化庫(kù)修復(fù)監(jiān)聽(tīng)端口設(shè)置無(wú)效的問(wèn)題等。線(xiàn)程來(lái)處理網(wǎng)絡(luò)事件輪詢(xún),讀取數(shù)據(jù)。當(dāng)?shù)娜挝帐殖晒α艘院?,由這個(gè)線(xiàn)程將連接成功的消息告訴進(jìn)程,再由進(jìn)程轉(zhuǎn)交給進(jìn)程。此時(shí)進(jìn)程觸發(fā)事件。 本文示例代碼詳見(jiàn):https://github.com/52fhy/swoo...。 簡(jiǎn)介 Swoole是一個(gè)PHP擴(kuò)展,提供了PHP語(yǔ)言的異步多線(xiàn)程服務(wù)器...

    SHERlocked93 評(píng)論0 收藏0
  • swoole 學(xué)習(xí)筆記

    摘要:安裝準(zhǔn)備或更高版本或更高版本安裝擴(kuò)展配置支持編輯在其中加入擴(kuò)展支持服務(wù)端代碼服務(wù)端客戶(hù)端代碼測(cè)試代碼在命令模式下輸入重新再開(kāi)一個(gè)窗口可以用檢測(cè)如服務(wù)端客戶(hù)端如上,表示服務(wù)端啟動(dòng),客戶(hù)端連接服務(wù)端返回消息,一個(gè)閉環(huán)形成開(kāi)發(fā)者頭條 1.安裝準(zhǔn)備 php-5.3.10 // 或更高版本 gcc-4.4 //或更高版本 make autoconf 2.安裝swoole擴(kuò)展 w...

    justCoding 評(píng)論0 收藏0
  • Swoole筆記(四)

    摘要:配合模塊,創(chuàng)建的子進(jìn)程可以異步的事件驅(qū)動(dòng)模式。默認(rèn)為阻塞讀取。函數(shù)用于將一個(gè)加入到的事件監(jiān)聽(tīng)中。為事件類(lèi)型的掩碼,可選擇關(guān)閉開(kāi)啟可讀可寫(xiě)事件,如,,或者。在程序中使用,可以理解為在進(jìn)程中將此注冊(cè)到事件中。 Process Process是swoole內(nèi)置的進(jìn)程管理模塊,用來(lái)替代PHP的pcntl擴(kuò)展。 swoole_process支持重定向標(biāo)準(zhǔn)輸入和輸出,在子進(jìn)程內(nèi)echo不會(huì)打印屏...

    yzd 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<