عميل HTTP بلغة PHP: إجراء الطلبات بشكل صحيح (مستوى متقدم)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: من البسيط إلى المعقد



معظم مطوري PHP على دراية بطلبات HTTP الأساسية عبر file_get_contents() أو curl_init() البسيطة. ومع ذلك، عندما ينمو المشروع من مرحلة "مشروع تجريبي" إلى نظام إنتاجي، تظهر الحاجة إلى أدوات أكثر موثوقية ومرونة وأعلى أداءً. عميل HTTP المتقدم بلغة PHP ليس مجرد إرسال طلب GET. بل هو إدارة مجموعة اتصالات، معالجة غير متزامنة، إعادة محاولة عند الأخطاء، ضبط دقيق للمهلات، وبرمجيات وسيطة (middleware) لتسجيل العمليات.



في هذه المقالة، سنشرح كيفية بناء عميل HTTP صحيح بلغة PHP على مستوى متقدم. ستتعلم كيفية استخدام مكتبة Guzzle، والعمل مع الطلبات غير المتزامنة، ومعالجة الاستثناءات، وإنشاء تكاملات موثوقة مع واجهات برمجة التطبيقات (API) الخارجية. المادة موجهة للمطورين الذين هم على دراية بأساسيات PHP ويرغبون في رفع جودة كودهم إلى مستوى جديد.



1. Guzzle: المعيار الفعلي لطلبات HTTP في PHP



إذا كنت تكتب تطبيقًا جادًا بلغة PHP، فإن مكتبة Guzzle (guzzlehttp/guzzle) يجب أن تكون أداتك الرئيسية. فهي تجرد العمل مع cURL وتدفقات PHP، وتوفر واجهة موحدة وسهلة الاستخدام.



1.1 التثبيت والطلب الأساسي



التثبيت عبر Composer:



composer require guzzlehttp/guzzle


مثال لطلب GET بسيط مع تحديد الرؤوس والمهلة:



<?phprequire 'vendor/autoload.php';

use GuzzleHttp\\Client;use GuzzleHttp\\Exception\\RequestException;

$client = new Client([ 'base_uri' => 'https://api.example.com/', 'timeout' => 5.0, // المهلة بالثواني 'headers' => [ 'User-Agent' => 'MyApp/1.0', 'Accept' => 'application/json', ]]);

try { $response = $client->get('/users', [ 'query' => ['limit' => 10, 'offset' => 0] ]); $body = $response->getBody()->getContents(); $data = json_decode($body, true); echo "الحالة: " . $response->getStatusCode() . ""; print_r($data);} catch (RequestException $e) { echo "خطأ في الطلب: " . $e->getMessage(); if ($e->hasResponse()) { echo "استجابة الخادم: " . $e->getResponse()->getBody(); }}


1.2 التكوين المتقدم للعميل



المستوى المتقدم يعني ضبطًا دقيقًا. دعنا نستعرض معلمات التكوين الرئيسية:



  • connect_timeout — وقت انتظار إنشاء الاتصال (بشكل منفصل عن مهلة نقل البيانات).
  • allow_redirects — التحكم في عمليات إعادة التوجيه (يمكن تعطيلها أو تحديد عددها).
  • verify — تعطيل التحقق من شهادة SSL (فقط للبيئة الاختبارية!).
  • http_errors — إذا تم تعيينها على false، لن تقوم Guzzle برمي استثناءات للأكواد 4xx و 5xx، مما يسمح بمعالجتها يدويًا.
  • handler — معالج مخصص للاختبار (MockHandler).


مثال لعميل بتكوين متقدم:



$client = new Client([    'base_uri'        => 'https://api.example.com/',    'timeout'         => 10.0,    'connect_timeout' => 3.0,    'allow_redirects' => [        'max' => 5,        'strict' => true,        'referer' => true,        'protocols' => ['https']    ],    'http_errors'     => false,    'headers'         => [        'Authorization' => 'Bearer ' . $token,        'Content-Type'  => 'application/json',    ]]);


2. الطلبات غير المتزامنة والتزامن



في التطبيقات الواقعية، غالبًا ما يكون مطلوبًا تنفيذ عدة طلبات في وقت واحد (على سبيل المثال، تحميل البيانات من عدة نقاط نهاية). توفر Guzzle آلية قوية للطلبات غير المتزامنة بناءً على الوعود (Promises) (خاصة بها

المدونات

توصيات الكتب