Home  >  Article  >  PHP Framework  >  How swoole improves php performance

How swoole improves php performance

(*-*)浩
(*-*)浩Original
2019-12-07 14:19:002665browse

How swoole improves php performance

Network request handling in Swoole is event-based and takes full advantage of the underlying epoll/kqueue implementation, making it very easy to serve millions of requests.

Swoole4 uses a new coroutine kernel engine, and now it has a full-time development team, so we are entering an unprecedented period in PHP history, providing unique possibilities for rapid performance improvements. (Recommended learning: swoole video tutorial)

Coroutine

Swoole4 or higher has a built-in coroutine with high availability. You can use fully synchronous code to achieve asynchronous performance, the PHP code does not have any additional keywords, and coroutine scheduling is automatically performed under the hood.

Developers can understand coroutines as ultra-lightweight threads, and you can easily create thousands of coroutines in a process.

It only takes 0.2 seconds to read massive data from MySQL with 10,000 concurrent requests

$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';

Hybrid server

You can Create multiple services on an event loop: TCP, HTTP, Websocket and HTTP2, and can easily host tens of thousands of requests.

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();

The above is the detailed content of How swoole improves php performance. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn