站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        PHP8.1新特性大講解之Fibers with a grain of salt

        本文系翻譯,原文地址:https://stitcher.io/blog/fibers-with-a-grain-of-salt

        Fibers with a grain of salt

        所以我打算寫一篇關(guān)于在PHP 8.1 中使用Fibers纖維的深入博客文章。我們將從一個(gè)基本示例開始,從頭開始解釋它們。這個(gè)想法是發(fā)送異步 HTTP 請(qǐng)求并使用纖程并行處理它們。

        但是和他們一起玩,我了解到RFC并不是在開玩笑,當(dāng)它說(shuō)“不應(yīng)直接在應(yīng)用程序級(jí)代碼中使用 Fiber API。Fibers 提供了一個(gè)基本的、低級(jí)的流控制 API 來(lái)創(chuàng)建更高然后在應(yīng)用程序代碼中使用的級(jí)抽象”。

        因此,與其走這條路并使事情變得過(guò)于復(fù)雜,我們將討論什么是纖程概念,為什么它們?cè)趹?yīng)用程序代碼中幾乎不可用,以及您到底如何使用異步 PHP。

        首先,一點(diǎn)點(diǎn)理論。

        假設(shè)您要發(fā)送三個(gè) HTTP 請(qǐng)求并處理它們的組合結(jié)果。這樣做的同步方式是發(fā)送第一個(gè),等待響應(yīng),然后發(fā)送第二個(gè),等待,等等。

        讓我們用盡可能簡(jiǎn)單的圖表來(lái)表示這樣的程序流程。你需要從上到下閱讀這張圖表,時(shí)間越往下越走。每種顏色代表一個(gè) HTTP 請(qǐng)求。每個(gè)請(qǐng)求的彩色部分代表實(shí)際運(yùn)行的 PHP 代碼,您服務(wù)器上的 CPU 正在執(zhí)行工作,透明塊代表等待時(shí)間:請(qǐng)求需要通過(guò)網(wǎng)絡(luò)發(fā)送,其他服務(wù)器需要處理并發(fā)送回. 只有當(dāng)響應(yīng)到達(dá)時(shí),我們才能再次工作。

        PHP8.1新特性大講解之Fibers with a grain of salt

        這是一個(gè)同步執(zhí)行流程:發(fā)送、等待、處理、重復(fù)。

        在并行處理的世界中,我們發(fā)送請(qǐng)求但不等待。然后我們發(fā)送下一個(gè)請(qǐng)求,然后是另一個(gè)。只有然后我們等待所有請(qǐng)求。在等待的同時(shí),我們會(huì)定期檢查我們的一個(gè)請(qǐng)求是否已經(jīng)完成。如果是這種情況,我們可以立即處理。

        PHP8.1新特性大講解之Fibers with a grain of salt

        您可以看到這種方法如何減少執(zhí)行時(shí)間,因?yàn)槲覀兏鼉?yōu)化地使用了等待時(shí)間。

        Fibers 是 PHP 8.1 中的一種新機(jī)制,可讓您更有效地管理這些并行執(zhí)行路徑。使用生成器和 已經(jīng)可以實(shí)現(xiàn)yield,但是纖維是一個(gè)顯著的改進(jìn),因?yàn)樗鼈兪菍iT為此用例設(shè)計(jì)的。

        您將為每個(gè)請(qǐng)求創(chuàng)建一個(gè)纖程,并在請(qǐng)求發(fā)送后暫停纖程。創(chuàng)建所有三個(gè)光纖后,您將遍歷它們,并一一恢復(fù)它們。通過(guò)這樣做,纖程檢查請(qǐng)求是否已經(jīng)完成,如果沒(méi)有則再次暫停,否則它可以處理響應(yīng)并最終完成。

        你看,纖程是一種啟動(dòng)、暫停和恢復(fù)程序隔離部分執(zhí)行流程的機(jī)制。Fiber 也被稱為“綠色線程”:實(shí)際上存在于同一進(jìn)程中的線程。這些線程不是由操作系統(tǒng)管理的,而是由運(yùn)行時(shí)管理的——在我們的例子中是 PHP 運(yùn)行時(shí)。它們是管理某些形式的并行編程的一種經(jīng)濟(jì)高效的方式。

        但請(qǐng)注意,它們并沒(méi)有添加任何真正的異步內(nèi)容:所有纖程都位于同一個(gè) PHP 進(jìn)程中,并且一次只能運(yùn)行一個(gè)纖程。這是循環(huán)它們并在等待時(shí)檢查它們的主進(jìn)程,該循環(huán)通常稱為“事件循環(huán)”。

        并行性的難點(diǎn)不在于你如何在纖程或生成器上循環(huán),或者你想使用的任何機(jī)制;它是關(guān)于能夠開始一個(gè)操作,將它交給一個(gè)外部服務(wù),并且只在你想要的時(shí)候以非阻塞的方式檢查結(jié)果。

        看,在前面的例子中,我們假設(shè)我們可以只發(fā)送一個(gè)請(qǐng)求,然后在我們想要的時(shí)候檢查它的響應(yīng),但這實(shí)際上并不像聽起來(lái)那么容易。

        沒(méi)錯(cuò):大多數(shù)處理 I/O 的 PHP 函數(shù)都沒(méi)有內(nèi)置這種非阻塞功能。事實(shí)上,只有少數(shù)函數(shù)可以做到,而且使用它們非常麻煩。

        有一個(gè)套接字的例子,它可以被設(shè)置為非阻塞,像這樣:

        [$read, $write] = stream_socket_pair(     STREAM_PF_UNIX,     STREAM_SOCK_STREAM,     STREAM_IPPROTO_IP );   stream_set_blocking($read, false); stream_set_blocking($write, false);

        通過(guò)使用stream_socket_pair(),創(chuàng)建了兩個(gè)可用于雙向通信的套接字。正如您所看到的,它們可以使用stream_set_blocking().

        假設(shè)我們想要實(shí)現(xiàn)我們的示例,發(fā)送三個(gè)請(qǐng)求。我們可以使用套接字來(lái)做到這一點(diǎn),但我們需要在它之上自己實(shí)現(xiàn) HTTP 協(xié)議。這正是nox7所做的,該用戶在Reddit上分享了一個(gè)小型概念證明,以展示如何使用光纖和套接字發(fā)送 HTTP GET 請(qǐng)求。你真的想在你的應(yīng)用程序代碼中這樣做嗎?

        至少對(duì)我來(lái)說(shuō),答案是“不”。這正是 RFC 警告的內(nèi)容;我不生氣。相反,我們鼓勵(lì)使用現(xiàn)有的異步框架之一:Amp或ReactPHP。

        例如,使用 ReactPHP,我們可以這樣寫:

        $loop = ReactEventLoopFactory::create(); $browser = new ClueReactBuzzBrowser($loop); $promises = [     $browser->get('https://example.com/1'),     $browser->get('https://example.com/2'),     $browser->get('https://example.com/3'), ]; $responses = BlockawaitAll($promises, $loop);

        與手動(dòng)創(chuàng)建套接字連接相比,這是一個(gè)更好的示例。這就是 RFC 的意思:應(yīng)用程序開發(fā)人員不需要擔(dān)心纖程,它是 Amp 或 ReactPHP 等框架的實(shí)現(xiàn)細(xì)節(jié)。

        不過(guò),這給我們帶來(lái)了一個(gè)問(wèn)題:與我們已經(jīng)可以用發(fā)電機(jī)做的事情相比,纖維有什么好處?RFC 是這樣解釋的:

        與無(wú)堆棧生成器不同,每個(gè) Fiber 都有自己的調(diào)用堆棧,允許它們?cè)谏疃惹短椎暮瘮?shù)調(diào)用中暫停。聲明中斷點(diǎn)的函數(shù)(即調(diào)用 Fiber::suspend())不需要更改其返回類型,這與使用 yield 的函數(shù)必須返回 Generator 實(shí)例不同。

        Fiber 可以在任何函數(shù)調(diào)用中掛起,包括那些從 PHP VM 內(nèi)部調(diào)用的函數(shù),例如提供給 array_map 的函數(shù)或迭代器對(duì)象上的 foreach 調(diào)用的方法。

        很明顯,纖程在語(yǔ)法和靈活性方面都有顯著的改進(jìn)。但與 Go 及其“ goroutines ”相比,它們還不算什么。

        要使異步 PHP 在沒(méi)有框架開銷的情況下成為主流,仍然缺少許多功能,而 Fiber 是朝著正確方向邁出的良好一步,但我們還沒(méi)有做到這一點(diǎn)。

        所以就是這樣。如果您不是 Amp、ReactPHP 或較小的異步 PHP 框架的維護(hù)者,那么實(shí)際上沒(méi)有什么可說(shuō)的。也許

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 午夜精品久久久久久毛片| 奇米影视7777久久精品| 亚洲国产精品自产在线播放 | 午夜精品久久久久久久无码| 国产精品自在线拍国产电影 | 国产cosplay精品视频| 国产欧美日韩精品丝袜高跟鞋 | 2022年国产精品久久久久| 久久久久亚洲精品无码网址| 精品无人区麻豆乱码1区2区| 久久香蕉超碰97国产精品| 人妻少妇看A偷人无码精品视频| 91精品国产麻豆国产自产在线 | 87国产私拍福利精品视频| 国内精品久久久久久99蜜桃| 亚洲国产精品综合久久一线| 国产精品片在线观看手机版| laowang在线精品视频| 欧美精品黑人粗大免费| 一区二区国产精品 | 91麻豆精品视频| 色一乱一伦一图一区二区精品 | 亚洲综合av永久无码精品一区二区 | 精品9E精品视频在线观看 | 国产大片91精品免费观看不卡| 亚洲国产精品久久电影欧美| 日韩精品在线播放| 久久九九久精品国产| 国产精品免费一区二区三区| 亚洲国产精品久久久久婷婷老年| 精品无码一区二区三区爱欲 | 999国内精品永久免费视频| 久久精品九九亚洲精品| 婷婷国产成人精品视频| 亚洲精品二区国产综合野狼 | 中文精品久久久久国产网址| 国产精品亚洲专区在线观看| 99在线精品视频观看免费| 国产精品天天看天天狠| 国产精品乱码高清在线观看 | 500av大全导航精品|