Avec le développement rapide d'Internet, de plus en plus d'entreprises ont commencé à s'impliquer dans le développement Web, et comment améliorer les performances des services Web est devenu une question clé. Ces dernières années, la programmation asynchrone est progressivement devenue populaire en tant que technologie permettant d'améliorer l'efficacité des E/S du réseau, et le framework Swoole est l'un des représentants de la programmation asynchrone. Dans cet article, nous présenterons comment implémenter la programmation asynchrone via le framework Swoole et démontrerons son effet significatif sur l'amélioration des performances des services Web.
1. Qu'est-ce que Swoole
Swoole est un framework de communication réseau hautes performances, asynchrone et simultané. Il permet aux développeurs PHP d'écrire plus facilement du code asynchrone et d'améliorer l'efficacité et les performances du code. Swoole fournit un socket de domaine TCP/UDP/Unix, un serveur HTTP, un serveur WebSocket, ainsi que des fonctions de texte asynchrone, de sérialisation et de désérialisation JSON. Actuellement, Swoole est favorisé par de plus en plus de développeurs PHP.
2. Plusieurs points à noter lors de l'utilisation de Swoole
1. Ouvrez la coroutine :
Dans Swoole, afin de supporter la programmation asynchrone, nous Les coroutines doivent être activées. Les coroutines sont une méthode de planification plus légère que les threads car il n'y a pas de surcharge supplémentaire de changement de contexte et de ressources en mode noyau.
Utiliser Swoole Il est très pratique d'utiliser des coroutines Il vous suffit d'ajouter le code suivant au fichier d'entrée ou à l'objet serveur Swoole :
SwooleRuntime::enableCoroutine();
De cette façon, vous pouvez. utilisez la fonction coroutine fournie par Swoole .
2. Faites attention aux fuites de mémoire :
Lorsque vous utilisez Swoole pour la programmation asynchrone, vous devez faire attention aux fuites de mémoire. Étant donné que la coroutine dans la programmation asynchrone attendra longtemps les E/S, si la mémoire n'est pas libérée à temps, cela entraînera un gaspillage de mémoire.
Swoole fournit une méthode pour nettoyer le contexte de la coroutine : Coroutine::defer(). Utilisez-le pour nettoyer le contexte à la fin de la coroutine, par exemple :
SwooleCoroutineun(function () { echo "Coroutine Start "; Coroutine::defer(function () { echo "Coroutine End "; }); });
3 Faites attention à la version de Swoole :
La nouvelle version de Swoole le sera. continue d'être optimisé et amélioré, nous devons donc utiliser la dernière version. Dans le même temps, vous devez faire attention aux modifications apportées à chaque version pour garantir la compatibilité et la stabilité du code.
3. Pratique Swoole : améliorer les performances des services Web
Ci-dessous, nous utilisons un exemple simple pour démontrer comment utiliser le framework Swoole pour améliorer les performances des services Web.
Nous créons d'abord un simple fichier PHP server.php. Ce fichier écoutera le port 9501 local et renverra une chaîne Hello World :
<?php $http = new SwooleHttpServer("0.0.0.0", 9501); $http->on("request", function ($request, $response) { $response->header("Content-Type", "text/plain"); $response->end("Hello World! "); }); $http->start();
Exécutez ceci à partir de la ligne de commande. et accédez à http://127.0.0.1:9501/, vous pouvez voir que Hello World est affiché.
Maintenant, nous changeons le code de ce serveur en mode asynchrone :
<?php $http = new SwooleHttpServer("0.0.0.0", 9501, SWOOLE_BASE); $http->on("request", function ($request, $response) { $response->header("Content-Type", "text/plain"); $response->end("Hello World! "); }); $http->start();
Dans le code ci-dessus, nous avons ajouté le troisième paramètre, qui consiste à utiliser le mode SWOOLE_BASE pour démarrer le serveur . De cette façon, nous pouvons utiliser les coroutines, les fonctions d'E/S asynchrones et d'écoute d'événements fournies par Swoole.
Ensuite, nous utiliserons l'outil Apache Bench pour tester les performances du serveur lors du traitement d'un grand nombre de requêtes.
L'outil Apache Bench peut simuler de vraies requêtes HTTP Nous pouvons utiliser les requêtes simultanées multithread qu'il fournit pour simuler plusieurs utilisateurs accédant au serveur en même temps et tester les performances du serveur sous différentes requêtes. charges.
Entrez la commande suivante dans le terminal pour installer l'outil Apache Bench :
# ubuntu sudo apt-get install apache2-utils # centos sudo yum install httpd-tools
Utilisez la commande suivante pour tester les performances du serveur tout à l'heure :
ab -n 1000 -c 100 http://127.0.0.1:9501
Concurrency Level: 100 Time taken for tests: 0.041 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 110000 bytes HTML transferred: 12000 bytes Requests per second: 24540.63 [#/sec] (mean) Time per request: 4.075 [ms] (mean) Time per request: 0.041 [ms] (mean, across all concurrent requests) Transfer rate: 2624.27 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.2 0 1 Processing: 1 4 0.5 4 6 Waiting: 0 4 0.5 4 6 Total: 1 4 0.5 4 6 Percentage of the requests served within a certain time (ms) 50% 4 66% 4 75% 4 80% 4 90% 4 95% 5 98% 5 99% 5 100% 6 (longest request)
ab -n 10000 -c 1000 http://127.0.0.1:9501
Concurrency Level: 1000 Time taken for tests: 2.437 seconds Complete requests: 10000 Failed requests: 0 Total transferred: 1100000 bytes HTML transferred: 120000 bytes Requests per second: 4107.95 [#/sec] (mean) Time per request: 243.651 [ms] (mean) Time per request: 0.244 [ms] (mean, across all concurrent requests) Transfer rate: 441.50 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 8 84.5 0 1000 Processing: 1 22 16.0 20 176 Waiting: 0 21 16.0 20 176 Total: 1 30 86.2 20 1001 Percentage of the requests served within a certain time (ms) 50% 20 66% 23 75% 25 80% 26 90% 30 95% 41 98% 52 99% 65 100% 1001 (longest request)
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!