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