swoole中的網絡請求處理是基于事件的,并且充分利用了底層的epoll / kqueue實現,使得為數百萬個請求提供服務變得非常容易。
Swoole4使用全新的協程內核引擎,現在它擁有一個全職的開發團隊,因此我們正在進入php歷史上前所未有的時期,為性能的高速提升提供了獨一無二的可能性。 ? (推薦學習: swoole視頻教程)
協程
Swoole4或更高版本擁有高可用性的內置協程,您可以使用完全同步的代碼來實現異步性能,PHP代碼沒有任何額外的關鍵字,底層會自動進行協程調度。
立即學習“PHP免費學習筆記(深入)”;
開發者可以將協程理解為超輕量級的線程, 你可以非常容易地在一個進程中創建成千上萬個協程。
$s?=?microtime(true); Corun(function()?{ ????for?($c?=?100;?$c--;)?{ ????????go(function?()?{ ????????????$mysql?=?new?SwooleCoroutineMySQL; ????????????$mysql->connect([ ????????????????'host'?=>?'127.0.0.1', ????????????????'user'?=>?'root', ????????????????'password'?=>?'root', ????????????????'database'?=>?'test' ????????????]); ????????????$statement?=?$mysql->prepare('SELECT?*?FROM?`user`'); ????????????for?($n?=?100;?$n--;)?{ ????????????????$result?=?$statement->execute(); ????????????????assert(count($result)?>?0); ????????????} ????????}); ????} }); echo?'use?'?.?(microtime(true)?-?$s)?.?'?s';
混合服務器
你可以在一個事件循環上創建多個服務:TCP,http,websocket和HTTP2,并且能輕松承載上萬請求。
function?tcp_pack(string?$data):?string { ????return?pack('N',?strlen($data))?.?$data; } function?tcp_unpack(string?$data):?string { ????return?substr($data,?4,?unpack('N',?substr($data,?0,?4))[1]); } $tcp_options?=?[ ????'open_length_check'?=>?true, ????'package_length_type'?=>?'N', ????'package_length_offset'?=>?0, ????'package_body_offset'?=>?4 ]; --------------------------------------------------------------------------------------------------------------- $server?=?new?SwooleWebSocketServer('127.0.0.1',?9501,?SWOOLE_BASE); $server->set(['open_http2_protocol'?=>?true]); //?http?&&?http2 $server->on('request',?function?(SwooleHttpRequest?$request,?SwooleHttpResponse?$response)?{ ????$response->end('Hello?'?.?$request->rawcontent()); }); //?websocket $server->on('message',?function?(SwooleWebSocketServer?$server,?SwooleWebSocketFrame?$frame)?{ ????$server->push($frame->fd,?'Hello?'?.?$frame->data); }); //?tcp $tcp_server?=?$server->listen('127.0.0.1',?9502,?SWOOLE_TCP); $tcp_server->set($tcp_options); $tcp_server->on('receive',?function?(SwooleServer?$server,?int?$fd,?int?$reactor_id,?string?$data)?{ ????$server->send($fd,?tcp_pack('Hello?'?.?tcp_unpack($data))); }); $server->start();
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦