Maison  >  Article  >  développement back-end  >  Introduction détaillée du mode d'exécution swoole pour accélérer l'application Laravel

Introduction détaillée du mode d'exécution swoole pour accélérer l'application Laravel

不言
不言avant
2018-12-29 09:52:253788parcourir

Cet article vous apporte une introduction détaillée au mode d'exécution de swoole pour accélérer les applications Laravel. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1. Swoole

Swoole est connu pour avoir redéfini PHP C'est une extension PHP qui permet d'exécuter PHP de manière asynchrone, tout comme node. et peut également utiliser des sockets, fournissant à PHP une série de fonctions d'E/S asynchrones, pilotées par des événements et de structure de données parallèle.
Swoole4 prend en charge un modèle de programmation coroutine complet et peut utiliser du code entièrement synchrone pour implémenter des programmes asynchrones. Il n'est pas nécessaire d'ajouter des mots-clés supplémentaires au code PHP. La couche inférieure effectue automatiquement la planification des coroutines pour implémenter les E/S asynchrones.
Presque tous les swoole que nodejs peuvent réaliser peuvent être réalisés, et les performances sont supérieures à celles de nodejs. Après tout, nodejs est monothread et ne peut pas utiliser pleinement les performances du processeur, tandis que swoole est multithread et peut pleinement utiliser. les performances du processeur.
Quelle est la différence entre l'efficacité de Swoole et le développement Web traditionnel ? En plus du modèle de développement synchrone LAMP/LNMP traditionnel, qu'est-ce que le modèle de développement asynchrone de Swoole ?

2. Modèle de développement web traditionnel
Le développement web PHP adopte l'architecture LAMP/LNMP, à savoir Linux, Nginx, Mysql et PHP. Voici nginx à titre d'exemple. La structure générale est :

Introduction détaillée du mode dexécution swoole pour accélérer lapplication Laravel

Lorsque la requête arrive, le serveur web transfère la requête vers PHP-FPM. PHP-FPM est un service FastCGI avec une architecture de pool de processus et un interpréteur PHP intégré. FPM est responsable de l'interprétation et de l'exécution des fichiers PHP pour générer des réponses, qui sont finalement renvoyées au serveur Web et affichées sur le front-end. De nombreuses logiques métier sont implémentées dans les fichiers PHP, notamment l'accès Mysql et Nosql, l'appel d'applications tierces, etc.
Avec une telle structure, la coopération entre php-fpm et nginx a assez bien fonctionné, mais comme php-fpm lui-même est un modèle de processus de blocage synchrone, toutes les ressources (y compris une série d'objets créés par l'initialisation du framework) sont libérées après la requête est terminée. Cela provoque l'"inactivité" du processus PHP (créer détruire créer) et consommer une grande quantité de ressources CPU, ce qui entraîne une capacité de débit limitée d'une seule machine.

Chaque processus de traitement de demande implique des opérations fastidieuses inutiles telles que l'analyse des fichiers PHP et les paramètres d'environnement. Le processus PHP est détruit après le traitement. Il est impossible d'utiliser le pooling de connexions et d'autres technologies dans les programmes PHP pour obtenir une optimisation des performances. .

3. Mode de fonctionnement de Swoole
Visant les problèmes de l'architecture traditionnelle, swoole résout les problèmes ci-dessus en fonction de l'extension PHP. Nous avons déjà compris le modèle de processus de swoole.

Par rapport à l'architecture traditionnelle, la plus grande caractéristique du modèle de processus Swoole est son mode Reactor multithread pour traiter les requêtes réseau, lui permettant de gérer facilement un grand nombre de connexions.

De plus, d'autres avantages incluent :

Entièrement asynchrone et non bloquant, faible consommation de ressources et efficacité d'exécution élevée du programme

Le programme analyse et charge uniquement le fichier PHP. une fois. Évitez les chargements répétés pour chaque requête

Le processus est résident, permettant de mettre en œuvre le pooling de connexions et le transfert d'informations entre les requêtes

4 Pourquoi exécuter Laravel sur Swoole ? >Le framework Laravel doit charger beaucoup de fichiers au démarrage. De plus, il est réputé pour son bon environnement écologique, donc au cours du processus de développement, nous constaterons qu'il y a beaucoup de roues déjà construites, qui. signifie que cela rend les E/S disque du démarrage de Laravel très élevées (c'est-à-dire qu'il doit charger beaucoup de fichiers)
Le cycle de vie de Laravel doit être exécuté à chaque fois qu'il est demandé. Parce que l'environnement créé par une seule requête sera détruit immédiatement après l'exécution de la requête.
En d'autres termes, dans le cycle de vie PHP traditionnel, beaucoup de temps est perdu à créer et à détruire des ressources pour l'exécution de scripts. Imaginez un framework comme Laravel, combien de fichiers doivent être chargés dans chaque requête ? Cela gaspille également beaucoup d'opérations d'E/S ?

Et si nous utilisions Swoole pour créer un serveur au niveau de l'application et que tous les fichiers de script pouvaient être enregistrés en mémoire après avoir été chargés une fois ? C'est pourquoi nous devons essayer d'exécuter Laravel sur Swoole. Swoole peut fournir des performances puissantes tandis que Laravel peut fournir une utilisation élégante de la structure de code. Ces deux-là sont vraiment une combinaison parfaite !

5.

Utiliser Swoole pour améliorer les performances de Laravel Parmi les roues existantes, je trouve que les deux suivantes sont quand même très bonnes, vous je peux choisir par toi-même

  • swooletw/laravel-swoole

  • garveen/laravoole

J'ai choisi le premier Pour tester

installer à l'aide de composer :

composer require swooletw/laravel-swoole
Si vous utilisez laravel, ajoutez

SwooleTW\Http\LaravelServiceProvider::class,
au tableau des fournisseurs dans config/app.php si vous que vous utilisez est lumen, puis ajoutez le code suivant à bootstrap/app.php

$app->register(SwooleTW\Http\LumenServiceProvider::class);
Exportez le fichier de configuration vers le répertoire de configuration

php artisan vendor:publish --provider="SwooleTW\Http\HttpServiceProvider"
Ensuite, vous pouvez aller dans config/swoole_http .php Informations de configuration

'server' => [
        'host' => env('SWOOLE_HTTP_HOST', '0.0.0.0'),//监听任意ip
        'port' => env('SWOOLE_HTTP_PORT', '1215'),
        'options' => [
            'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('storage/logs/swoole_http.pid')),
            'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')),
            'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', 1),//1-程序将转入后台作为守护进程运行
        ],
],
swoole_http.php fournit également un tableau de fournisseurs de configuration,

'providers' => [
    // App\Providers\AuthServiceProvider::class,
]
Parce qu'après avoir utilisé swoole comme http, ces fournisseurs seront stockés en mémoire, ils sont configurés ici Sont des fournisseurs qui souhaitent se réinscrire et redémarrer à chaque demande.

Maintenant, vous pouvez exécuter la commande suivante pour démarrer le service HTTP Swoole.

$ php artisan swoole:http start

然后你可以看到以下信息:

Starting swoole http server...
Swoole http server started: <http:></http:>

现在可以通过访问 http://127.0.0.1:1215 来进入 Laravel 应用。
注意:该拓展是不支持热启动的,所以每次有代码更新都要重启服务 php artisan swoole:http restart

六、性能测试
使用Apache的ab测试工具

ab -n 1000 -c 10 http://127.0.0.1:1215/

参数说明:-n 1000个请求 -c 10个并发数

Introduction détaillée du mode dexécution swoole pour accélérer lapplication Laravel

Introduction détaillée du mode dexécution swoole pour accélérer lapplication Laravel

图一是使用swoole作为应用服务器,图二是apache服务器
测试环境在虚拟机中,电脑配置也较差,性能没有完全发挥出来,可以看到apache只完成197次请求就扛不住压力了,swoole HTTP服务 完成了压测,性功完全碾压apache服务器。

七、使用Nginx代理

swoole在官网也提到过:swoole_http_server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理。
那么,我们就增加需要配置nginx.conf里的server:

server {
    listen 80;
    server_name your.domain.com;
    root /path/to/laravel/public;
    index index.php;

    location = /index.php {
        # Ensure that there is no such file named "not_exists"
        # in your "public" directory.
        try_files /not_exists @swoole;
    }

    location / {
        try_files $uri $uri/ @swoole;
    }

    location @swoole {
        set $suffix "";

        if ($uri = /index.php) {
            set $suffix "/";
        }

        proxy_set_header Host $host;
        proxy_set_header SERVER_PORT $server_port;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # IF https
        # proxy_set_header HTTPS "on";

        proxy_pass http://127.0.0.1:1215$suffix;
    }
}

配置可参考swoole方文档官 Nginx/Apache配置
至此,大功告成,你可以像平常一样访问你的网站了。

八、使用swoole和传统php开发的缺点
本文主要介绍了使用swoole作为laravel的应服务器,最后说下使用swoole和传统php开发的缺点。
1、更难上手。这要求开发人员对于多进程的运行模式有更清晰的认识
2、更容易内存泄露。在处理全局变量,静态变量的时候一定要小心,这种不会被GC清理的变量会存在整个生命周期中,如果没有正确的处理,很容易消耗完所有的内存。在php-fpm下,php代码执行完内存就会被完全释放。


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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:qu'est-ce que JuliaArticle suivant:qu'est-ce que Julia