Dengan perkembangan pesat Internet, semakin banyak syarikat terlibat dalam pembangunan web, dan cara meningkatkan prestasi perkhidmatan web telah menjadi isu utama. Dalam beberapa tahun kebelakangan ini, pengaturcaraan tak segerak secara beransur-ansur menjadi popular sebagai teknologi untuk meningkatkan kecekapan rangkaian IO, dan rangka kerja Swoole adalah salah satu wakil pengaturcaraan tak segerak. Dalam artikel ini, kami akan memperkenalkan cara melaksanakan pengaturcaraan tak segerak melalui rangka kerja Swoole dan menunjukkan kesan ketaranya dalam meningkatkan prestasi perkhidmatan web.
1. Apakah itu Swoole
Swoole ialah rangka kerja komunikasi rangkaian berprestasi tinggi, tak segerak dan serentak. Ia memudahkan pembangun PHP untuk menulis kod tak segerak dan meningkatkan kecekapan dan prestasi kod. Swoole menyediakan Soket domain TCP/UDP/Unix, pelayan HTTP, pelayan WebSocket, serta teks tak segerak, fungsi bersiri JSON dan penyahsirilan. Pada masa ini, Swooole digemari oleh semakin ramai pembangun PHP.
2. Beberapa perkara yang perlu diberi perhatian apabila menggunakan Swoole
1 Dayakan coroutine:
Dalam Swoole, untuk menyokong pengaturcaraan tak segerak, kami perlu mendayakan coroutine. Coroutine ialah kaedah penjadualan yang lebih ringan daripada utas kerana tiada overhed tambahan bagi penukaran konteks dan sumber mod kernel.
Menggunakan Swoole untuk menggunakan coroutine adalah sangat mudah Anda hanya perlu menambah kod berikut pada fail entri atau objek pelayan Swoole:
SwooleRuntime::enableCoroutine();
Dengan cara ini, anda boleh menggunakan fungsi coroutine yang disediakan. oleh Swoole.
2. Beri perhatian kepada kebocoran memori:
Apabila menggunakan Swoole untuk pengaturcaraan tak segerak, anda perlu memberi perhatian kepada kebocoran memori. Kerana coroutine dalam pengaturcaraan tak segerak akan menunggu I/O untuk masa yang lama, jika ingatan tidak dikeluarkan dalam masa, ia akan menyebabkan pembaziran ingatan.
Swoole menyediakan kaedah untuk membersihkan konteks coroutine: Coroutine::defer(). Gunakannya untuk membersihkan konteks di penghujung coroutine, contohnya:
SwooleCoroutineun(function () { echo "Coroutine Start "; Coroutine::defer(function () { echo "Coroutine End "; }); });
3. Perhatikan versi Swoole:
Versi baharu Swoole akan terus dioptimumkan dan dipertingkatkan, jadi kami perlu menggunakan versi terkini. Pada masa yang sama, anda perlu memberi perhatian kepada perubahan dalam setiap versi untuk memastikan keserasian dan kestabilan kod.
3. Amalan Swoole: Meningkatkan Prestasi Perkhidmatan Web
Di bawah kami menggunakan contoh mudah untuk menunjukkan cara menggunakan rangka kerja Swoole untuk meningkatkan prestasi perkhidmatan Web.
Kami mula-mula mencipta pelayan fail PHP mudah.php Fail ini akan mendengar port tempatan 9501 dan mengembalikan rentetan 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();
Jalankan fail ini menggunakan baris arahan dan akses http. ://127.0.0.1:9501/, anda boleh melihat bahawa Hello World adalah output.
Kini kami menukar kod pelayan ini kepada mod tak segerak:
<?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();
Dalam kod di atas, kami menambah parameter ketiga, iaitu menggunakan mod SWOOLE_BASE untuk memulakan pelayan. Dengan cara ini, kita boleh menggunakan coroutine, IO tak segerak dan fungsi mendengar acara yang disediakan oleh Swoole.
Seterusnya, kami akan menggunakan alat Apache Bench untuk menguji prestasi pelayan apabila mengendalikan sejumlah besar permintaan.
Alat Apache Bench boleh mensimulasikan permintaan HTTP sebenar Kami boleh menggunakan permintaan serentak berbilang benang yang disediakannya untuk mensimulasikan berbilang pengguna yang mengakses pelayan pada masa yang sama dan menguji prestasi pelayan di bawah beban permintaan yang berbeza.
Masukkan arahan berikut dalam terminal untuk memasang alat Apache Bench:
# ubuntu sudo apt-get install apache2-utils # centos sudo yum install httpd-tools
Gunakan arahan berikut untuk menguji prestasi pelayan sebentar tadi:
ab -n 1000 -c 100 http://127.0.0.1:9501
Dalam arahan ini, kita menggunakan parameter -n Jumlah bilangan permintaan, -c menunjukkan bilangan permintaan serentak. Kami menetapkan jumlah permintaan kepada 1000 dan jumlah permintaan serentak kepada 100.
Selepas ujian selesai, kita dapat melihat keputusan ujian yang dicetak oleh Apache Bench:
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)
Kita dapat melihat bahawa apabila pelayan ini mengendalikan 1000 permintaan, purata masa tindak balas setiap permintaan ialah 4.075 milisaat, bilangan permintaan respons sesaat adalah lebih kurang 24540. Keputusan prestasi ini sudah sangat baik.
Seterusnya, kami meningkatkan beban pelayan untuk melihat prestasi rangka kerja Swoole dalam keadaan serentak yang tinggi. Kami menambah bilangan permintaan serentak kepada 1000, iaitu:
ab -n 10000 -c 1000 http://127.0.0.1:9501
Selepas ujian selesai, kami melihat keputusan ujian dicetak oleh Apache Bench sekali lagi:
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)
Seperti yang anda lihat, apabila bilangan concurrency mencapai 1000 , masa respons pelayan ini hanya kira-kira 200ms. Berbanding dengan pelayan web segerak dengan pengaturcaraan bukan tak segerak, Swoole boleh meningkatkan konkurensi dan prestasi dengan sangat baik.
4. Ringkasan
Artikel ini memperkenalkan rangka kerja Swoole dan aplikasinya dalam meningkatkan prestasi perkhidmatan web. Kami mempelajari cara menggunakan Swoole untuk memulakan coroutine, memberi perhatian kepada kebocoran memori dan cara menguji prestasi pelayan tak segerak Swoole.
Dalam amalan, kami boleh menggunakan alatan yang cekap seperti alatan Swoole dan Apache Bench untuk meningkatkan prestasi perkhidmatan web. Dalam senario konkurensi tinggi di Internet, menggunakan Swoole untuk pengaturcaraan tak segerak boleh meningkatkan prestasi pelayan dan memenuhi keperluan perusahaan untuk perkhidmatan web berprestasi tinggi.
Atas ialah kandungan terperinci Amalan pengaturcaraan tak segerak swoole: tingkatkan prestasi perkhidmatan web sepuluh kali ganda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!