gRPC لـ PHP: المكتبات وأمثلة التنفيذ
gRPC (استدعاءات الإجراءات عن بُعد لـ gRPC) هو إطار عمل عالي الأداء لاستدعاء الإجراءات عن بُعد، تم تطويره بواسطة Google. يستخدم Protocol Buffers (protobuf) كلغة لوصف الواجهات وتسلسل البيانات. على عكس REST، يعمل gRPC عبر HTTP/2، ويدعم النقل الثنائي الاتجاه، ويوفر كتابة صارمة. في هذه المقالة، سنشرح كيفية توصيل gRPC في PHP، وما هي المكتبات التي يجب استخدامها، وسنكتب مثالًا كاملًا للتفاعل بين العميل والخادم.
نظرة عامة على مكتبات gRPC في PHP
للعمل مع gRPC في PHP، هناك طريقتان رئيسيتان:
- إضافة grpc.so — الإضافة الرسمية بلغة C من gRPC. توفر أقصى أداء، ولكنها تتطلب التجميع والإعداد على الخادم.
- عميل PHP نقي (على سبيل المثال،
grpc/grpcعبر Composer) — تنفيذ بلغة PHP يعمل عبر cURL و HTTP/2. أبطأ، لكنه أسهل في النشر.
للإنتاج، يُوصى باستخدام إضافة grpc، وللتطوير أو الاختبار، استخدم عميل PHP النقي.
تثبيت المكونات الضرورية
1. تثبيت protoc والإضافة لـ PHP
قم بتنزيل مترجم protobuf من المستودع الرسمي حسب نظام التشغيل الخاص بك. لتوليد كود PHP، ستحتاج إلى الإضافة protoc-gen-php-grpc:
# تثبيت protoc (لينكس)wget https://github.com/protocolbuffers/protobuf/releases/download/v25.0/protoc-25.0-linux-x86_64.zipunzip protoc-25.0-linux-x86_64.zip -d /usr/local/protocexport PATH=$PATH:/usr/local/protoc/bin
# تثبيت الإضافة لـ gRPC PHPsudo apt-get install php-dev php-cli php-pearsudo pecl install grpcsudo pecl install protobuf2. تثبيت تبعيات Composer
أنشئ مشروعًا وأضف الحزم الضرورية:
composer initcomposer require grpc/grpccomposer require google/protobufإنشاء ملف .proto
لنحدد خدمة بسيطة للعمل مع المستخدمين. أنشئ ملفًا باسم user.proto:
syntax = "proto3";
package user;
service UserService { rpc GetUser (UserRequest) returns (UserResponse); rpc ListUsers (Empty) returns (stream UserResponse);}
message UserRequest { int32 id = 1;}
message UserResponse { int32 id = 1; string name = 2; string email = 3;}
message Empty {}توليد كود PHP من .proto
نفذ الأمر لتجميع .proto إلى فئات PHP:
protoc --php_out=./generated --grpc_out=./generated \ --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin \ user.protoفي المجلد generated ستظهر الملفات:
GPBMetadata/User.php— بيانات وصفية لملف protoUser/UserRequest.php— فئة الطلبUser/UserResponse.php— فئة الردUser/UserServiceClient.php— عميل لاستدعاء الخدمة
تنفيذ خادم gRPC على PHP
للجزء الخادم، نستخدم الإضافة الرسمية grpc. أنشئ ملفًا باسم server.php:
<?phprequire_once __DIR__ . '/vendor/autoload.php';require_once __DIR__ . '/generated/User/UserServiceInterface.php';require_once __DIR__ . '/generated/User/UserServiceServer.php';
use Grpc\\Server;use User\\UserRequest;use User\\UserResponse;use User\\UserServiceServer;
class MyUserService extends UserServiceServer{ public function GetUser(\\User\\UserRequest $request): \\User\\UserResponse { $response = new UserResponse(); $response->setId($request->getId()); $response->setName('John Doe'); $response->setEmail('john@exa