成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高性能PHP框架Workerman與Webman協(xié)程應(yīng)用

開(kāi)發(fā) 前端
因?yàn)镻HP的協(xié)程方案是單線程的,同一時(shí)刻只能運(yùn)行一個(gè)任務(wù),所以需要在事件循環(huán)內(nèi)盡可能地non-blocking出讓控制權(quán),才可能讓事件循環(huán)驅(qū)動(dòng)在有限的時(shí)間內(nèi)執(zhí)行更多的任務(wù)。

前言

workerman v5在經(jīng)歷了幾年的開(kāi)發(fā)和測(cè)試,于2025年元旦正式發(fā)布,webman開(kāi)發(fā)框架及眾多周邊插件也緊隨其后更新兼容了v5版本;作為PHP界老牌的網(wǎng)絡(luò)容器,workerman的穩(wěn)定性及易用性毋庸置疑,常駐內(nèi)存的運(yùn)行模式、多進(jìn)程、多協(xié)議支持等高性能高效率的特性讓許多PHPer接觸到了之前不曾觸摸過(guò)的技術(shù)方向;那么v5版本相較于之前版本給開(kāi)發(fā)者帶來(lái)了什么比較明顯且用的上的特性呢?

  • 以revolt/event-loop為基建的事件驅(qū)動(dòng)庫(kù)
  • 兼容多方協(xié)程實(shí)現(xiàn)的協(xié)程功能

以上是變化較大且意義重大的特性,除此之外還有許多的優(yōu)化內(nèi)容及特性升級(jí),請(qǐng)參考官方文檔

“前生”

我個(gè)人一直認(rèn)為所謂‘協(xié)程’其實(shí)是至少包含了上下文管理、協(xié)程調(diào)度器、協(xié)程執(zhí)行器三部分的完整方案,在沒(méi)有Fiber之前,原生PHP中其實(shí)已經(jīng)有了無(wú)棧協(xié)程的相關(guān)實(shí)現(xiàn),借助yield完成,但不論是Fiber還是yield,都不是完整的‘協(xié)程’,只是和上下文相關(guān)的一些功能而已,并沒(méi)有調(diào)度及執(zhí)行兩部分。而非原生PHP中僅有swoole是一套完整的協(xié)程實(shí)現(xiàn)方案,不論是它早期底層類(lèi)yield的異步還是現(xiàn)如今比較現(xiàn)代化的Coroutine,它們都包含了成熟的事件循環(huán)驅(qū)動(dòng)(調(diào)度/執(zhí)行)和豐富的上下文管理工具。

可能有人會(huì)問(wèn)了,workerman也有事件循環(huán)驅(qū)動(dòng),為什么沒(méi)有協(xié)程?先說(shuō)結(jié)論,因?yàn)椴缓霉芾砬疑鷳B(tài)不夠統(tǒng)一,生態(tài)的支持度也不足夠。

在沒(méi)有Fiber之前,借助yield來(lái)實(shí)現(xiàn)協(xié)程方案需要保存特別特別多的棧上下文,你可以把它們理解為因?yàn)槭謩?dòng)中斷的入?yún)?shù),他們需要存放在比如靜態(tài)變量(也就是內(nèi)存)中等待下一次的喚醒,喚醒后繼續(xù)從中斷的地方執(zhí)行,再主動(dòng)中斷的這個(gè)過(guò)程中,進(jìn)程就可以交給其他的事務(wù)進(jìn)行執(zhí)行,整個(gè)進(jìn)程內(nèi)的所有不同事務(wù)呈現(xiàn)無(wú)序的交替運(yùn)行狀態(tài),就像是我們?nèi)嗽诠ぷ鞯臅r(shí)候時(shí)不時(shí)去上個(gè)廁所、接杯咖啡,回來(lái)繼續(xù)工作;

Fiber其實(shí)也類(lèi)似,只不過(guò)它并沒(méi)有像yield一樣直接返回暫停時(shí)的棧上下文,而是主動(dòng)保存在一個(gè)特定的地方自行管理,這樣就省去了自行使用內(nèi)存管理的問(wèn)題,簡(jiǎn)化了操作,在我每一次歸來(lái)后無(wú)需再翻看我的記事本查看我到底寫(xiě)到那里了,而是直接就可以銜接。

workerman之前也有利用yield+promise包做的異步方案,但都要進(jìn)行很多侵入式的改造,代價(jià)大于收益。

“今世”

workerman v5基于revolt/event-loop作為事件驅(qū)動(dòng)引擎,一方面是由此引入Fiber,一方面是減少目前PHP開(kāi)發(fā)中過(guò)多的事件驅(qū)動(dòng)引擎的分化問(wèn)題,另外還兼容了swow、swoole的事件驅(qū)動(dòng)引擎,是支持中國(guó)本土化的內(nèi)容,另外本質(zhì)上也是為了減少分化和加強(qiáng)協(xié)程的引入;就此,在workerman v5中就可以使用以上三種驅(qū)動(dòng)的協(xié)程方案。

那么協(xié)程能干什么呢?

假設(shè)一個(gè)場(chǎng)景,我們需要?jiǎng)?chuàng)建一個(gè)異步導(dǎo)出任務(wù),這個(gè)異步導(dǎo)出任務(wù)可能的實(shí)現(xiàn)方式就會(huì)是:

開(kāi)源技術(shù)小棧

  • 前端請(qǐng)求接口 -> 接口創(chuàng)建任務(wù) -> 將任務(wù)投遞至消息隊(duì)列
  • 消息隊(duì)列消費(fèi)導(dǎo)出 -> 修改任務(wù)狀態(tài)
  • 前端輪詢(xún)查詢(xún)?nèi)蝿?wù)狀態(tài)及下載連接

而有了協(xié)程我們可以實(shí)現(xiàn)以下兩種方案:

1.  自輪詢(xún)消費(fèi)(查詢(xún)數(shù)據(jù)如果使用阻塞方法還是會(huì)阻塞)

public function test(): Response
{
    $id = 'your_file_id';
    // 根據(jù)請(qǐng)求參數(shù)獲取分片數(shù)量
    $count = YourData::getShardingCount($request = request()->all());
    for ($i = 0; $i < $count; $i++) {
        // 分片獲取數(shù)據(jù)
        if ($data = YourData::getListBySharding($request, $i)) {
            // 導(dǎo)出追加
            YourExcel::append($id, $data);
        }
        // 協(xié)程隨機(jī)出讓1-10 ms
        Timer::sleep(rand(1, 10) / 1000);
    }

    return new Response(200, body: json_encode(YourExcel::getUrl($id)));
}

2.  自輪詢(xún)查詢(xún)方式

public function test(): Response
{
    $id = 'your_file_id';
    // 發(fā)布至消息隊(duì)列
    YourMessageMQ::publish($id, $request = request()->all());
    while (1) {
        // 查詢(xún)消息隊(duì)列消費(fèi)情況
        if (YourMessageMQ::isComplete($id)) {
            break;
        }
        // 協(xié)程隨機(jī)出讓1-10 ms
        Timer::sleep(rand(1, 10) / 1000);
    }

    return new Response(200, body: json_encode(YourMessageMQ::getReturn($id)));
}

以上兩種方式都不會(huì)特別的阻塞當(dāng)前進(jìn)程而實(shí)現(xiàn)一個(gè)長(zhǎng)輪詢(xún)接口,避免了前端短輪詢(xún)的資源消耗問(wèn)題;類(lèi)似SSE的實(shí)現(xiàn)方式也會(huì)更簡(jiǎn)單一些,只需要利用Timer::sleep主動(dòng)出讓當(dāng)前協(xié)程控制權(quán)給事件驅(qū)動(dòng)引擎就可以,而且這樣的好處是既保留了PHP系統(tǒng)層面的CPU控制權(quán)出讓sleep/usleep又提供了事件驅(qū)動(dòng)控制權(quán)的出讓?zhuān)瑓^(qū)別于Swow和Swoole對(duì)系統(tǒng)函數(shù)的hook改造,但缺點(diǎn)又是無(wú)法改變已經(jīng)存在的阻塞式函數(shù)的阻塞調(diào)用邏輯。

“來(lái)世”

因?yàn)镻HP的協(xié)程方案是單線程的,同一時(shí)刻只能運(yùn)行一個(gè)任務(wù),所以需要在事件循環(huán)內(nèi)盡可能地non-blocking出讓控制權(quán),才可能讓事件循環(huán)驅(qū)動(dòng)在有限的時(shí)間內(nèi)執(zhí)行更多的任務(wù);而目前PHP生態(tài)大多數(shù)的組件工具都是blocking的,協(xié)程所能覆蓋的業(yè)務(wù)范圍很窄,現(xiàn)存的很多協(xié)程組件并不能照顧大部分開(kāi)發(fā)者的情緒,所以我真的希望在未來(lái),PHP能夠涌現(xiàn)更多的開(kāi)發(fā)者來(lái)貢獻(xiàn)協(xié)程相關(guān)的生態(tài),而不是分裂,希望在有限的時(shí)間和空間內(nèi),看到這門(mén)歷史不算太久的老編程語(yǔ)言能夠煥發(fā)青春。

責(zé)任編輯:武曉燕 來(lái)源: 開(kāi)源技術(shù)小棧
相關(guān)推薦

2024-10-18 10:27:50

PHP框架webma

2024-08-12 08:43:09

2024-11-06 11:25:06

2024-10-21 09:06:15

2025-02-08 09:13:40

2023-11-01 11:27:10

Linux協(xié)程

2024-11-01 11:46:59

2017-08-10 15:50:44

PHP協(xié)程阻塞

2025-03-26 01:22:00

NtyCo協(xié)程框架

2021-09-16 09:59:13

PythonJavaScript代碼

2017-05-02 11:38:00

PHP協(xié)程實(shí)現(xiàn)過(guò)程

2016-10-28 17:39:47

phpgolangcoroutine

2023-11-17 11:36:59

協(xié)程纖程操作系統(tǒng)

2018-12-04 14:00:41

協(xié)程編程模式PHP

2025-06-26 04:10:00

2012-08-08 10:10:31

PHP

2021-05-28 05:18:08

PHP語(yǔ)言roadrunnner

2024-02-26 07:43:10

大語(yǔ)言模型LLM推理框架

2019-03-01 08:57:47

iOScoobjc協(xié)程

2024-09-25 08:28:45

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩高清国产一区在线 | 国产精品久久在线观看 | 日本精品一区二区三区四区 | 无人区国产成人久久三区 | 欧美精品久久久久 | 中文字幕免费中文 | 91精品国产色综合久久不卡98口 | 香蕉视频91 | 祝你幸福电影在线观看 | 国产精品久久久久久久久久久久 | 成人在线一区二区 | com.色.www在线观看 | 国产精品国产精品国产专区不卡 | 91麻豆精品国产91久久久更新资源速度超快 | xxxxxx国产| 欧美一区二区三区在线看 | 精品在线一区 | 爱操影视 | 一本大道久久a久久精二百 国产成人免费在线 | 成人在线视频观看 | 久久免费精品视频 | 人人干在线视频 | 中文字幕av一区二区三区 | 成人午夜精品一区二区三区 | 99视频免费看 | 国产在线一区二区三区 | 五月婷婷视频 | 一级毛片视频在线 | 欧美一二三四成人免费视频 | 国内精品久久久久久久影视简单 | 一区二区三区不卡视频 | 狠狠干天天干 | 91电影 | 国产久| 极品久久| 欧美8一10sex性hd | 成人深夜福利在线观看 | 精品国产乱码久久久久久闺蜜 | 99热国产在线播放 | 国产精品成人一区二区三区夜夜夜 | 精品www|