اولین باری که مجبور شدم با یک API خارجی در PHP ارتباط برقرار کنم هنوز PHP نسخه 5 بود و خیلی از چیزهای امروزی را نداشت. تنها ابزاری که واقعا به دادم رسید cURL بود. استفاده از cURL در PHP شاید در ظاهر ساده باشد اما وقتی وارد پروژه واقعی شوید متوجه میشوید که چقدر وجودش حیاتی است . با همین ابزار میتوانید اطلاعات واکشی کنید یا فرم ارسال کنید یا فایل بفرستید و حتی رفتار مرورگر را شبیه سازی کنید. اگر قرار باشد فقط یک ابزار برای ارتباط با سرویس های خارجی انتخاب کنم قطعا همین است.

چرا استفاده از cURL در PHP اینقدر مهم است؟
توابع داخلی PHP مانند file_get_contents برای دریافت ها کاربرد دارند، اما وقتی می خواهیم آن را تنظیم کنیم، وضعیت را کنترل کنید یا تایم اوت را مشخص کنید، محدودیتهای این روشها را مشخص کنید. cURL مثل یک جعبه ابزار کامل است. هر چیزی که برای یک درخواست حرفه ای لازم دارید را در اختیارتان میگذارد. از تنظیم SSL گرفته تا تغییر روش درخواست و ارسال JSON. هر پروژه جدی در نهایت به این ابزار میرسد.
ساختار اصلی یک درخواست با استفاده از cURL در PHP
هسته کار همیشه یکسان است. یک جلسه آغاز میکنید چند گزینه روی آن اعمال میکنید درخواست را اجرا میکنید و کار را تمام میکنید. اگر تا امروز با cURL کار نکرده باشید کد زیر ساده ترین نمونه است.
$curl = curl_init();
curl_setopt($curl CURLOPT_URL "https://example.com");
$response = curl_exec($curl);
curl_close($curl);
در ظاهر ساده است اما همین چند خط در پروژه واقعی بارها و بارها کاربرد دارد.
ارسال درخواست GET و نکته ای که معمولا فراموش می شود
درخواست GET در بیشتر API ها برای دریافت داده است. یک نکته جالب این است که اگر CURLOPT_RETURNTRANSFER را تنظیم نکنید پاسخ مستقیم در خروجی چاپ میشود و این موضوع خیلی ها را به اشتباه میاندازد.
$curl = curl_init(); curl_setopt($curl CURLOPT_URL "https://api.example.com/post"); curl_setopt($curl CURLOPT_RETURNTRANSFER true); $out = curl_exec($curl); curl_close($curl);
در نسخه هایی از PHP که قبلا استفاده میکردم اگر این گزینه را نمیگذاشتم حتی نمی فهمیدم API چه پاسخی داده است. پس این گزینه یکی از مهم ترین هاست.
ارسال داده با POST و رفتار متفاوت برخی API ها
ارسال داده با POST معمولا برای فرم ها یا ورود کاربر استفاده میشود. اما همه API ها یکسان نیستند. بعضی از API ها مقدار POSTFIELDS را فقط با ساختار فرم قبول میکنند.
$curl = curl_init(); curl_setopt($curl CURLOPT_URL "https://example.com/login"); curl_setopt($curl CURLOPT_POST true); curl_setopt($curl CURLOPT_POSTFIELDS [ "user" => "demo" "pass" => "1234" ]); curl_setopt($curl CURLOPT_RETURNTRANSFER true); $res = curl_exec($curl); curl_close($curl);
در یکی از پروژه ها API مقصد فقط داده فرم را میپذیرفت و وقتی JSON میفرستادم درخواست را نادیده میگرفت. این اتفاق زیاد پیش میآید.
ارسال JSON با استفاده از cURL در PHP
امروزه اکثر سرویس ها با JSON کار می کنند. اگر هدر Content Type را تنظیم نکنید API درخواست شما را به عنوان فرم در نظر میگیرد و نتیجه اشتباه است .
$data = ["id" => 5 "title" => "hello"]; $json = json_encode($data); $curl = curl_init(); curl_setopt($curl CURLOPT_URL "https://api.example.com/update"); curl_setopt($curl CURLOPT_POST true); curl_setopt($curl CURLOPT_POSTFIELDS $json); curl_setopt($curl CURLOPT_HTTPHEADER [ "Content-Type: application/json" ]); curl_setopt($curl CURLOPT_RETURNTRANSFER true); $out = curl_exec($curl); curl_close($curl);
این بخش جایی است که خیلی ها خطا میگیرند و ساعت ها دنبال دلیل آن میگردند.
تجربه آپلود فایل از طریق cURL
آپلود فایل همیشه برای من چالش بوده اما cURL کار را راحت میکند. کافی است یک شی فایل بسازید و آن را ارسال کنید.
$f = curl_file_create("test.jpg");
$curl = curl_init();
curl_setopt($curl CURLOPT_URL "https://example.com/upload");
curl_setopt($curl CURLOPT_POST true);
curl_setopt($curl CURLOPT_POSTFIELDS ["photo" => $f]);
curl_setopt($curl CURLOPT_RETURNTRANSFER true);
$r = curl_exec($curl);
curl_close($curl);
در سرورهای قدیمی که PHP آپدیت نبود مجبور بودیم از روش @file استفاده کنیم که امروز دیگر پیشنهاد نمیشود.
چند نکته که فقط با تجربه متوجه آنها میشوید
گاهی API ها پاسخ دیر میدهند یا اتصال قطع میشود. اگر زمان انتظار مشخص نکنید اسکریپت شما برای مدت طولانی معلق میماند.
curl_setopt($curl CURLOPT_TIMEOUT 12);
همچنین بهتر است خطاها را بررسی کنید چون بعضی خطاها در cURL ساکت هستند.
if(!$res){
$err = curl_error($curl);
}
خیلی از توسعه دهندگان این مرحله را فراموش میکنند و تشخیص مشکل سخت میشود.
1 ابزار جایگزین برای پروژه های پیچیده
اگر پروژه شما بزرگ است، Guzzle گزینه مناسبی است. Guzzle فقط کار را خواناتر و مدیریت درخواست ها را راحت تر میکند. برای پروژه های سبک نیازی به آن نیست اما برای سیستم های بزرگ باعث نظم بیشتر میشود .
نتیجه گیری
استفاده از cURL در PHP یک مهارت ضروری برای هر توسعه دهنده است . هرچه بیشتر با API ها کار کنید بیشتر متوجه میشوید که بدون این ابزار نمیتوان پیش رفت . اهمیت آن فقط در ارسال درخواست نیست بلکه در مدیریت خطا کنترل هدرها و رفتار دقیق درخواست هاست . با تجربه و اجرای چند سناریوی واقعی به مرحله ای میرسید که تقریبا هر سرویس خارجی را میتوانید به برنامه خود متصل کنید. یادگیری cURL یک بار انجام میشود اما در تمام پروژه های آینده اثرش را خواهید دید.