作用: 相對於 Swoole1.x,Swoole4+ 提供了協程這個大殺器,所有業務代碼都是同步的,但底層的 IO卻是異步的,保證併發的同時避免了傳統異步回調所帶來的離散的代碼邏輯和陷入多層回調中導致代碼無法維護
之前解決方案:
針對每種類型的客戶端都做了一個協程客戶端
3 個問題:
- 實現複雜,每個客戶端細枝末節的協議都很複雜,想都完美的支持工作量巨大。
- 用戶需要更改的代碼比較多,比如原來查詢 MySQL 是用的 PHP 原生的 PDO,那麼現在需要用
Swoole\Coroutine\MySQL 的方法。 - 我們很難覆蓋到所有的操作,比如 proc_open()、sleep() 函數等等也可能阻塞住導致程序變成同步阻塞的。
現在解決方案
採用 Hook 原生 PHP 函數的方式實現協程客戶端,通過一行代碼就可以讓原來的同步 IO 的代碼變成可以協程調度的異步IO,即一鍵協程化。
當前可以一鍵協程的函數和擴展
- redis 擴展
- 使用 mysqlnd 模式的 pdo_mysql、mysqli 擴展,如果未啓用 mysqlnd 將不支持協程化
- soap 擴展
- file_get_contents、fopen
- stream_socket_client (predis、php-amqplib)
- stream_socket_server
- stream_select (需要 4.3.2 以上版本)
- fsockopen
- proc_open (需要 4.4.0 以上版本)
- curl
當前不能一鍵協程的函數和擴展
- mysql:底層使用 libmysqlclient
- mongo:底層使用 mongo-c-client
- pdo_pgsql
- pdo_ori
- pdo_odbc
- pdo_firebird
詳細可以參考:官方的一鍵協程化