Multithreading with cURL

السلام عليكم ورحمة الله تعالى وبركاته

وجدت كلاس مفيد جدا في github، يسهل عليك عمل Multithreading من خلال مكتبة cURL في لغة PHP..

هذا هو الكلاس :

كيفية الإستخدام ؟

نقوم بحفظ الكلاس في ملف ما (ثم نقوم بتضمينه من خلال include) أو نضعه في داخل السكريبت مباشرة..

<?php
include "parallelcurl.php";

وبعدين نعمل مصفوفة نضع فيها الـ Options الخاصة بالـ cURL.

$curl_options = array (
    CURLOPT_SSL_VERIFYPEER => FALSE,
    CURLOPT_SSL_VERIFYHOST => FALSE,
    CURLOPT_USERAGENT      => 'Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0',
    CURLOPT_RETURNTRANSFER => 1
);

ثم نقوم بإنشاء كائن جديد من الكلاس ParallelCurl.. ونضع عدد الـThreads ثم المصفوفة التي فيها الـOptions تبع cURL.

$curl = new ParallelCurl (5, $curl_options); 

ثم نستدعي الدالة startRequest الموجودة داخل الكلاس، ونمرر لها الرابط (URL) وإسم الدالة التي يتم إستدعائها بعد نهاية كل Request.

 $curl->startRequest ("

https://arabia.io ", 'on_request_done');

ثم نستدعي الدالة finishAllRequests والتي تقوم بالإنتظار لحين إنتهاء عمل كل الـThreads.

$curl->finishAllRequests ();

وأخير الدالة on_request_done والتي يتم إستدعائها بعد نهاية كل Request.

function on_request_done ($content, $url, $ch, $search) {
    echo $content;
}

لمشاهدة مثال عن السكريبت

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

هناك نمط تصميم يسمى producer/consumer يستخدم لمثل هذه الأشياء. السكربت الذي يجمع العناوين التي من المفروض أن نسحبها ثم يرسلها إلى السكربت أو ال process أو thread الآخر من خلال طابور الرسائل message queue وهناك على الطرف الآخر منه يكون السكربت الذي يقوم بعملية الجلب حيث "يستهلك" من هذا الطابور.

الجميل في هذا النمط من التصميم أنه قابل للكبر scale حيث يمكن زيادة عدد ال threads أو ال processes التي تستهلك بحسب المطلوب كذلك يمكن تحديد سعة للطابور بحيث إن وصل لها يعتبر الطابور مشبع وعلى المرسل الإنتظار.