Swoole中的網路請求處理是基於事件的,並且充分利用了底層的epoll / kqueue實現,使得為數百萬個請求提供服務變得非常容易。
Swoole4使用全新的協程核心引擎,現在它擁有一個全職的開發團隊,因此我們正在進入PHP歷史上前所未有的時期,為效能的高速提升提供了獨一無二的可能性。 (建議學習: swoole視訊教學)
#協程
Swoole4或更高版本擁有高可用性的內建協程,您可以使用完全同步的程式碼來實現非同步效能,PHP程式碼沒有任何額外的關鍵字,底層會自動進行協程調度。
開發者可以將協程理解為超輕量級的線程, 你可以非常容易地在一個進程中創建成千上萬個協程。
並發1萬個請求從MySQL讀取大量資料只需要0.2秒
$s = microtime(true); Co\run(function() { for ($c = 100; $c--;) { go(function () { $mysql = new Swoole\Coroutine\MySQL; $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 Swoole\WebSocket\Server('127.0.0.1', 9501, SWOOLE_BASE); $server->set(['open_http2_protocol' => true]); // http && http2 $server->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) { $response->end('Hello ' . $request->rawcontent()); }); // websocket $server->on('message', function (Swoole\WebSocket\Server $server, Swoole\WebSocket\Frame $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 (Swoole\Server $server, int $fd, int $reactor_id, string $data) { $server->send($fd, tcp_pack('Hello ' . tcp_unpack($data))); }); $server->start();
以上是swoole如何提高php效能的詳細內容。更多資訊請關注PHP中文網其他相關文章!