看到一篇文章 PHP 使用協同程式實現合作多任務,講的是透過 php 的 yield 實現了協程。但是文章太長沒看完,大致看了一下。
PHP 的協程在專案中何時會用上?
或有沒有適用的場景?
目前有對其封裝的函式庫嗎?
PHP中文网2017-07-03 11:42:23
協程可以用在,非同步網路 IO 的時候,使其成為非阻塞的。
例如你在一個 http 請求裡面,你需要請求外面的接口,那麼會有下面的場景。
你的前置 server 是 nginx,nginx 是非阻塞異步的,但是 php-fpm 是同步阻塞的。那麼當你在請求外面接口的時候,這個任務就會被阻塞。 (這裡補充一下,php-fpm 的 Worker 流程是同步阻塞的)
假設你使用協程,那麼當你在請求介面的時候,你的這個任務就可以暫停,保存上下文。然後呢,當你的介面回來了之後,重新調起這個任務繼續執行。你的進程就不必耗在這一個任務上了,可以去處理其它的 http 請求了。這樣是不是並發量就高了?
同理,當你的請求在查詢資料庫的時候,也是一個 IO 請求,也是同步的。協程就可以讓你這些 IO 程式設計非同步非阻塞的,從而增加你的並發量。這主要是讓你的 CPU 可以在等待 IO 的時候,可以處理別的事情。所有的 IO 請求都可以透過協程做到這一點。
你的這篇文章我看過,是很好的一篇文章。這裡作者用 yield 實現了一個任務調度,就是乾我上面說的那些事情的。你也可以看看鳥哥翻譯的 http://www.laruence.com/2015/...,可以說是對你所看到的這個翻譯的一個補充。他透過 yield 實現了一個非同步非阻塞的伺服器,當然只是一個 demo 啦。有個例子看起來應該會好一點。