آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

امین علیپور  8 سال پیش  6 سال پیش
+10 0

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

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

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

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

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

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

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

<?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 را می گیریم .


<?php
curl_setopt_array(
$ch, array(
CURLOPT_URL => 'http://www.bbc.co.uk/',
CURLOPT_RETURNTRANSFER => true
));

$output = curl_exec($ch);
echo $output;

با اجرای کد بالا باید صفجه اول bbc را در مرورگر خود ببینید .

آپشن هایی که در بالا استفاده شده اند :

  • CURLOPT_URL : آدرس url ای است که می خواهیم آن را پردازش کنیم این پردازش می تواند دانلود یک فایل و یا ارسال اطلاعات به آن url باشد.
  • CURLOPT_RETURNTRANSFER : اگر با true مقدار دهی شود در خروجی دستور ()curl_exec محتوای آدرس Url برگشت داده می شود و اگر با false مقدار دهی شود خروجی دستور ()curl_exec مقدار true یا false خواهد بود (با توجه به اینکه عملیات موفقیت آمیز باشد یا خیر)

چک کردن Errors ها در Curl

این قسمت اختیاری است و شما در صورت تمایل می توانید چک کنید آیا اروری وجود دارد یا خیر .

// ...

$output = curl_exec($ch);

if ($output === FALSE) {

echo "cURL Error: " . curl_error($ch);

}

// ...

  • از تابع curl_error برای گرفتن ارورها استفاده می کنیم .
  • توجه کنید برای مقایسه از === استفاده کردیم به جای ==  زیرا ما باید تمایز قایل بشیم برای خروجی ای که خالی (empty) است با خروجی که  false است .

گرفت اطلاعات از شی Curl

نکته ی دیگر اینکه می توانیم بعد از اجرای درخواست Curl . اطلاعاتی از آن بدست بیاوریم . این کار با استفاده از تابع curl_getinfo انجام می شود .

 // ...

curl_exec($ch);

$info = curl_getinfo($ch);

echo 'Took ' . $info['total_time'] . ' seconds for url ' . $info['url'];

// ...

اطلاعاتی که می توانیم بدست بیاوریم شامل موارد زیر است :

  • “url”
  • “content_type”
  • “http_code”
  • “header_size”
  • “request_size”
  • “filetime”
  • “ssl_verify_result”
  • “redirect_count”
  • “total_time”
  • “namelookup_time”
  • “connect_time”
  • “pretransfer_time”
  • “size_upload”
  • “size_download”
  • “speed_download”
  • “speed_upload”
  • “download_content_length”
  • “upload_content_length”
  • “starttransfer_time”
  • “redirect_time”

Login کردن به وبسایت با استفاده از Curl

در مثال قبل درخواستی که فرستادیم از نوع get بود اما می توانیم با استفاده از curl درخواست های دیگری مانند put , post و… ارسال نماییم . به عنوان مثال  می خواهیم با استفاده از curl به یک سایت وردپرسی لاگین نماییم.قطعا نوع درخواست ما post باید باشد و آدرس Url ای که درخواست به آن فرستاده می شود چیزی شبیه به http://example.com/wp-login.php می باشد و مقدارهای زیر را باید یه همراه درخواس post ارسال نماییم.

  • login : یوزرنیم ما
  • pwd : پسورد ما
  • redirect_to : آدرس Url ای که بعد از لاگین می خواهیم فراخوانی شود.
  • testcookie : آن را مساوی 1 قرار میدهیم . (testcookie مخصوص وردپرس است )

توجه کنید که نام پارامترها ممکن است با نام پارامترهای صفحه لاگین شما متفاوت باشد و این مسله را با مشاهده کدهای بخش لاگین می توانید پیدا کنید .

<?php
$postData = array(
'login' => 'acogneau',
'pwd' => 'secretpassword',
'redirect_to' => 'http://example.com',
'testcookie' => '1'
);

curl_setopt_array($ch, array(
CURLOPT_URL => 'http://example.com/wp-login.php',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData,
CURLOPT_FOLLOWLOCATION => true
));

$output = curl_exec($ch);
echo $output;

آپشن های جدیدی که ست کردیم :

  • CURLOPT_POST : وقتی آن را با true مقدار دهی کنیم به معنی این است  که درخواست curl را از نوع post ارسال کند.
  • CURLOPT_POSTFIELDS : داده هایی که قرار است در بدنه ی درخواست ما ارسال شود را تعیین می کند.
  • CURLOPT_FOLLOWLOCATION : اگر با مقدار true تنظیم شود اجازه ریدایرکت را به Curl داده ایم.

به احتمال زیاد اگر کد بالا را تست کنید  پیغام زیر را مشاهده می کنید :

“ERROR: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.”

این پیغام طبیعی است زیرا ما باید cookies و sessions را فعال کنیم . برای فعال کردن دو خط دیگر به مجموع آپشن هامون  اضافه می کنیم :

<?php
curl_setopt_array($ch, array(
CURLOPT_URL => 'http://example.com/wp-login.php',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_COOKIESESSION => true,
CUROPT_COOKIEJAR => 'cookie.txt'
));

CURLOPT_COOKIESESSION : اگر با true مقدار دهی شود Curl کوکی و سشن جدید را مقدار دهی و استارت می کند و از کوکی و سشن های قبلی چشم پوشی می کند.

CURLOPT_COOKIEJAR : نام فایلی که می خواهیم Curl کوکی های جدید را داخل آنها ذخیره کند مشخص می کنیم.(مطمین شوید که دسترسی و permissions های لازم برای این فایل را دارین)

کار با FTP از طریق Curl

با استفاده از Curl می توانیم فایل ها را دانلود یا آپلود نماییم.

مثال از دانلود با استفاده از Curl :

 $ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => 'ftp://ftp.alihossein.ir/x.txt',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => 'user:pass'
));

$output = curl_exec($ch);
echo($output) ;

تقریبا هماننند درخواست معمولیه HTTP است با یه سری تفاوت های جزیی.

  • CURLOPT_URL : آدرس فایل مورد نظر ما است . توجه کنید که به جای //:http باید //:ftp قرار دهید .
  •  CURLOT_USERPW : نام کاربری و کلمه ی عبور برای اتصال به ftp سرور مورد نظر

مثال از آپلود با استفاده از Curl :

آپلود فایل از طریق Curl کمی نسبت به دانلود کردن پیچیده تر است .

<?php
$ch = curl_init();

$fp = fopen('test.txt', 'r');
curl_setopt_array($ch, array(
CURLOPT_URL => 'ftp://ftp.alihossein.ir/test.txt',
CURLOPT_USERPWD => 'user:pass',
CURLOPT_UPLOAD => true,
CURLOPT_INFILE => $fp,
CURLOPT_INFILESIZE => filesize('test.txt')
));
curl_exec($ch);

fclose($fp);
curl_close($ch);
  • CURLOPT_UPLOAD : وقتی با true مقدار دهی کنیم به معنی این است که می خواهیم درخواست آپلود انجام بدهیم .
  • CURLOPT_INFILE :  یک stream قابل خواندن برای آپلود را دریافت می کند.(در اینجا همان فایلی است که قصد آپلود داریم)
  • CURLOPT_INFILESIZE : سایز فایلی که قصد آپلود داریم (به بایت)

ارسال درخواست های متعدد با استفاده از Curl

فرض کنید که می خواهیم 5 درخواست مختلف را با Curl اجرا کنیم . مثلا محتوای صفحه اول 5 سایت را بازیابی کنیم و حتما می دانیم که برخی از مسائل تحت کنترل ما نیست به عنوان مثال network latency (تاخیرات شبکه ) و یا سرعت پاسخ دهی سرور مقصد و ..
و قطعا این مسیله هم کاملا روشن هست که هرچقد تعداد درخواست های پشت سر هم ما بیشتر شود مقدار تاخیر و کندی پاسخ ها هم بیشتر هست .
خب راه حل چیست ! یکی از راه حل ها استفاده از درخواست های غیر همزمان یا ناهنگام (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);

 

منبع

+1 0
عالیه . به دوستان توصیه میکنم این مبحث رو یاد بگیرن . خیلی کارا میشه با این curl کرد . (8 سال پیش)
+1 0
یکی از کارهایی که با این مبحث انجام میدهند اتصال از راه دور به یک سرور برروی هاست دیگر می باشد. (6 سال پیش)
+1 0
آقای علیپور همیشه عالی بودین و هستین. میشه بگید این کارها با nusoap هم شدنیه؟ (6 سال پیش)
0 0
nusoap یک لایبری می باشد یکی از استفاده هایش برای درگاه بانکی است در آموزش های استاد در آموزش زرین پال استفاده شده همچنین در درگاه بانک ملت هم این رو دیدم (6 سال پیش)
 برای این سوال پاسخی وجود ندارد.

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