أمثلة للحصول على طلب تجعيد php. CURL PHP: ما هو وكيفية استخدامه؟ مثال على استخدام طلب POST

في هذا المنشور، سأعرض بأمثلة كيفية استخدام cURL، وأين يتم استخدامه ولماذا يجب أن تفهمه إذا لم تكن قد فعلت ذلك بالفعل.

سأصف بإيجاز ما هو وماذا يؤكل:

تم إنشاء Guzzle لتبسيط عملية إرسال طلبات HTTP. كثيرا ما تستخدم لإرسال الطلبات إلى واجهة برمجة التطبيقاتوأي شيء بشكل عام.

مثال حقيقي:

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

قد تسأل: لماذا يعد هذا ضروريًا إذا كان هناك بالفعل مجموعة من المكتبات؟

قامت Guzzle بجمع كل ما هو أفضل في حد ذاتها، وجعلتها أفضل وهي الآن مكتبة PHP الأكثر شعبية للعمل مع طلبات HTTP. إنه أمر رائع حقًا، ما عليك سوى إلقاء نظرة على بساطة الطلب:

// إنشاء عميل باستخدام معرف URI أساسي $client = new GuzzleHttp\Client(["base_uri" => "http://site/"]); // الآن يمكنك إرسال طلب إلى http://bologe.. يتذكر Guzzle الرابط الأساسي ويمكنك الآن فقط تحديد الصفحات اللاحقة للملاءمة $response = $client->request("GET", "about");

رائع؟ أنا أحب.

وثائق Guzzle واسعة جدًا، ومن المستحيل وصف كل خيار، وهذا يتطلب منشورًا كاملاً، وسأكتبه بالتأكيد قريبًا :)

خاتمة

إذا كانت لديك أي أسئلة، فاكتبها أدناه في هذا المنشور وسأكون سعيدًا بمساعدتك. وأيضًا، إذا كان لديك أي تصحيحات للمقال ورأيت خطأً في مكان ما أو أردت إضافة شيء ما، سأكون سعيدًا بالاستماع إليك.

في المقال الأخير ناقشنا معك. ومع ذلك، في بعض الأحيان يقبل البرنامج النصي فقط الحصول على الطلبات(عادة ما تكون هذه نصوص بحث). ومن أجل معالجة واستقبال البيانات من هذه البرامج النصية، يجب أن تكون قادرًا على ذلك إرسال طلبات GET في cURLأيضاً، وهذا ما ستتعرف عليه من خلال قراءة هذا المقال.

مبدأ إرسال طلبات GET في cURLتماما كما هو الحال مع الإرسال باستخدام طريقة POST: هنالك مصدر الملفوهناك الملف الوجهة. الملف المصدر باستخدام الوحدة النمطية لفة, يرسل طلب GETإلى الملف الوجهة. يقوم الملف الوجهة بمعالجة هذا الطلب وإرجاع النتيجة، التي يقبلها الملف المصدر، مرة أخرى باستخدام الإمكانات لفة.

لتوضيح كل شيء تمامًا، دعونا نلقي نظرة على مثال بسيط نظرنا إليه متى إرسال طلبات POST. أي أن الملف المصدر يرسل رقمين، ويقوم الملف الوجهة بإرجاع مجموع هذه الأرقام، التي يتلقاها الملف المصدر ويكتبها في متغير، ثم يتم إخراجها بعد ذلك إلى المتصفح.

للبدء، الملف الوجهة (" استقبال.php"):

$a = $_GET["a"];
$b = $_GET["b"];
صدى $a + $b;
?>

كل شيء بسيط جدًا هنا: نكتب بالمتغيرات و معلومات من الحصول على الطلب، ثم نعرض مجموعهم، والذي سيتم قبوله بواسطة الملف المصدر.

الآن لنقم بإنشاء الملف نفسه -

تتيح لك مكتبة CURL (عناوين URL للعميل) نقل الملفات إلى كمبيوتر بعيد باستخدام مجموعة متنوعة من بروتوكولات الإنترنت. يتميز بتكوين مرن للغاية ويسمح لك بتلبية أي طلب عن بعد تقريبًا.

يدعم CURL بروتوكولات HTTP وHTTPS وFTP وFTPS وDICT وTELNET وLDAP وFILE وGOPHER، بالإضافة إلى بروتوكولات HTTP-post وHTTP-put وملفات تعريف الارتباط وتحميلات FTP واستئناف عمليات نقل الملفات المتقطعة وكلمات المرور وأرقام المنافذ وشهادات SSL و Kerberos والوكلاء.

باستخدام CURL، يمكن لخادم الويب أن يعمل كعميل كامل لأي خدمة تعتمد على بروتوكول HTTP، على سبيل المثال: XML-RPC، أو SOAP، أو WebDAV.

بشكل عام، يتم استخدام المكتبة في أربع خطوات:

  1. إنشاء مورد CURL باستخدام وظيفة curl_init.
  2. ضبط المعلمات باستخدام وظيفة curl_setopt.
  3. تنفيذ طلب باستخدام وظيفة curl_exec.
  4. تحرير مورد CURL باستخدام وظيفة Curl_Close.

مثال بسيط لاستخدام CURL

// تهيئة مكتبة الضفيرة
إذا ($ch = @curl_init())
{
// قم بتعيين عنوان URL للطلب
@curl_setopt($ch, CURLOPT_URL, "http://server.com/");
// إذا كان صحيحًا، فسيتضمن CURL الرؤوس في الإخراج
@
// مكان وضع نتيجة الطلب:
// خطأ - إلى دفق الإخراج القياسي،
// true - كقيمة الإرجاع للدالة curl_exec.
@
// الحد الأقصى لوقت الانتظار بالثواني
@
// قم بتعيين قيمة حقل وكيل المستخدم
@curl_setopt($ch, CURLOPT_USERAGENT, "بوت PHP (http://blog.yousoft.ru)");
// تنفيذ الطلب
$data = @curl_exec($ch);
// إخراج البيانات المستلمة
صدى بيانات $ ؛
// حرر المورد
@curl_Close($ch);
}
?>

مثال على استخدام طلب GET

$ch = curl_init();
// تم تحديد طلب GET في سطر URL
curl_setopt($ch, CURLOPT_URL, "http://server.com/?s=CURL");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);

$data = curl_exec($ch);
تجعيد_إغلاق($ch);
?>

لا يختلف إرسال طلب GET عن تلقي الصفحة. ومن المهم ملاحظة أن سلسلة الاستعلام يتم تشكيلها على النحو التالي:

http://server.com/index.php?name1=value1&name2=value2&name3=value3

حيث http://server.com/index.php هو عنوان الصفحة، وnameX هو اسم المتغير، وvalueX هي قيمة المتغير.

مثال على استخدام طلب POST

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://server.com/index.php");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// يجب أن تشير صراحةً إلى أنه سيكون هناك طلب POST
curl_setopt($ch, CURLOPT_POST, true);
// يتم تمرير القيم المتغيرة هنا
curl_setopt ($ch, CURLOPT_POSTFIELDS, "s=CURL");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt ($ch, CURLOPT_USERAGENT, "PHP Bot (http://mysite.ru)");
$data = curl_exec($ch);
تجعيد_إغلاق($ch);
?>

لا يختلف إرسال طلب POST كثيرًا عن إرسال طلب GET. تظل جميع الخطوات الأساسية كما هي. يتم تحديد المتغيرات أيضًا في أزواج: name1=value1&name2=value2 .

مثال على تفويض HTTP

// ترخيص HTTP
عنوان URL $ = "http://server.com/protected/";
$ch = curl_init();


curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");
$result = curl_exec($ch);
تجعيد_إغلاق($ch);
صدى نتيجة $؛
?>

مثال لجلسة FTP

$fp = fopen(__FILE__, "r");
عنوان URL $ = "ftp://اسم المستخدم: [البريد الإلكتروني محمي]:21/المسار/إلى/newfile.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt ($ch، CURLOPT_INFILE، $fp)؛
curl_setopt($ch, CURLOPT_FTPASCII, 1);
curl_setopt($ch, CURLOPT_INFILESIZE, png(__FILE__));
$result = curl_exec($ch);
تجعيد_إغلاق($ch);
?>

إذا كانت لديك مشكلات في استخدام cURL، فستحتاج إلى إضافة الأسطر التالية قبل الاتصال بـ curl_Close للحصول على تقرير بآخر طلب تم إجراؤه:

print_r(curl_getinfo($ch));
صدى "رقم خطأ الضفيرة:" . curl_errno($ch). "
" ;
صدى "خطأ في URL:" . حليقة_خطأ($ch). "
" ;
تجعيد_إغلاق($ch);
?>

cURL هي أداة خاصة مصممة لنقل الملفات والبيانات باستخدام بناء جملة URL. تدعم هذه التقنية العديد من البروتوكولات مثل HTTP، FTP، TELNET وغيرها الكثير. تم تصميم cURL في الأصل ليكون أداة لسطر الأوامر. لحسن الحظ بالنسبة لنا، مكتبة cURL مدعومة بواسطة لغة برمجة PHP. في هذه المقالة سوف نلقي نظرة على بعض الوظائف المتقدمة لـ cURL، ونتطرق أيضًا إلى التطبيق العملي للمعرفة المكتسبة باستخدام PHP.

لماذا الضفيرة؟

في الواقع، هناك عدد لا بأس به من الطرق البديلة لأخذ عينات من محتوى صفحة الويب. في كثير من الحالات، وبسبب الكسل بشكل رئيسي، استخدمت وظائف PHP بسيطة بدلاً من cURL:

$content = file_get_contents("http://www.nettuts.com"); // أو $lines = file("http://www.nettuts.com"); // أو readfile("http://www.nettuts.com");

ومع ذلك، فإن هذه الوظائف لا تتمتع بأي مرونة تقريبًا وتحتوي على عدد كبير من أوجه القصور من حيث معالجة الأخطاء وما إلى ذلك. بالإضافة إلى ذلك، هناك بعض المهام التي لا يمكنك إنجازها باستخدام هذه الميزات القياسية: التفاعل مع ملفات تعريف الارتباط، والمصادقة، وإرسال النماذج، وتحميل الملفات، وما إلى ذلك.

cURL هي مكتبة قوية تدعم العديد من البروتوكولات والخيارات المختلفة، وتوفر معلومات مفصلة حول طلبات URL.

تركيب اساسي

  • التهيئة
  • تعيين المعلمات
  • التنفيذ وجلب النتيجة
  • تحرير الذاكرة

// 1. التهيئة $ch = curl_init(); // 2. تحديد المعلمات، بما في ذلك عنوان url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. احصل على HTML كنتيجة $output = curl_exec($ch); // 4. أغلق الاتصال curl_Close($ch);

ستتم مناقشة الخطوة رقم 2 (أي استدعاء curl_setopt()) في هذه المقالة أكثر بكثير من جميع الخطوات الأخرى، لأن في هذه المرحلة، تحدث كل الأشياء الأكثر إثارة للاهتمام والمفيدة التي تحتاج إلى معرفتها. يوجد في cURL عدد كبير من الخيارات المختلفة التي يجب تحديدها لتتمكن من تكوين طلب URL بأكثر الطرق دقة. لن ننظر في القائمة بأكملها، ولكننا سنركز فقط على ما أعتبره ضروريًا ومفيدًا لهذا الدرس. يمكنك دراسة كل شيء آخر بنفسك إذا كان هذا الموضوع يثير اهتمامك.

التحقق من الخطأ

بالإضافة إلى ذلك، يمكنك أيضًا استخدام العبارات الشرطية لاختبار ما إذا كانت العملية قد اكتملت بنجاح:

// ... $output = curl_exec($ch); إذا ($output === FALSE) ( echo "cURL Error: " . curl_error($ch); ) // ...

وهنا أطلب منك ملاحظة نقطة مهمة جدًا: يجب أن نستخدم "=== false" للمقارنة، بدلاً من "== false". بالنسبة لأولئك الذين ليسوا على دراية، سيساعدنا هذا على التمييز بين النتيجة الفارغة والقيمة المنطقية الخاطئة، والتي ستشير إلى وجود خطأ.

تلقي المعلومات

خطوة إضافية أخرى هي الحصول على بيانات حول طلب cURL بعد تنفيذه.

// ... curl_exec($ch); $info = curl_getinfo($ch); صدى "أخذ". $info["total_time"] . "ثواني لعنوان URL". $info["url"]; //...

تحتوي المصفوفة التي تم إرجاعها على المعلومات التالية:

  • "عنوان URL"
  • "نوع المحتوى"
  • "http_code"
  • "حجم_الرأس"
  • "حجم_الطلب"
  • "وقت الملف"
  • "ssl_verify_result"
  • "redirect_count"
  • "الوقت الكلي"
  • "namelookup_time"
  • "وقت_الاتصال"
  • "وقت النقل المسبق"
  • "حجم_التحميل"
  • "حجم_التنزيل"
  • "سرعة_التنزيل"
  • "سرعة_التحميل"
  • "download_content_length"
  • "upload_content_length"
  • "starttransfer_time"
  • "وقت إعادة التوجيه"

إعادة توجيه الكشف اعتمادا على المتصفح

في هذا المثال الأول، سنكتب رمزًا يمكنه اكتشاف عمليات إعادة توجيه URL استنادًا إلى إعدادات المتصفح المختلفة. على سبيل المثال، تقوم بعض مواقع الويب بإعادة توجيه متصفحات الهاتف الخلوي أو أي جهاز آخر.

سنستخدم خيار CURLOPT_HTTPHEADER لتحديد رؤوس HTTP الصادرة، بما في ذلك اسم متصفح المستخدم واللغات المتاحة. في النهاية سنكون قادرين على تحديد المواقع التي تعيد توجيهنا إلى عناوين URL مختلفة.

// اختبار عنوان URL $urls = array("http://www.cnn.com"، "http://www.mozilla.com"، "http://www.facebook.com"); // اختبار المتصفحات $browsers = array("standard" => array ("user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5 .6 (.NET CLR 3.5.30729)"، "language" => "en-us,en;q=0.5"), "iphone" => array ("user_agent" => "Mozilla/5.0 (iPhone; U ؛ وحدة المعالجة المركزية مثل Mac OS X؛ en) AppleWebKit/420+ (KHTML، مثل Gecko) الإصدار/3.0 Mobile/1A537a Safari/419.3"، "language" => "en")، "french" => array ("user_agent" => "Mozilla/4.0 (متوافق؛ MSIE 7.0؛ Windows NT 5.1؛ GTB6؛ .NET CLR 2.0.50727)"، "language" => "fr,fr-FR;q=0.5")); foreach ($urls as $url) ( echo "URL: $url\n"; foreach ($browsers as $test_name => $browser) ( $ch = curl_init(); // حدد عنوان url curl_setopt($ch, CURLOPT_URL , $url); // حدد رؤوس المتصفح curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["language"] )" )); // لا نحتاج إلى محتويات الصفحة curl_setopt($ch, CURLOPT_NOBODY, 1); // نحتاج إلى الحصول على رؤوس HTTP curl_setopt($ch, CURLOPT_HEADER, 1); // إرجاع النتائج بدلاً من ذلك من الإخراج cur_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_ Close($ch); // هل كانت هناك إعادة توجيه HTTP؟ if (preg_match("!Location: (.*)!", $output, $matches)) ( echo " $test_name: يعيد التوجيه إلى $matches\n"; ) else ( echo "$test_name: no redirection\n"; ) ) echo "\n\n"; )

أولاً، نحدد قائمة بعناوين URL للمواقع التي سنتحقق منها. بتعبير أدق، نحن بحاجة إلى عناوين هذه المواقع. نحتاج بعد ذلك إلى تحديد إعدادات المتصفح لاختبار كل عنوان من عناوين URL هذه. بعد ذلك، سوف نستخدم حلقة سنراجع فيها جميع النتائج التي تم الحصول عليها.

إن الخدعة التي نستخدمها في هذا المثال لتعيين إعدادات cURL ستسمح لنا بالحصول ليس على محتوى الصفحة، ولكن فقط على رؤوس HTTP (المخزنة في $output). بعد ذلك، باستخدام تعبير عادي بسيط، يمكننا تحديد ما إذا كانت السلسلة "Location:" موجودة في الرؤوس المستلمة.

عندما تقوم بتشغيل هذا الكود، يجب أن تحصل على شيء مثل هذا:

إنشاء طلب POST إلى عنوان URL محدد

عند تشكيل طلب GET، يمكن تمرير البيانات المرسلة إلى عنوان URL عبر "سلسلة استعلام". على سبيل المثال، عند إجراء بحث على Google، يتم وضع مصطلح البحث في شريط العناوين لعنوان URL الجديد:

http://www.google.com/search?q=ruseller

لا تحتاج إلى استخدام cURL لمحاكاة هذا الطلب. إذا تغلب عليك الكسل تمامًا، استخدم وظيفة “file_get_contents()” للحصول على النتيجة.

ولكن المشكلة هي أن بعض نماذج HTML ترسل طلبات POST. يتم نقل بيانات هذه النماذج عبر نص طلب HTTP، وليس كما في الحالة السابقة. على سبيل المثال، إذا قمت بملء نموذج في أحد المنتديات وقمت بالنقر فوق زر البحث، فمن المرجح أن يتم تقديم طلب POST:

http://codeigniter.com/forums/do_search/

يمكننا كتابة برنامج نصي PHP يمكنه محاكاة هذا النوع من طلبات URL. لنقم أولاً بإنشاء ملف بسيط لقبول بيانات POST وعرضها. دعنا نسميها post_output.php:

Print_r($_POST);

ثم نقوم بإنشاء برنامج نصي PHP لتقديم طلب cURL:

$url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar"، "query" => "Nettuts"، "action" => "Submit"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // تشير إلى أن لدينا طلب POST curl_setopt($ch, CURLOPT_POST, 1); // إضافة المتغيرات curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); تجعيد_إغلاق($ch); صدى $ الإخراج؛

عند تشغيل هذا البرنامج النصي يجب أن تحصل على نتيجة مثل هذا:

وبالتالي، تم إرسال طلب POST إلى البرنامج النصي post_output.php، والذي بدوره يقوم بإخراج المصفوفة $_POST العالمية، والتي حصلنا على محتوياتها باستخدام cURL.

تحميل ملف

أولاً، لنقم بإنشاء ملف من أجل إنشائه وإرساله إلى ملف upload_output.php:

Print_r($_FILES);

وإليك رمز البرنامج النصي الذي يؤدي الوظيفة المذكورة أعلاه:

$url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar"، // ملف للتحميل "upload" => "@C:/wamp/www/test.zip"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); تجعيد_إغلاق($ch); صدى $ الإخراج؛

عندما تريد تحميل ملف، كل ما عليك فعله هو تمريره كمتغير نشر عادي، يسبقه الرمز @. عند تشغيل البرنامج النصي المكتوب، سوف تحصل على النتيجة التالية:

عناوين URL متعددة

إحدى أعظم نقاط القوة في cURL هي القدرة على إنشاء معالجات cURL "متعددة". يتيح لك هذا فتح اتصال بعناوين URL متعددة في وقت واحد وبشكل غير متزامن.

في الإصدار الكلاسيكي لطلب cURL، يتم تعليق تنفيذ البرنامج النصي، وينتظر اكتمال عملية عنوان URL للطلب، وبعد ذلك يمكن متابعة البرنامج النصي. إذا كنت تنوي التفاعل مع مجموعة كاملة من عناوين URL، فسيؤدي ذلك إلى استثمار كبير جدًا للوقت، حيث أنه في الإصدار الكلاسيكي يمكنك العمل مع عنوان URL واحد فقط في كل مرة. ومع ذلك، يمكننا تصحيح هذا الوضع باستخدام معالجات خاصة.

دعونا نلقي نظرة على رمز المثال الذي أخذته من php.net:

// إنشاء عدة موارد cURL $ch1 = curl_init(); $ch2 = curl_init(); // تحديد عنوان URL والمعلمات الأخرى curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); // إنشاء معالج cURL متعدد $mh = curl_multi_init(); // أضف عدة معالجات cur_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $active = null; // تنفيذ الأمر ( $mrc ​​​​= curl_multi_exec($mh, $active); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); بينما ($active && $mrc ​​​​== CURLM_OK) ( if (curl_multi_select($mh) != -1) ( do ( $mrc ​​​​= curl_multi_exec($mh, $active); ) بينما ($mrc == CURLM_CALL_MULTI_PERFORM)؛ ) ) // إغلاق cur_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); Curl_multi_Close($mh);

الفكرة هي أنه يمكنك استخدام معالجات cURL متعددة. باستخدام حلقة بسيطة، يمكنك تتبع الطلبات التي لم تكتمل بعد.

هناك حلقتان رئيسيتان في هذا المثال. تستدعي حلقة do-while الأولى curl_multi_exec(). هذه الوظيفة غير قابلة للحظر. يتم تشغيله بأسرع ما يمكن ويعيد حالة الطلب. طالما أن القيمة التي تم إرجاعها هي الثابت 'CURLM_CALL_MULTI_PERFORM'، فهذا يعني أن العمل لم يكتمل بعد (على سبيل المثال، يتم حاليًا إرسال رؤوس http إلى عنوان URL)؛ ولهذا السبب نستمر في التحقق من قيمة الإرجاع هذه حتى نحصل على نتيجة مختلفة.

في الحلقة التالية نتحقق من الشرط بينما يكون المتغير $active = "true". إنها المعلمة الثانية للدالة curl_multi_exec(). ستكون قيمة هذا المتغير "صحيحة" طالما أن أيًا من التغييرات الموجودة نشطة. بعد ذلك، نسمي الدالة curl_multi_select(). يتم "حظر" تنفيذه أثناء وجود اتصال نشط واحد على الأقل، حتى يتم تلقي الرد. عندما يحدث هذا، نعود إلى الحلقة الرئيسية لمواصلة تنفيذ الاستعلامات.

الآن دعونا نطبق هذه المعرفة على مثال سيكون مفيدًا حقًا لعدد كبير من الأشخاص.

فحص الروابط في ووردبريس

تخيل مدونة تحتوي على عدد كبير من المشاركات والرسائل، تحتوي كل منها على روابط لموارد الإنترنت الخارجية. قد تكون بعض هذه الروابط ميتة بالفعل لأسباب مختلفة. ربما تم حذف الصفحة أو ربما لا يعمل الموقع على الإطلاق.

سنقوم بإنشاء برنامج نصي يقوم بتحليل جميع الروابط والعثور على مواقع الويب التي لا يتم تحميلها و404 صفحة، ثم يقدم لنا تقريرًا مفصلاً.

اسمحوا لي أن أقول على الفور أن هذا ليس مثالاً على إنشاء مكون إضافي لـ WordPress. هذه بالتأكيد أرض اختبار جيدة لاختباراتنا.

دعونا نبدأ أخيرا. نحتاج أولاً إلى جلب جميع الروابط من قاعدة البيانات:

// التكوين $db_host = "localhost"; $db_user = "الجذر"; $db_pass = ""; $db_name = "ووردبريس"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10؛ // تهيئة المتغيرات $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $active = null; // الاتصال بـ MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("تعذر الاتصال: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Could" not Select db: " . mysql_error()); ) // تحديد جميع المشاركات المنشورة ذات الروابط $q = "SELECT post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post "" ; $r = mysql_query($q) أو يموت(mysql_error()); بينما ($d = mysql_fetch_assoc($r)) ( // جلب الروابط باستخدام التعبيرات العادية if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $ match) ) ( foreach ($matches as $url) ( $tmp = parse_url($url); if (in_array($tmp["host"], $excluded_domains)) ( continue; ) $url_list = $url; ) ) / / إزالة التكرارات $url_list = array_values(array_unique($url_list)); إذا (!$url_list) (die("لا يوجد عنوان URL للتحقق"); )

أولاً، نقوم بإنشاء بيانات التكوين للتفاعل مع قاعدة البيانات، ثم نكتب قائمة بالنطاقات التي لن تشارك في الفحص ($excluded_domains). نحدد أيضًا رقمًا يميز الحد الأقصى لعدد الاتصالات المتزامنة التي سنستخدمها في البرنامج النصي الخاص بنا ($max_connections). ننضم بعد ذلك إلى قاعدة البيانات، ونختار المشاركات التي تحتوي على روابط، ونجمعها في مصفوفة ($url_list).

الكود التالي معقد بعض الشيء، لذا قم بتصفحه من البداية إلى النهاية:

// 1. معالج متعدد $mh = curl_multi_init(); // 2. أضف مجموعة من عناوين URL لـ ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // 3. инициализация выполнения do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 4. основной цикл while ($active && $mrc == CURLM_OK) { // 5. если всё прошло успешно if (curl_multi_select($mh) != -1) { // 6. делаем дело do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 7. если есть инфа? if ($mhinfo = curl_multi_info_read($mh)) { // это значит, что запрос завершился // 8. извлекаем инфу $chinfo = curl_getinfo($mhinfo["handle"]); // 9. мёртвая ссылка? if (!$chinfo["http_code"]) { $dead_urls = $chinfo["url"]; // 10. 404? } else if ($chinfo["http_code"] == 404) { $not_found_urls = $chinfo["url"]; // 11. рабочая } else { $working_urls = $chinfo["url"]; } // 12. чистим за собой curl_multi_remove_handle($mh, $mhinfo["handle"]); // в случае зацикливания, закомментируйте данный вызов curl_close($mhinfo["handle"]); // 13. добавляем новый url и продолжаем работу if (add_url_to_multi_handle($mh, $url_list)) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } } } // 14. завершение curl_multi_close($mh); echo "==Dead URLs==\n"; echo implode("\n",$dead_urls) . "\n\n"; echo "==404 URLs==\n"; echo implode("\n",$not_found_urls) . "\n\n"; echo "==Working URLs==\n"; echo implode("\n",$working_urls); function add_url_to_multi_handle($mh, $url_list) { static $index = 0; // если у нас есть ещё url, которые нужно достать if ($url_list[$index]) { // новый curl обработчик $ch = curl_init(); // указываем url curl_setopt($ch, CURLOPT_URL, $url_list[$index]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_multi_add_handle($mh, $ch); // переходим на следующий url $index++; return true; } else { // добавление новых URL завершено return false; } }

هنا سأحاول شرح كل شيء بالتفصيل. الأرقام الموجودة في القائمة تتوافق مع الأرقام الموجودة في التعليق.

  1. 1. إنشاء معالج متعدد؛
  2. 2. سنكتب وظيفة add_url_to_multi_handle() بعد قليل. في كل مرة يتم استدعاؤها، ستبدأ معالجة عنوان URL الجديد. في البداية، نضيف 10 عناوين URL ($max_connections)؛
  3. 3. للبدء، يجب علينا تشغيل الدالة curl_multi_exec(). طالما أنها تُرجع CURLM_CALL_MULTI_PERFORM، فلا يزال يتعين علينا القيام بشيء ما. نحن بحاجة إلى هذا بشكل أساسي لإنشاء اتصالات؛
  4. 4. بعد ذلك تأتي الحلقة الرئيسية، والتي سيتم تشغيلها طالما أن لدينا اتصال نشط واحد على الأقل؛
  5. 5. يتوقف curl_multi_select() في انتظار اكتمال البحث عن عنوان URL؛
  6. 6. مرة أخرى، نحتاج إلى الحصول على cURL للقيام ببعض الأعمال، أي جلب بيانات الاستجابة المرتجعة؛
  7. 7. يتم التحقق من المعلومات هنا. نتيجة لتنفيذ الطلب، سيتم إرجاع مصفوفة؛
  8. 8. يحتوي المصفوفة التي تم إرجاعها على معالج cURL. سوف نستخدمها لتحديد معلومات حول طلب cURL منفصل؛
  9. 9. إذا كان الرابط ميتًا، أو انتهت مهلة البرنامج النصي، فيجب ألا نبحث عن أي كود http؛
  10. 10. إذا أعاد لنا الرابط صفحة 404، فإن كود http سيحتوي على القيمة 404؛
  11. 11. خلاف ذلك، أمامنا وصلة عمل. (يمكنك إضافة عمليات فحص إضافية لرمز الخطأ 500، الخ...)؛
  12. 12. بعد ذلك نقوم بإزالة معالج cURL لأننا لم نعد بحاجة إليه؛
  13. 13. الآن يمكننا إضافة عنوان url آخر وتشغيل كل ما تحدثنا عنه من قبل؛
  14. 14. في هذه الخطوة يكمل السكربت عمله. يمكننا إزالة كل ما لا نحتاج إليه وإنشاء تقرير؛
  15. 15. أخيرًا، سنكتب دالة ستضيف عنوان url إلى المعالج. سيتم زيادة المتغير الثابت $index في كل مرة يتم فيها استدعاء هذه الوظيفة.

لقد استخدمت هذا البرنامج النصي في مدونتي (مع بعض الروابط المعطلة التي أضفتها عمدًا لاختبارها) وحصلت على النتيجة التالية:

في حالتي، استغرق البرنامج النصي أقل من ثانيتين بقليل للزحف عبر 40 عنوان URL. تعد زيادة الأداء ملحوظة عند العمل مع المزيد من عناوين URL. إذا قمت بفتح عشرة اتصالات في نفس الوقت، فيمكن تنفيذ البرنامج النصي بشكل أسرع بعشر مرات.

بضع كلمات حول خيارات cURL المفيدة الأخرى

مصادقة HTTP

إذا كان عنوان URL يحتوي على مصادقة HTTP، فيمكنك بسهولة استخدام البرنامج النصي التالي:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // حدد اسم المستخدم وكلمة المرور curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // إذا كان إعادة التوجيه مسموحًا به curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // ثم احفظ بياناتنا في cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); تجعيد_إغلاق($ch);

تحميل بروتوكول نقل الملفات

تحتوي PHP أيضًا على مكتبة للعمل مع FTP، ولكن لا شيء يمنعك من استخدام أدوات cURL هنا:

// افتح الملف $file = fopen("/path/to/file", "r"); // يجب أن يحتوي عنوان url على المحتوى التالي $url = "ftp://username: [البريد الإلكتروني محمي]:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, png("/path/to/file")); // حدد تعديل ASCII curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec ($ch);curl_Close($ch);

باستخدام الوكيل

يمكنك تنفيذ طلب URL الخاص بك من خلال وكيل:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // تحديد العنوان curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // إذا كنت بحاجة إلى تقديم اسم مستخدم وكلمة مرور cur_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); تجعيد_إغلاق($ch);

وظائف رد الاتصال

من الممكن أيضًا تحديد الوظيفة التي سيتم تشغيلها حتى قبل اكتمال طلب cURL. على سبيل المثال، أثناء تحميل محتوى الاستجابة، يمكنك البدء في استخدام البيانات دون انتظار تحميلها بالكامل.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function"); curl_exec($ch); تجعيد_إغلاق($ch); دالة التقدم_وظيفة($ch,$str) ( echo $str; return strlen($str); )

دالة كهذه يجب أن تُرجع طول السلسلة، وهو متطلب.

خاتمة

لقد تعلمنا اليوم كيف يمكنك استخدام مكتبة cURL لأغراضك الأنانية. آمل أن يحظى هذا المقال بإعجابكم.

شكرًا لك! اتمنى لك يوم جيد!



 

قد يكون من المفيد أن تقرأ: