نماد سایت امپراطوری من

آشنایی با cURL در PHP

php

cURL چیست؟

امکانیست برای ارسال درخواست از PHP به سرورهای دیگر.  یعنی کد PHP مانند یک کاربر درخواست خود را به سرور دیگری می فرستد و جواب را دریافت می کند. البته به کمک cURL علاوه بر درخواست های HTTP می توان از پروتکل های دیگر مانند FTP نیز استفاده نمود. اما مبحثی که در این پست دنبال خواهیم کرد، نحوه ارسال درخواست های HTTP و بخصوص نوع GET  و POST آن خواهد بود.

[divider]

برای شروع باید از تابع curl_init استفاده کنیم. خروجی این تابع یک object خواهد بود و باید آن را در یک متغیر نگهداری کنیم.


$curl = curl_init();

قدم بعدی اعمال تنظیمات مناسب برای ساخت دستور دلخواه است. مثلا اینکه مقدار TimeOut برای اجرای دستور چقدر باشد، متد درخواست GET باسد یا POST و… برخی از این مقادیر را در ادامه معرفی میکنم. اما برای اعمال این تنظیمات باید از تابع curl_setopt استفاده کنیم.


curl_setopt($curl, CURLOPT_URL, 'http://testcURL.com');

در دستور بالا اعیین نمودیم که درخواست ما قرار است به چه آدرسی فرستاده شود. در ادامه تعدادی از مهم ترین تنظیماتی که بیشترین کاربرد را دارند مشاهده می کنید:

CURLOPT_RETURNTRANSFER: اگر برابر ۱ باشد نتیجه به عنوان string در متغیر قرار می گیرد و در صورتی که ۰ باشد نتیجه مستقیما چاپ خواهد شد.

CURLOPT_URL: آدرسی که می خواهیم درخواست را به آن ارسال کنیم.

CURLOPT_POST: اگر برابر ۱ باشد درخواست با متد POST ارسال خواهد شد و در غیر اینصورت درخواست با متد GET ارسال می شود.

CURLOPT_POSTFIELDS: اگر متد درخواست از نوع POST باشد، مقادیری که میخواهیم پست شوند را بصورت آرایه در این متغیر قرار می دهیم. در مورد درخواست GET نیز می دانیم که مقادیر بعنوان query string در URL قرار می گیرند.

CURLOPT_USERAGENT: این قسمت در واقع به سرور هدف میفهماند که شما از طریق چه مرورگر و چه سیستمی درخواست خود را ارسال می کنید. مثلا می توانید اعلام کنید که شما درخواست خود را از مرورگر فایرفاکس و سیستم عامل ویندوز ۱۰ ارسال کرده اید!

<span class="pln">CURLOPT_COOKIEFILE</span>: به کمک این پارامتر می توانید فایل کوکی مورد نظر خود را ضمیمه درخواست کنید. این کار زمانی نیاز است که درخواست شما نیاز به اهراز هویت دارد و یا اینکه به سروری می خواهید درخواست بفرستید که نیازمند لاگین است.

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

CURLOPT_CONNECTTIMEOUT: مدت زمانی است بر حسب ثانیه و به این مفهوم که درخواست ما چند ثانیه فرصت دارد تا بتواند به سرور هدف متصل شود.

CURLOPT_TIMEOUT: این پارامتر نیز مدت زمانی است بر حسب ثانیه و بیانگر اینکه بعد از اتصال به سرور هدف، مدت زمانی که درخواست ما باید پاسخ داده شود چند ثانیه است.

در مورد TImeOut ها به این نکته توجه کنید که PHP در فایل تنظیمات خود یک Timeout برای مدت زمان اجرا دارد و به این معنی است که درخواست کاربر باید نهایتا ظرف چند ثانیه پاسخ داده شود. اگر درخواست cURL شما بیشتر از این مقدار زمان بخواهد نمیتوانید به درستی به کاربران پاسخ دهید.

در گام نهایی نوبت به ارسال درخواست می رسد. این کار توسط تابع curl_exec انجام می شود. این تابع object مورد نظری که ایجاد نمودیم و تنظیمات را بر روی آن انجام دادیم را در ورودی دریافت می کند و دستور مورد نظرمان را اجرا کرده و پاسخ آن را تحویل میدهد. این تایع بنابر تنظیمات انجام شده بر روی درخواست ممکن است یکی از مقادیر زیر را خروجی دهد:

۱- مقدار false در صورتی که خطایی رخ بدهد و درخواست ما با مشکل روبرو شود.

۲- مقدار true در صورتی که درخواست بدون مشکل اجرا شود و مقدارCURLOPT_RETURNTRANSFER در تنظیمات برابر false باشد.

۳- جواب دریافتی از سرور در صورتی که مقدارCURLOPT_RETURNTRANSFER در تنظیمات برابر true باشد.

$response = curl_exec($curl);

در مرحله آخر، پس از اجرای دستور باید object ساخته شده در ابتدای کار را نابود کنیم تا منابع درگیر آزاد شوند. این کار به کمک دستور curl_close صورت می گیرد.

curl_close($curl);

[divider]
حال بیاید با مطالبی که آموختیم یک درخواست نمونه ارسال کنیم:

// Get cURL resource
$curl = curl_init();
// Set some options - we are passing in a useragent too here
curl_setopt_array($curl, array(
 CURLOPT_RETURNTRANSFER => 1,
 CURLOPT_URL => 'http://testcURL.com/?item1=value&item2=value2',
 CURLOPT_USERAGENT => 'Codular Sample cURL Request'
));
// Send the request &amp;amp;amp;amp; save response to $resp
$resp = curl_exec($curl);
// Close request to clear up some resources
curl_close($curl);

مثال فوق نمونه‌ای از درخواست با متد GET بود. در ادامه مثالی هم از متد POST بیان می‌کنیم:

// Get cURL resource
$curl = curl_init();
// Set some options - we are passing in a useragent too here
curl_setopt_array($curl, array(
 CURLOPT_RETURNTRANSFER => 1,
 CURLOPT_URL => 'http://testcURL.com',
 CURLOPT_USERAGENT => 'Codular Sample cURL Request',
 CURLOPT_POST => 1,
 CURLOPT_POSTFIELDS => array(
 item1 => 'value',
 item2 =>'value2'
 )
));
// Send the request & save response to $resp
$resp = curl_exec($curl);
// Close request to clear up some resources
curl_close($curl);

[divider]
از آنجا که ما از Error ها متنفریم و می‌دانیم وقوع آنها روند کار سیستم ما را با مشکل روبرو می‌کند، بهتر است وقوع خطا در هنگام اجرای درخواست با cURL را نیز در نظر بگیریم.

این کار بسیار ساده صورت می گیرد. تنها کافیست پس از اجرای دستور curl_exec از تابع curl_error استفاده کنیم. اگر خطایی رخ داده باشد این تابع متن مربوط به خطا را به عنوان خروجی خواهد داد و در صورتی که خطایی رخ نداده باشد ” که یک رشته تهی است خروجی تابع خواهد بود.

اگر می‌خواهید جزئیات دقیق تری از خطای رخ داده داشته باشید، بهتر است به جای تابع curl_error از تابع curl_errno استفاده کنید. این تابع در زمان بروز هر گونه خطا، کد مربوط به آن خطا را به عنوان خروجی می دهد. لیست این کدها را می توانید در اینجا مشاهده کنید. به مثال زیر که در آن از هر دو تابع curl_error و curl_errno بطور همزمان استفاده شده است توجه کنید:

if(!curl_exec($curl)){
 die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}

موفق و پیروز باشید…

خروج از نسخه موبایل