摘要:主函數(shù)查詢數(shù)據(jù)不手動釋放的連接不會歸還連接池,會在析構時丟棄執(zhí)行結果為,說明是并行執(zhí)行的。主函數(shù)查詢數(shù)據(jù)即便拋出了異常,仍然能執(zhí)行到,沒有導致內的一直處于阻塞狀態(tài)。主函數(shù)一次性定時持續(xù)定時停止定時
協(xié)程
Mix PHP V2 基于 Swoole 4 的 PHP Stream Hook 協(xié)程技術開發(fā),協(xié)程使用方式與 Golang 幾乎一致,包括框架封裝的協(xié)程池、連接池、命令行處理都大量參考了 Golang 的系統(tǒng)庫風格。
除了缺少 select case 外,Mix PHP 與 Golang 的協(xié)程幾乎一致,框架還提供了連接池、協(xié)程池、命令行處理這些開箱即用的封裝。xgo + Channel
xgo 類似 Golang 的 go 關鍵字,可啟動一個新的協(xié)程,Channel 等于 Golang 的 chan 類,負責在不同協(xié)程中傳遞數(shù)據(jù)。
*/ class CoroutineCommand { /** * 主函數(shù) */ public function main() { xgo(function () { $time = time(); $chan = new Channel(); for ($i = 0; $i < 2; $i++) { xgo([$this, "foo"], $chan); } for ($i = 0; $i < 2; $i++) { $result = $chan->pop(); } println("Total time: " . (time() - $time)); }); Event::wait(); } /** * 查詢數(shù)據(jù) * @param Channel $chan */ public function foo(Channel $chan) { $db = app()->dbPool->getConnection(); $result = $db->createCommand("select sleep(5)")->queryAll(); $db->release(); // 不手動釋放的連接不會歸還連接池,會在析構時丟棄 $chan->push($result); } }
執(zhí)行結果為 5s,說明是并行執(zhí)行的。
WaitGroup + xdeferWaitGroup 與 Golang 的完全一致,xdefer 方法也等同于 Golang 的 defer 關鍵字。
當并行執(zhí)行且不需要返回結果時,可以使用 WaitGroup + xdefer,xdefer 即使在方法拋出異常時,仍然會執(zhí)行,這樣能避免一直處于阻塞狀態(tài)。
*/ class WaitGroupCommand { /** * 主函數(shù) */ public function main() { xgo(function () { $wg = WaitGroup::new(); for ($i = 0; $i < 2; $i++) { $wg->add(1); xgo([$this, "foo"], $wg); } $wg->wait(); println("All done!"); }); Event::wait(); } /** * 查詢數(shù)據(jù) * @param WaitGroup $wg */ public function foo(WaitGroup $wg) { xdefer(function () use ($wg) { $wg->done(); }); println("work"); throw new RuntimeException("ERROR"); } }
即便拋出了 RuntimeException 異常,仍然能執(zhí)行到 println("All done!");,沒有導致 wg 內的 chan 一直處于阻塞狀態(tài)。
定時器異步編程中,定時器的使用非常頻繁。
Timer::new() 可獲得一個實例
after 方法可設置一次性定時
tick 方法可設置持續(xù)定時
停止當前定時期,只需只需對象的 $timer->clear(); 方法。
*/ class TimerCommand { /** * 主函數(shù) */ public function main() { // 一次性定時 Timer::new()->after(1000, function () { println(time()); }); // 持續(xù)定時 $timer = new Timer(); $timer->tick(1000, function () { println(time()); }); // 停止定時 Timer::new()->after(10000, function () use ($timer) { $timer->clear(); }); Event::wait(); } }
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31192.html
摘要:前些時間我們發(fā)布了實例協(xié)程池異步郵件發(fā)送守護程序范例,這一次我們提供一個使用大廠通過協(xié)程化來并行執(zhí)行短信發(fā)送任務,本文是一個代碼簡單性能極強的范例。 前些時間我們發(fā)布了 Mix PHP V2 實例:協(xié)程池異步郵件發(fā)送守護程序 范例,這一次我們提供一個使用大廠 SDK 通過 Swoole Hook 協(xié)程化來并行執(zhí)行短信發(fā)送任務,本文是一個代碼簡單、IO 性能極強的范例。 請先升級到 m...
摘要:消費者開發(fā)使用本例時,請確保你使用的編譯時開啟了本例我們采用的守護程序協(xié)程池來完成一個超高性能的郵件發(fā)送程序。 去年 Mix PHP V1 發(fā)布時,我寫了一個多進程的郵件發(fā)送實例: 使用 mixphp 打造多進程異步郵件發(fā)送,今年 Mix PHP V2 發(fā)布,全面的協(xié)程支持讓我們可以使用一個進程就可達到之前多個進程都無法達到的更高 IO 性能,所以今天重寫一個協(xié)程池版本的郵件發(fā)送實例。...
摘要:是一個非常流行的的客戶端,現(xiàn)在各大廠的也都開始基于開發(fā),因為只支持的協(xié)程,而默認是使用擴展的,所以開發(fā)了,能在不修改源碼的情況下讓協(xié)程化。 Guzzle 是一個非常流行的 PHP 的 HTTP 客戶端,現(xiàn)在各大廠的 SDK 也都開始基于 Guzzle 開發(fā),因為 Swoole 只支持 PHP Stream 的協(xié)程 Hook ,而 Guzzle 默認是使用 cURL 擴展的,所以 Mix...
摘要:事件驅動的異步編程模式異步協(xié)議的服務器端客戶端支持支持隧道加密支持并發(fā)百萬長連接支持毫秒定時器支持異步同步協(xié)程支持親和性設置守護進程版本目前上穩(wěn)定版本是,最新消息,要邁入,徹底協(xié)程化。 Swoole:面向生產(chǎn)環(huán)境的 PHP 異步網(wǎng)絡通信引擎 官網(wǎng)原話:使 PHP 開發(fā)人員可以編寫高性能的異步并發(fā) TCP、UDP、Unix Socket、HTTP,WebSocket 服務。Swoole ...
摘要:之前的版本用的管理全段資源,版本開始使用的來管理。不過,并不是強制要求在開發(fā)期間使用它。發(fā)布問題標題標題編輯器容器內容發(fā)布問題實例化編輯器設置如果沒有預加載,否則不會出現(xiàn) Laravel5.4 之前的版本用 gulp 的 laravel-elixir管理全段資源,Laravel5.4 版本開始使用webpack 的 Laravel Mix 來管理。 一、簡介 Laravel Mix 提...
閱讀 2907·2021-11-15 18:02
閱讀 3801·2021-10-14 09:43
閱讀 3733·2021-09-08 10:41
閱讀 2522·2019-08-30 15:53
閱讀 1804·2019-08-30 14:14
閱讀 1943·2019-08-29 16:12
閱讀 3139·2019-08-29 14:03
閱讀 1280·2019-08-29 13:46