gRPC لـ PHP: المكتبات والأمثلة
\n\ngRPC هو إطار عمل حديث عالي الأداء للاستدعاء عن بُعد للإجراءات (RPC)، طورته Google. يستخدم HTTP/2 للنقل، و Protocol Buffers (protobuf) لتسلسل البيانات، ويدعم العديد من اللغات بما في ذلك PHP. في هذه المقالة، سنشرح كيفية ربط gRPC بمشروع PHP، وما هي المكتبات اللازمة، وسنكتب مثالاً عملياً للتفاعل بين العميل والخادم.
\n\nلماذا نحتاج gRPC في PHP؟
\nغالباً ما تعمل واجهات برمجة التطبيقات REST التقليدية عبر JSON و HTTP/1.1، مما يؤدي إلى تكرار البيانات وبطء التسلسل. يحل gRPC هذه المشكلات:
\n- \n
- بروتوكول ثنائي — يشغل protobuf مساحة أقل من JSON، ويتم معالجته بشكل أسرع. \n
- HTTP/2 — تعدد الإرسال، ضغط الرؤوس، النقل التدفقي. \n
- كتابة صارمة — يتم وصف العقود في ملفات .proto، مما يبسط التطوير وتصحيح الأخطاء. \n
- نقل تدفقي ثنائي الاتجاه — يمكن للخادم والعميل تبادل البيانات بشكل غير متزامن. \n
المكتبات الرئيسية لـ gRPC في PHP
\nللعمل مع gRPC في PHP، ستحتاج إلى مكونين:
\n- \n
- grpc.so — إضافة PHP (إضافة C)، تنفذ HTTP/2 وبروتوكول gRPC. \n
- protobuf.so — إضافة لتسلسل protobuf (بديل — حزمة PHP نقية
google/protobuf). \n - حزم Composer:
grpc/grpcوgoogle/protobuf. \n
الطريقة الموصى بها للتثبيت هي عبر PECL (الإضافات) و Composer (التبعيات).
\n\nتثبيت gRPC و protobuf
\nللخوادم على Linux (Ubuntu/Debian):
\n# تثبيت الإضافات عبر PECL\nsudo pecl install grpc\nsudo pecl install protobuf\n\n# الإضافة إلى php.ini\necho "extension=grpc.so" >> /etc/php/8.2/cli/php.ini\necho "extension=protobuf.so" >> /etc/php/8.2/cli/php.ini\n\nلنظام Windows، قم بتنزيل ملفات DLL من PECL وحددها في php.ini.
\n\nبعد ذلك، قم بتثبيت المكتبات عبر Composer:
\ncomposer require grpc/grpc\ncomposer require google/protobuf\n\nإنشاء ملف .proto
\nلنصف خدمة للعمل مع المستخدمين. أنشئ ملف user.proto:
syntax = "proto3";\n\npackage user;\n\nservice UserService {\n rpc GetUser (UserRequest) returns (UserResponse);\n rpc ListUsers (Empty) returns (UserList);\n}\n\nmessage UserRequest {\n int32 id = 1;\n}\n\nmessage UserResponse {\n int32 id = 1;\n string name = 2;\n string email = 3;\n}\n\nmessage Empty {}\n\nmessage UserList {\n repeated UserResponse users = 1;\n}\n\nتوليد فئات PHP من .proto
\nقم بتثبيت protoc والإضافة لـ PHP:
\n# قم بتنزيل protoc من https://github.com/protocolbuffers/protobuf/releases\n# ثم قم بتوليد الكود:\nprotoc --php_out=./generated --grpc_out=./generated --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin user.proto\n\nفي المجلد generated ستظهر الفئات: UserRequest، UserResponse، UserServiceClient وغيرها.
مثال لخادم gRPC على PHP
\nلننشئ خادماً سيجيب على الطلبات. ملف server.php:
require_once __DIR__ . '/vendor/autoload.php';\nrequire_once __DIR__ . '/generated/UserServiceServer.php';\n\nuse Grpc\\Server;\nuse User\\UserServiceServer;\nuse User\\UserRequest;\nuse User\\UserResponse;\n\nclass MyUserService extends UserServiceServer\n{\n public function GetUser(\\Grpc\\ServerCallReader $request, \\Grpc\\ServerCallWriter $response, \\Grpc\\ServerContext $context): void\n {\n $req = $request->read();\n $id = $req->getId();\n\n $user = new UserResponse();\n $user->setId($id);\n $