Dalam beberapa tahun kebelakangan ini, dengan pembangunan berterusan aplikasi rangkaian, semakin banyak aplikasi perlu melaksanakan fungsi Remote Procedure Call (RPC). Rangka kerja RPC tradisional seperti Dubbo, Thrift, gRPC, dsb. boleh memenuhi permintaan ini Namun, dengan peningkatan aplikasi dan perniagaan, masalah prestasi menjadi semakin jelas. Untuk menyelesaikan masalah ini, komuniti sumber terbuka melancarkan pelayan RPC berprestasi tinggi berdasarkan bahasa PHP-Swoole.
Swoole ialah rangka kerja komunikasi rangkaian tak segerak, selari, berprestasi tinggi yang dibangunkan berdasarkan bahasa PHP, yang membolehkan program PHP memproses permintaan rangkaian dengan lebih cekap. Pelayan RPC ialah komponen Swoole Ia menyediakan kaedah panggilan prosedur jauh berdasarkan protokol TCP, menyokong I/O tak segerak, coroutine, pengurusan proses dan ciri-ciri lain, dan boleh melaksanakan perkhidmatan RPC berprestasi tinggi dan berkonkurensi tinggi dengan mudah.
Seterusnya, kami akan memperkenalkan cara menggunakan Swoole untuk melaksanakan pelayan RPC berprestasi tinggi.
Sebelum kita bermula, kita perlu memasang sambungan Swoole terlebih dahulu. Memandangkan Swoole bergantung pada sambungan C asas PHP, anda perlu memasang pengkompil C dan perpustakaan bergantung Swoole terlebih dahulu.
yum install -y gcc automake autoconf libtool make php-devel php-pear pcre-devel openssl-devel
Selepas memasang perpustakaan bergantung, kita boleh menggunakan arahan pecl untuk memasang sambungan Swoole:
pecl install swoole
Selepas pemasangan selesai, kita perlu menambah baris berikut pada php.ini fail untuk mendayakan sambungan Swoole:
extension=swoole.so
Selepas memasang sambungan Swoole, kami boleh mula melaksanakan pelayan RPC. Di sini kita akan menggunakan mekanisme refleksi PHP untuk melaksanakan pendaftaran perkhidmatan automatik, dan coroutine Swoole untuk mengendalikan I/O tak segerak.
Pertama, kita perlu mencipta kelas perkhidmatan untuk mendedahkan kaedah untuk panggilan jauh. Dalam kelas ini, kita boleh mentakrifkan berbilang kaedah dan menggunakan DocBlock PHP untuk menandakan parameter dan jenis nilai pulangan kaedah untuk menjana dokumentasi dan petua kod secara automatik.
/** * @method string hello(string $name) */ class MyService { public function hello(string $name): string { return "Hello, $name!"; } }
Dalam kod di atas, kami mentakrifkan kelas MyService, yang mengandungi kaedah bernama hello, yang menerima parameter jenis rentetan $name dan mengembalikan data jenis rentetan.
Seterusnya, kita perlu melaksanakan pelayan RPC untuk menerima permintaan pelanggan dan memanggil kaedah yang sepadan dalam kelas perkhidmatan untuk mengendalikan permintaan.
$server = new SwooleServer('127.0.0.1', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); /** * 注册服务 */ $server->set([ 'worker_num' => 1, 'dispatch_mode' => 1, ]); $myService = new MyService(); $methods = get_class_methods($myService); $availableMethods = []; foreach ($methods as $method) { // 忽略 __* 类型的方法,私有方法和构造方法 if (!preg_match('/^__|^get[A-Z]/i', $method) && is_callable([$myService, $method])) { $availableMethods[] = $method; } } $server->on('WorkerStart', function () use ($availableMethods, $myService) { // 打开协程支持 SwooleRuntime::enableCoroutine(); $service = new HproseSwooleSocketService(); foreach ($availableMethods as $method) { $service->addFunction([$myService, $method], $method); } $server = new HproseSwooleSocketServer('tcp://0.0.0.0:9501'); //监听 RPC 请求 $coroutine = new SwooleCoroutineHttpClient(); $coroutine->setHeaders([ 'Content-Type' => 'text/plain', ]); while (true) { $socket = $server->accept(); if ($socket !== false) { $socket->setOption(['open_length_check' => 1]); $socket->setOption(['package_length_type' => 'N']); $socket->setOption(['package_length_offset' => 0]); $socket->setOption(['package_body_offset' => 4]); $socket->start(); $client = new SwooleCoroutineClient(SWOOLE_SOCK_TCP); $client->connect('127.0.0.1', 9502); $client->send($socket->recv()); $out = $client->recv(); $socket->send($out); $socket->close(); } } }); $server->start();
Dalam kod di atas, kami mencipta objek $server yang mendengar pada alamat dan port 127.0.0.1:9501, menggunakan mod proses SWOOLE_PROCESS dan protokol SWOOLE_SOCK_TCP.
Selepas pelayan dimulakan, kami menggunakan mekanisme refleksi PHP untuk mendapatkan semua kaedah boleh panggil dalam kelas perkhidmatan. Kemudian, kami menggunakan coroutine Swoole untuk mendengar permintaan RPC dan mengendalikan permintaan dengan memanggil kaedah kelas perkhidmatan. Semasa proses pelaksanaan, kami menggunakan perpustakaan pihak ketiga Hprose, yang menyediakan cara yang mudah dan jelas untuk melaksanakan perkhidmatan RPC dan sangat mudah digunakan.
Akhir sekali, kita perlu mencipta pelanggan untuk meminta perkhidmatan RPC. Dalam contoh ini, kita boleh menggunakan kelas Klien yang disertakan dengan Hprose untuk mencapai ini.
$client = new HproseHttpClient('http://127.0.0.1:9501/', false); echo $client->hello('Swoole');
Dalam kod di atas, kami mencipta objek klien HTTP Hprose dan memanggil kaedah helo dalam kelas perkhidmatan untuk memulakan permintaan kepada pelayan RPC.
Swoole ialah rangka kerja komunikasi rangkaian yang berkuasa yang menyediakan banyak ciri tak segerak, selari dan berprestasi tinggi, yang boleh meningkatkan keupayaan pemprosesan program PHP. Dengan mengkaji kandungan dalam artikel ini, kami boleh melaksanakan pelayan RPC berprestasi tinggi, berkonkurensi tinggi dan meningkatkan kecekapan pemprosesan dan pengendalian program PHP.
Atas ialah kandungan terperinci Swoole melaksanakan pelayan RPC berprestasi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!