Maison  >  Article  >  cadre php  >  Comment Swoole améliore les performances PHP

Comment Swoole améliore les performances PHP

(*-*)浩
(*-*)浩original
2019-12-07 14:19:002792parcourir

Comment Swoole améliore les performances PHP

La gestion des requêtes réseau dans Swoole est basée sur les événements et tire pleinement parti de l'implémentation sous-jacente d'epoll/kqueue, ce qui permet de répondre très facilement à des millions de requêtes.

Swoole4 utilise un nouveau moteur de noyau coroutine et dispose désormais d'une équipe de développement à temps plein. Nous entrons donc dans une période sans précédent dans l'histoire de PHP, offrant des possibilités uniques d'amélioration des performances à grande vitesse. (Apprentissage recommandé : tutoriel vidéo swoole )

Coroutine

Swoole4 ou supérieur possède une coroutine intégrée hautement disponible. Vous pouvez. utilisez du code entièrement synchrone pour obtenir des performances asynchrones, le code PHP n'a aucun mot-clé supplémentaire et la planification des coroutines est automatiquement effectuée sous le capot.

Les développeurs peuvent comprendre les coroutines comme des threads ultra-légers, et vous pouvez facilement créer des milliers de coroutines dans un processus.

Cela ne prend que 0,2 seconde pour lire des données massives de MySQL avec 10 000 requêtes simultanées

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

Serveur hybride

Vous pouvez Créez plusieurs services sur une boucle d'événements : TCP, HTTP, Websocket et HTTP2, et pouvez facilement héberger des dizaines de milliers de requêtes.

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn