溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

workerman實(shí)現(xiàn)異步任務(wù)的方法

發(fā)布時(shí)間:2020-12-18 10:15:47 來(lái)源:億速云 閱讀:207 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下workerman實(shí)現(xiàn)異步任務(wù)的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

1、問(wèn)題

遇到一個(gè)問(wèn)題,php是單線程,無(wú)法實(shí)現(xiàn)多線程?,F(xiàn)在我需要使用一個(gè)場(chǎng)景是多個(gè)鏈接使用一個(gè)線程,也就是在一個(gè)連接進(jìn)程,再開(kāi)進(jìn)程來(lái)處理

2、解決方案

workerman如何實(shí)現(xiàn)異步任務(wù)。workerman可以幫我解決問(wèn)題, 給予文檔一個(gè)解答

問(wèn):

如何異步處理繁重的業(yè)務(wù),避免主業(yè)務(wù)被長(zhǎng)時(shí)間阻塞。例如我要給1000用戶發(fā)送郵件,這個(gè)過(guò)程很慢,可能要阻塞數(shù)秒,這個(gè)過(guò)程中因?yàn)橹髁鞒瘫蛔枞?,?huì)影響后續(xù)的請(qǐng)求,如何將這樣的繁重任務(wù)交給其它進(jìn)程異步處理。

答:

可以在本機(jī)或者其它服務(wù)器甚至服務(wù)器集群預(yù)先建立一些任務(wù)進(jìn)程處理繁重的業(yè)務(wù),任務(wù)進(jìn)程數(shù)可以開(kāi)多一些,例如cpu的10倍,然后調(diào)用方利用AsyncTcpConnection將數(shù)據(jù)異步發(fā)送給這些任務(wù)進(jìn)程異步處理,異步得到處理結(jié)果

任務(wù)進(jìn)程服務(wù)端

use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// task worker,使用Text協(xié)議
$task_worker = new Worker('Text://0.0.0.0:12345');
// task進(jìn)程數(shù)可以根據(jù)需要多開(kāi)一些
$task_worker->count = 100;
$task_worker->name = 'TaskWorker';
//只有php7才支持task->reusePort,可以讓每個(gè)task進(jìn)程均衡的接收任務(wù)
//$task->reusePort = true;
$task_worker->onMessage = function($connection, $task_data)
{
     // 假設(shè)發(fā)來(lái)的是json數(shù)據(jù)
     $task_data = json_decode($task_data, true);
     // 根據(jù)task_data處理相應(yīng)的任務(wù)邏輯.... 得到結(jié)果,這里省略....
     $task_result = ......
     // 發(fā)送結(jié)果
     $connection->send(json_encode($task_result));
};
Worker::runAll();

在workerman中調(diào)用

use Workerman\Worker;
use \Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/Workerman/Autoloader.php';
// websocket服務(wù)
$worker = new Worker('websocket://0.0.0.0:8080');
$worker->onMessage = function($ws_connection, $message)
{
    // 與遠(yuǎn)程task服務(wù)建立異步連接,ip為遠(yuǎn)程task服務(wù)的ip,如果是本機(jī)就是127.0.0.1,如果是集群就是lvs的ip
    $task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345');
    // 任務(wù)及參數(shù)數(shù)據(jù)
    $task_data = array(
        'function' => 'send_mail',
        'args'       => array('from'=>'xxx', 'to'=>'xxx', 'contents'=>'xxx'),
    );
    // 發(fā)送數(shù)據(jù)
    $task_connection->send(json_encode($task_data));
    // 異步獲得結(jié)果
    $task_connection->onMessage = function($task_connection, $task_result)use($ws_connection)
    {
         // 結(jié)果
         var_dump($task_result);
         // 獲得結(jié)果后記得關(guān)閉異步連接
         $task_connection->close();
         // 通知對(duì)應(yīng)的websocket客戶端任務(wù)完成
         $ws_connection->send('task complete');
    };
    // 執(zhí)行異步連接
    $task_connection->connect();
}
Worker::runAll();

這樣,繁重的任務(wù)交給本機(jī)或者其它服務(wù)器的進(jìn)程去做,任務(wù)完成后會(huì)異步收到結(jié)果,業(yè)務(wù)進(jìn)程就不會(huì)阻塞了。

以上是“workerman實(shí)現(xiàn)異步任務(wù)的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI