swoole1.6.12后增加了異步文件讀寫,異步DNS等特性。自此建立了完整的異步并行API。
Task進程
是同步阻塞的,沒有EventLoop
,因此無法使除定時器之外的用任何異步IOswoole_async_set
關(guān)閉signalfd
特性Swoole支持3種類型的異步文件讀寫IO,可以使用swoole_async_set
來設(shè)置AIO模式。
此函數(shù)可以設(shè)置異步IO相關(guān)的選項。
swoole_async_set(array $setting);
SWOOLE_AIO_BASE
(使用類似于Node.js的線程池同步阻塞模擬異步)、SWOOLE_AIO_LINUX
(Linux Native AIO) 2種模式Linux Native AIO的優(yōu)點是由內(nèi)核支持是真正的異步文件IO,缺點是只支持DirectIO,無法利用到系統(tǒng)的PageCache
swoole_async模塊目前為實驗性質(zhì),不建議在生產(chǎn)環(huán)境使用,請使用PHP的文件讀寫函數(shù)。
基于Linux Native AIO系統(tǒng)調(diào)用,是真正的異步IO,并非阻塞模擬。
優(yōu)點:
缺點:
基于線程池模擬實現(xiàn),文件讀寫請求投遞到任務(wù)隊列,然后由AIO線程讀寫文件,完成后通知主線程。AIO線程本身是同步阻塞的。所以并非真正的異步IO。
優(yōu)點:
可修改
thread_num
項設(shè)置啟用的AIO線程數(shù)量
缺點:
$fp = stream_socket_client("tcp://127.0.0.1:80", $code, $msg, 3);
$http_request = "GET /index.html HTTP/1.1\r\n\r\n";
fwrite($fp, $http_request);
Swoole\Event::add($fp, function($fp){
echo fread($fp, 8192);
swoole_event_del($fp);
fclose($fp);
});
Swoole\Timer::after(2000, function() {
echo "2000ms timeout\n";
});
Swoole\Timer::tick(1000, function() {
echo "1000ms interval\n";
});
更多建議: