站長資訊網
        最全最豐富的資訊網站

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

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

        Fibers with a grain of salt

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

        但是和他們一起玩,我了解到RFC并不是在開玩笑,當它說“不應直接在應用程序級代碼中使用 Fiber API。Fibers 提供了一個基本的、低級的流控制 API 來創建更高然后在應用程序代碼中使用的級抽象”。

        因此,與其走這條路并使事情變得過于復雜,我們將討論什么是纖程概念,為什么它們在應用程序代碼中幾乎不可用,以及您到底如何使用異步 PHP。

        首先,一點點理論。

        假設您要發送三個 HTTP 請求并處理它們的組合結果。這樣做的同步方式是發送第一個,等待響應,然后發送第二個,等待,等等。

        讓我們用盡可能簡單的圖表來表示這樣的程序流程。你需要從上到下閱讀這張圖表,時間越往下越走。每種顏色代表一個 HTTP 請求。每個請求的彩色部分代表實際運行的 PHP 代碼,您服務器上的 CPU 正在執行工作,透明塊代表等待時間:請求需要通過網絡發送,其他服務器需要處理并發送回. 只有當響應到達時,我們才能再次工作。

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

        這是一個同步執行流程:發送、等待、處理、重復。

        在并行處理的世界中,我們發送請求但不等待。然后我們發送下一個請求,然后是另一個。只有然后我們等待所有請求。在等待的同時,我們會定期檢查我們的一個請求是否已經完成。如果是這種情況,我們可以立即處理。

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

        您可以看到這種方法如何減少執行時間,因為我們更優化地使用了等待時間。

        Fibers 是 PHP 8.1 中的一種新機制,可讓您更有效地管理這些并行執行路徑。使用生成器和 已經可以實現yield,但是纖維是一個顯著的改進,因為它們是專門為此用例設計的。

        您將為每個請求創建一個纖程,并在請求發送后暫停纖程。創建所有三個光纖后,您將遍歷它們,并一一恢復它們。通過這樣做,纖程檢查請求是否已經完成,如果沒有則再次暫停,否則它可以處理響應并最終完成。

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

        但請注意,它們并沒有添加任何真正的異步內容:所有纖程都位于同一個 PHP 進程中,并且一次只能運行一個纖程。這是循環它們并在等待時檢查它們的主進程,該循環通常稱為“事件循環”。

        并行性的難點不在于你如何在纖程或生成器上循環,或者你想使用的任何機制;它是關于能夠開始一個操作,將它交給一個外部服務,并且只在你想要的時候以非阻塞的方式檢查結果。

        看,在前面的例子中,我們假設我們可以只發送一個請求,然后在我們想要的時候檢查它的響應,但這實際上并不像聽起來那么容易。

        沒錯:大多數處理 I/O 的 PHP 函數都沒有內置這種非阻塞功能。事實上,只有少數函數可以做到,而且使用它們非常麻煩。

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

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

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

        假設我們想要實現我們的示例,發送三個請求。我們可以使用套接字來做到這一點,但我們需要在它之上自己實現 HTTP 協議。這正是nox7所做的,該用戶在Reddit上分享了一個小型概念證明,以展示如何使用光纖和套接字發送 HTTP GET 請求。你真的想在你的應用程序代碼中這樣做嗎?

        至少對我來說,答案是“不”。這正是 RFC 警告的內容;我不生氣。相反,我們鼓勵使用現有的異步框架之一: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);

        與手動創建套接字連接相比,這是一個更好的示例。這就是 RFC 的意思:應用程序開發人員不需要擔心纖程,它是 Amp 或 ReactPHP 等框架的實現細節。

        不過,這給我們帶來了一個問題:與我們已經可以用發電機做的事情相比,纖維有什么好處?RFC 是這樣解釋的:

        與無堆棧生成器不同,每個 Fiber 都有自己的調用堆棧,允許它們在深度嵌套的函數調用中暫停。聲明中斷點的函數(即調用 Fiber::suspend())不需要更改其返回類型,這與使用 yield 的函數必須返回 Generator 實例不同。

        Fiber 可以在任何函數調用中掛起,包括那些從 PHP VM 內部調用的函數,例如提供給 array_map 的函數或迭代器對象上的 foreach 調用的方法。

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

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

        所以就是這樣。如果您不是 Amp、ReactPHP 或較小的異步 PHP 框架的維護者,那么實際上沒有什么可說的。也許

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 一本久久a久久精品综合夜夜 | 91精品国产成人网在线观看| 亚洲福利精品一区二区三区| 99免费精品国产| 99精品视频在线观看| 亚洲欧美精品综合中文字幕| 国产精品秘入口福利姬网站| 国产精品高清一区二区人妖| 久久精品国产第一区二区三区| 亚洲а∨天堂久久精品| 国内精品免费久久影院| 欧美一区二区精品| 国产精品久久久久aaaa| 国产精品v片在线观看不卡| 无码日韩人妻精品久久蜜桃 | 色婷婷噜噜久久国产精品12p| 中文字幕久久精品无码| 亚洲日韩一页精品发布| 国产精品666| 国产精品久线在线观看| 亚洲精品黄色视频在线观看免费资源 | 亚洲精品无码专区在线在线播放| 精品久久久久久无码免费| 国产一级精品高清一级毛片| 国产精品 一区 在线| 国产精品麻豆入口| 精品91自产拍在线观看二区| 精品久久人人妻人人做精品 | 国产成人99久久亚洲综合精品| 久久成人国产精品二三区| 国产cosplay精品视频| 91精品国产乱码久久久久久| 国产精品美女久久久久久2018| 精品欧洲av无码一区二区| 国产精品露脸国语对白| 99re6在线视频精品免费| 国产精品www| 一本大道久久a久久精品综合| 91精品国产91久久| 精品成人av一区二区三区| 欧美日韩在线精品一区二区三区激情综合|