下面由workerman使用教學(xué)專(zhuān)欄來(lái)介紹workerman實(shí)現(xiàn)非同步任務(wù)的方法,希望對(duì)需要的朋友有幫助!
1、問(wèn)題
#遇到一個(gè)問(wèn)題,php是單線程,無(wú)法實(shí)作多線程?,F(xiàn)在我需要使用一個(gè)場(chǎng)景是多個(gè)連結(jié)使用一個(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ī)或者其它伺服器甚至伺服器叢集預(yù)先建立一些任務(wù)進(jìn)程處理繁重的業(yè)務(wù),任務(wù)進(jìn)程數(shù)可以開(kāi)多一些,例如cpu的10倍,然後調(diào)用方利用AsyncTcpConnection將資料非同步傳送給這些任務(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中呼叫
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ī)或者其它伺服器的進(jìn)程去做,任務(wù)完成後會(huì)異步收到結(jié)果,業(yè)務(wù)進(jìn)程就不會(huì)阻塞了。
更多Workerman相關(guān)技術(shù)文章,請(qǐng)?jiān)煸LWorkerman教學(xué)欄位進(jìn)行學(xué)習(xí)!
以上是workerman如何實(shí)現(xiàn)非同步任務(wù)(附程式碼)的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

實(shí)現(xiàn)Workerman文件中的文件上傳與下載,需要具體程式碼範(fàn)例引言:Workerman是一款高效能的PHP非同步網(wǎng)路通訊框架,具備簡(jiǎn)潔、高效、易用等特點(diǎn)。在實(shí)際開(kāi)發(fā)中,文件上傳和下載是常見(jiàn)的功能需求,本文將介紹如何使用Workerman框架實(shí)現(xiàn)文件的上傳和下載,並給出具體的程式碼範(fàn)例。一、檔案上傳:檔案上傳是指將本機(jī)上的檔案?jìng)鬏斨了欧鞫说牟僮鳌O旅媸鞘褂?/p>

Swoole 和 Workerman 都是高效能 PHP 伺服器框架。 Swoole 以其非同步處理、出色的效能和可擴(kuò)展性而聞名,適用於需要處理大量並發(fā)請(qǐng)求和高吞吐量的專(zhuān)案。 Workerman 提供了非同步和同步模式的靈活性,具有直覺(jué)的 API,更適合易用性和處理較低並發(fā)量的專(zhuān)案。

《開(kāi)發(fā)建議:如何利用ThinkPHP框架實(shí)現(xiàn)非同步任務(wù)》隨著網(wǎng)路技術(shù)的快速發(fā)展,Web應(yīng)用程式對(duì)於處理大量並發(fā)請(qǐng)求和複雜業(yè)務(wù)邏輯的需求也越來(lái)越高。為了提高系統(tǒng)的效能和使用者體驗(yàn),開(kāi)發(fā)人員常常會(huì)考慮利用非同步任務(wù)來(lái)執(zhí)行一些耗時(shí)操作,例如發(fā)送郵件、處理文件上傳、產(chǎn)生報(bào)表等。在PHP領(lǐng)域,ThinkPHP框架作為一個(gè)流行的開(kāi)發(fā)框架,提供了一些便捷的方式來(lái)實(shí)現(xiàn)非同步任務(wù)。

如何實(shí)現(xiàn)Workerman文件的基本使用方法簡(jiǎn)介:Workerman是一個(gè)高效能的PHP開(kāi)發(fā)框架,它可以幫助開(kāi)發(fā)者輕鬆建立高並發(fā)的網(wǎng)路應(yīng)用程式。本文將介紹Workerman的基本使用方法,包括安裝和設(shè)定、建立服務(wù)和監(jiān)聽(tīng)連接埠、處理客戶端請(qǐng)求等。並給出相應(yīng)的程式碼範(fàn)例。一、安裝並設(shè)定Workerman在命令列中輸入以下命令來(lái)安裝Workerman:c

如何實(shí)現(xiàn)Workerman文件中的定時(shí)器功能Workerman是一款強(qiáng)大的PHP非同步網(wǎng)路通訊框架,它提供了豐富的功能,其中就包括定時(shí)器功能。使用定時(shí)器可以在指定的時(shí)間間隔內(nèi)執(zhí)行程式碼,非常適合定時(shí)任務(wù)、輪詢等應(yīng)用程式場(chǎng)景。接下來(lái),我將詳細(xì)介紹如何在Workerman中實(shí)現(xiàn)定時(shí)器功能,並提供具體的程式碼範(fàn)例。第一步:安裝Workerman首先,我們需要安裝Worker

如何實(shí)現(xiàn)Workerman文件中的反向代理功能,需要具體程式碼範(fàn)例簡(jiǎn)介:Workerman是一款高效能的PHP多進(jìn)程網(wǎng)路通訊框架,提供了豐富的功能和強(qiáng)大的效能,廣泛應(yīng)用於Web即時(shí)通訊、長(zhǎng)連接服務(wù)等場(chǎng)景。其中,Workerman也支援反向代理功能,可實(shí)現(xiàn)伺服器對(duì)外提供服務(wù)時(shí)的負(fù)載平衡和靜態(tài)資源快取等功能。本篇文章將介紹如何使用Workerman實(shí)現(xiàn)反向代理功

Workerman開(kāi)發(fā):基於UDP協(xié)議的即時(shí)視訊通話摘要:本文將介紹如何使用Workerman框架實(shí)現(xiàn)基於UDP協(xié)議的即時(shí)視訊通話功能。我們將深入了解UDP協(xié)議的特點(diǎn),並透過(guò)程式碼範(fàn)例展示如何建立一個(gè)簡(jiǎn)單但完整的即時(shí)視訊通話應(yīng)用程式。引言:在網(wǎng)路通訊中,即時(shí)視訊通話是一項(xiàng)非常重要的功能。傳統(tǒng)的TCP協(xié)定在實(shí)現(xiàn)即時(shí)性較高的視訊通話時(shí),可能會(huì)有傳輸延遲等問(wèn)題。而UDP

如何使用Workerman建立高可用性負(fù)載平衡系統(tǒng),需要具體程式碼範(fàn)例在現(xiàn)代技術(shù)領(lǐng)域中,隨著網(wǎng)路的快速發(fā)展,越來(lái)越多的網(wǎng)站和應(yīng)用程式需要處理大量的並發(fā)請(qǐng)求。為了實(shí)現(xiàn)高可用性和高效能,負(fù)載平衡系統(tǒng)成為了必不可少的組件之一。本文將介紹如何使用PHP開(kāi)源框架Workerman建構(gòu)一個(gè)高可用性的負(fù)載平衡系統(tǒng),並提供具體的程式碼範(fàn)例。一、Workerman簡(jiǎn)介Worke
