آموزش کامل curl در php

Image تحقیقات

آموزش کامل curl در php

سلام خدمت دوستای عزیز

بحث امروز درباره php curl هست و اینکه با استفاده از curl چه کارهایی می توانیم انجام دهید که امیدوارم با مثال هایی که زده میشه استفاده از curl خوب جا بیوفته براتون .

با استفاده از cURL می توان با سرورهای مختلف و از طریق پروتکل های متفاوت ارتباط بر قرار کرد و کارهای مشابه کارهای زیر را انجام داد:

  • نوشتن ماژولهای پرداخت آنلاین و ارتباط با درگاه های پرداخت
  • دانلود و آپلود فایل از سرورهای دیگر
  • لاگین کردن به بخش کاربری سایتها

 

چرا از Curl استفاده کنیم ؟

این یک حقیقت است که برای بازیابی محتوای یک صفحه می توان راه های مختلفی را اسفتاده کرد و به نظر خیلی وقت ها ناشی از تنبلی ما هست که از Curl استفاده نمیکنیم ! 

برای مثال برای گرفتن محتوای یک صفحه از توابع زیر می توان در php استفاده کرد :

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

قطعا توابع بالا محتوای صفحه را بازیابی می کنند ولی حقیقت این است که انعطاف پذیری curl و همچنین error handling مناسبی را ندارند .

مسیله دیگر اینکه بعضی وقت ها شما لازم دارین که علاوه بر بازیابی محتوای یک صفحه , از  cookies ها استفاده کنید یا لازم باشد اطلاعاتی به فرمی post کنید یا عملیات authentication انجام دهید و .. که همه این کارها با Curl امکان پذیر است .

در واقع Curl یک library خیلی قوی است که بسیاری از آپشن ها و پروتوکل ها را پشتیبانی می کند و جزییات و اطلاعات خیلی خوبی را درباره یک صفحه به ما می دهد.

 

قبل از اینکه شروع به آموزش curl بکنیم حتما مطمین بشین که curl بر روی سیستم شما نصب و فعال است .

تقریبا تمام درخواست های curl از الگوی زیر پیروی می کنند :

  • در ابتدا با استفاده از تابع  () curl_init یک نمونه از curl ایجاد کرده و آن را داخل متغیری به نام ch می ریزیم . (ch = cURL handle)
  • سپس آپشن های مختلفی مانند نوع درخواست, آدرس Url و …. را برای آن ست می کنیم.
  • با استفاده از تابع ()curl_exec درخواستمان را اجرا می کنیم.
  • در نهایت با استفاده از تابع ()curl_close منابع مصرف شده مانند memory را آزاد می کنیم.

در واقع از ساختار بالا تنها چیزی که ممکنه برای هر درخواست عوض بشود همان آپشن هایی هست که با توجه به کارمون ست می کنیم .

 

 

بازیابی یک صفحه وب با Curl

مثال :

با استفاده از curl محتوای صفحه اول سایت bbc را می گیریم .

و قطعا این مسیله هم کاملا روشن هست که هرچقد تعداد درخواست های پشت سر هم ما بیشتر شود مقدار تاخیر و کندی پاسخ ها هم بیشتر هست .
خب راه حل چیست ! یکی از راه حل ها استفاده از درخواست های غیر همزمان یا ناهنگام (requests asynchronously) می باشد .
این تکنیک بیشتر در جوامع avaScript وNode.js به چشم می خورد.
به طور خلاصه میشه اینجوری معنیش کرد که به جای انتظار برای پایان یافتن یک Task وقت گیر , آن را بهthread ها و process های دیگر واگذار می کنیم و سپس به سراغ کار دیگر میرویم و آن را انجام می دهیم و وقتی فرایند انجام Task مورد نظر پایان یافت ,ما به سراغ نتیجه اون می رویم .
مهم ترین نکته ای که این تکنیک داره این است که دیگر وقت ما صرف منتظر شدن برای پایان یک Task نمی شود .
روش انجام دادن درخواست های متعدد به صورت غیر همزمان با استفاده از Curl کمی با روش هایی که در مثال های بالاتر برای یک درخواست انجام می دادیم تفاوت دارد .
<?php
// URLs we want to retrieve
$urls = array(
    'http://www.google.com', 
    'http://www.bing.com', 
    'http://www.yahoo.com',
    'http://www.twitter.com',
    'http://www.facebook.com'
);

// initialize the multihandler
$mh = curl_multi_init();

$channels = array();
foreach ($urls as $key => $url) {
    // initiate individual channel
    $channels[$key] = curl_init();
    curl_setopt_array($channels[$key], array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true
    ));

    // add channel to multihandler
    curl_multi_add_handle($mh, $channels[$key]);
}

// execute - if there is an active connection then keep looping
$active = null;
do {
    $status = curl_multi_exec($mh, $active);
}
while ($active && $status == CURLM_OK);

// echo the content, remove the handlers, then close them
foreach ($channels as $chan) {
    echo curl_multi_getcontent($chan);
    curl_multi_remove_handle($mh, $chan);
    curl_close($chan);
}

// close the multihandler
curl_multi_close($mh);
  • curl_multi_init : مانند curl_init برای مقدار دهی اولیه Curl به صورت multihandler استفاده می شود .
  • curl_multi_add_handle : برای اضافه کردن چندین کانال به شی multihandler استفاده می شود .
  • curl_multi_getcontent : برای بازیابی محتوای پاسخ های ایجاد شده .

توضیح کدهای بالا :

  • ابتدا در خط 3 آرایه ای سایت هایی که می خواهیم صفحه ی اول آنها با استفاده از Curl بازیابی شود داریم .
  • در خط 12 شی multihandler را ایجاد می کنیم .
  • در خط 15 به تعداد سایت هایی که داریم کانال هایی را ایجاد می کنیم این کانال ها خود در واقع دارای اطلاعات Curl های منفرد هستند .
  • در خط 25 اون کانال هایی را که ایجاد کردیم به شی multihandler  اختصاص می دهیم .
  • در خط 31 یکی یکی درخواست ها اجرا می شود و تا زمانی که نتیجه درخواست های اجرا شده Ok باشد آن ها را اجرا می کند ,  مقدار  خروجی آن را چاپ می کند , آن درخواست را از آرایه حدف می کند و سراغ درخواست بعدی می رود
  • و در آخر کار , تمام شی های مربوط به Curl را Close می کند .

کدهای بالا در لپ تاپ من 1,100 میلی ثانیه طول کشید و اگر آنها را بدون روش غیر همزمان انجام می دادم 2,000 طول می کشید . حالا فرض کنید تعداد درخواست های ما از 5 تا به 100 تا تغییر پیدا می کرد. قطعا اون موقع روش غیر همزمان خیلی خودش رو بیشتر نشون میداد .

خب مقاله امروز هم به پایان رسید.خوشحال میشم مثل همیشه نظراتتون رو اعلام کنید.