84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
看到一篇文章 PHP 使用協同程式實現合作多任務,講的是透過 php 的 yield 實現了協程。但是文章太長沒看完,大致看了一下。
PHP 的協程在專案中何時會用上?
或有沒有適用的場景?
目前有對其封裝的函式庫嗎?
協程可以用在,非同步網路 IO 的時候,使其成為非阻塞的。
例如你在一個 http 請求裡面,你需要請求外面的接口,那麼會有下面的場景。
你的前置 server 是 nginx,nginx 是非阻塞異步的,但是 php-fpm 是同步阻塞的。那麼當你在請求外面接口的時候,這個任務就會被阻塞。 (這裡補充一下,php-fpm 的 Worker 流程是同步阻塞的)
假設你使用協程,那麼當你在請求介面的時候,你的這個任務就可以暫停,保存上下文。然後呢,當你的介面回來了之後,重新調起這個任務繼續執行。你的進程就不必耗在這一個任務上了,可以去處理其它的 http 請求了。這樣是不是並發量就高了?
同理,當你的請求在查詢資料庫的時候,也是一個 IO 請求,也是同步的。協程就可以讓你這些 IO 程式設計非同步非阻塞的,從而增加你的並發量。這主要是讓你的 CPU 可以在等待 IO 的時候,可以處理別的事情。所有的 IO 請求都可以透過協程做到這一點。
你的這篇文章我看過,是很好的一篇文章。這裡作者用 yield 實現了一個任務調度,就是乾我上面說的那些事情的。你也可以看看鳥哥翻譯的 http://www.laruence.com/2015/...,可以說是對你所看到的這個翻譯的一個補充。他透過 yield 實現了一個非同步非阻塞的伺服器,當然只是一個 demo 啦。有個例子看起來應該會好一點。
目前我遇到的,看到laravel框架model以遊標方式取資料時,用的是yield來防止一次性取資料太多導致記憶體不足的問題
最基礎的是導入或導出大量資料到excel,假設導出/導出過程需要對資料進行處理一下,這個時候可以用。
協程可以用在,非同步網路 IO 的時候,使其成為非阻塞的。
例如你在一個 http 請求裡面,你需要請求外面的接口,那麼會有下面的場景。
你的前置 server 是 nginx,nginx 是非阻塞異步的,但是 php-fpm 是同步阻塞的。那麼當你在請求外面接口的時候,這個任務就會被阻塞。 (這裡補充一下,php-fpm 的 Worker 流程是同步阻塞的)
假設你使用協程,那麼當你在請求介面的時候,你的這個任務就可以暫停,保存上下文。然後呢,當你的介面回來了之後,重新調起這個任務繼續執行。你的進程就不必耗在這一個任務上了,可以去處理其它的 http 請求了。這樣是不是並發量就高了?
同理,當你的請求在查詢資料庫的時候,也是一個 IO 請求,也是同步的。協程就可以讓你這些 IO 程式設計非同步非阻塞的,從而增加你的並發量。這主要是讓你的 CPU 可以在等待 IO 的時候,可以處理別的事情。所有的 IO 請求都可以透過協程做到這一點。
你的這篇文章我看過,是很好的一篇文章。這裡作者用 yield 實現了一個任務調度,就是乾我上面說的那些事情的。你也可以看看鳥哥翻譯的 http://www.laruence.com/2015/...,可以說是對你所看到的這個翻譯的一個補充。他透過 yield 實現了一個非同步非阻塞的伺服器,當然只是一個 demo 啦。有個例子看起來應該會好一點。
目前我遇到的,看到laravel框架model以遊標方式取資料時,用的是yield來防止一次性取資料太多導致記憶體不足的問題
最基礎的是導入或導出大量資料到excel,假設導出/導出過程需要對資料進行處理一下,這個時候可以用。