امروز، قصد داریم افزونه cURL در PHP را با هم بررسی کنیم، که به شما امکان میدهد درخواستهای HTTP را از درون کد خود انجام دهید.
شما در کدنویسی PHP خود خیلی پیش می آید که نیاز به برقراری ارتباط با وب سایت های خارجی دارید. چه برای اتصال به API های REST برای دریافت داده ها یا دانلود منابع از یک وب سایت خارجی باشد، شما کتابخانه ای می خواهید که به شما امکان می دهد این کار را بدون زحمت انجام دهید.
در PHP روش های مختلفی وجود دارد که می توانید برای اتصال و ارتباط با انواع مختلف سرورها استفاده کنید. یکی از ساده ترین راه ها استفاده از تابع file_get_contents
برای خواندن فایل های remote است. از سوی دیگر، میتوانید از سوکتها نیز برای پیادهسازی ارتباط مشتری و سرور استفاده کنید. اما در این مقاله، ما قصد داریم به طور مفصل در مورد افزونه cURL با مثالهای واقعی صحبت کنیم.
cURL مخفف client URLs است و کتابخانه ای است که به شما امکان می دهد اطلاعات را با سینتکس URL ارسال و دریافت کنید. در واقع، از کتابخانه libcurl (ساخته شده توسط دانیل استنبرگ) استفاده می کند که به شما امکان می دهد با انواع مختلف پروتکل ها به انواع مختلف سرورها متصل شوید و با آنها ارتباط برقرار کنید. جدا از HTTP و HTTPS، کتابخانه libcurl از پروتکل هایی مانند FTP، Gopher، Telnet، DICT، File و LDAP نیز پشتیبانی می کند.
از بخش بعدی به بعد، چند مثال در دنیای واقعی برنامه نویسی را مرور خواهیم کرد تا نشان دهیم چگونه می توانید از توابع cURL در PHP در پروژه های واقعی خود استفاده کنید.
نمونه های پروژه های واقعی
در این بخش، نمونههایی از کدهای واقعی برای نشان دادن توابع مختلف cURL در PHP میسازیم.
نحوه دانلود فایل ها با استفاده از cURL در PHP
خواندن یا دانلود فایل های از راه دور یکی از رایج ترین موارد استفاده برای cURL است. این کار با درخواست cURL GET انجام می شود که در این بخش به آن خواهیم پرداخت.
فایل curl_read_file.php را با محتویات زیر ایجاد کنید.
<?php
$url = 'https://www.example.com';
$curlHandle = curl_init();
curl_setopt($curlHandle, CURLOPT_URL, $url);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlHandle, CURLOPT_HEADER, false);
$responseData = curl_exec($curlHandle);
curl_close($curlHandle);
در مثال بالا، ما از توابع cURL برای خواندن محتوای صفحه اصلی دامنه example.com استفاده کرده ایم. بیایید بخش های مهم را مرور کنیم تا بفهمیم چگونه کار می کند.
در ابتدا، ما از تابع curl_init
برای مقداردهی اولیه یک سشن (session) cURL جدید استفاده کرده ایم. متغیر $curlHandle
دارای یک cURL handle است که می توانیم از آن برای تنظیم گزینه های مختلف برای انتقال cURL با کمک تابع curl_setopt
استفاده کنیم.
وقتی با cURL کار میکنید، این تابع curl_setopt
همان تابعی است که بیشتر با آن سروکار دارید، زیرا به شما اجازه میدهد تا با CURLOPT_*
گزینههای مختلف درخواست را مقداردهی اولیه کنید. تابع curl_setopt
سه آرگومان می گیرد: یکcURL handle، گزینه CURLOPT_XXX
و مقدار گزینه CURLOPT_XXX
.
در مرحله بعد، از گزینه CURLOPT_URL
برای تنظیم URL درخواست (example.com)
با تابع curl_setopt
استفاده کرده ایم. علاوه بر این، ما گزینه CURLOPT_RETURNTRANSFER
را TRUE
تنظیم کردهایم چرا که میخواهیم پاسخ را در متغیر $responseData
بریزیم. اگر آن را روی TRUE
تنظیم نکنیم، پاسخ مستقیماً روی صفحه نمایش داده می شود. در نهایت، ما گزینه CURLOPT_HEADER
را FALSE
تنظیم کردهایم که از ارسال اطلاعات header در خروجی صرف نظر کنیم.
در نهایت، از تابع curl_exec
برای اجرای درخواست cURL استفاده کردهایم. اگر همه چیز خوب پیش رفت، متغیر $responseData
باید حاوی سورس کد صفحه اصلی example.com
باشد.
نحوه ارسال داده با استفاده از cURL در PHP
در این بخش، نحوه ارسال داده با cURL را خواهیم دید.
بیایید فایل curl_post_example.php را با محتویات زیر ایجاد کنیم.
<?php
$url = '{POST_REST_ENDPOINT}';
$curl = curl_init();
$fields = array(
'field_name_1' => 'Value 1',
'field_name_2' => 'Value 2',
'field_name_3' => 'Value 3'
);
$fields_string = http_build_query($fields);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
$data = curl_exec($curl);
curl_close($curl);
در مثال بالا، فرض می کنیم که باید درخواستی را با روش HTTP POST ارسال کنیم. در واقع کارکرد آن مشابه ارسال فرم با متد POST است.
متغیر $fields
دارای آرایه ای از مقادیر است که باید به عنوان داده POST ارسال کنیم. در مرحله بعد، ما از تابع http_build_query
برای تهیه یک رشته query که URL-encode شده استفاده کرده ایم.
در مرحله بعد، گزینه CURLOPT_POST
را برای تنظیم روش درخواست به HTTP POST روی TRUE
تنظیم کرده ایم. علاوه بر این، باید از گزینه CURLOPT_POSTFIELDS
برای تنظیم داده های POST که می خواهیم همراه با درخواست ارسال کنیم استفاده کنیم.
در نهایت، ما از تابع curl_exec
برای اجرای درخواست cURL استفاده کردهایم. بنابراین از این طریق می توانید درخواست cURL POST را ارسال کنید.
نحوه ارسال داده های JSON با استفاده از cURL در PHP
اغلب اوقات، شما باید داده های JSON را در یک درخواست cURL POST ارسال کنید. در این بخش، خواهیم دید که چگونه می توانید داده های JSON را با روش POST در یک درخواست cURL ارسال کنید.
از آنجایی که این یک درخواست POST است، بیایید مثالی را که در بخش قبل مورد بحث قرار دادیم کمی ویرایش کنیم.
فایل curl_post_json.php را با محتویات زیر ایجاد کنید.
<?php
$url = '{POST_REST_ENDPOINT}';
$curl = curl_init();
$fields = array(
'field_name_1' => 'Value 1',
'field_name_2' => 'Value 2',
'field_name_3' => 'Value 3'
);
$json_string = json_encode($fields);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json_string);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true );
$data = curl_exec($curl);
curl_close($curl);
اگرچه ممکن است شبیه به مثال در بخش قبل به نظر برسد، اما نکته مهم این است که ما از تابع json_encode
برای ایجاد یک رشته JSON از آرایه $fields
استفاده کردهایم.
در مرحله بعد، ما از گزینه CURLOPT_HTTPHEADER
برای تنظیم هدر Content-Type
استفاده کرده ایم و مقدار آن را برابر با application/json
قرار دهیم تا به سرور API اطلاع دهیم که داده های JSON را ارسال می کنیم. هدر Content-Type
برای ارسال داده ها در قالب های مختلف مفید است. برای مثال، اگر میخواهید دادههای XML ارسال کنید، باید هدر Content-Type
را روی application/xml
تنظیم کنید.
به جز این موارد، بقیه کد تقریباً مشابه درخواست معمولی POST است. بنابراین به این ترتیب می توانید انواع مختلف داده را با تنظیم هدر Content-Type
مناسب ارسال کنید. اگر هدر Content-Type
را تنظیم نکنید، مقدار application/x-www-form-urlencoded
به عنوان مقدار پیش فرض استفاده می شود.
نحوه آپلود فایل ها با استفاده از cURL در PHP
در این بخش، نحوه آپلود فایل ها با cURL را مورد بحث قرار خواهیم داد.
بیایید فایل curl_post_file.php را با محتویات زیر ایجاد کنیم.
<?php
$url = '{POST_REST_ENDPOINT}';
$curl = curl_init();
if (function_exists('curl_file_create')) {
$fileAttachment = curl_file_create('/absolute/path/to/file/');
} else {
$fileAttachment = '@' . realpath('/absolute/path/to/file/');
}
$fields = array(
'field_name_1' => 'Value 1',
'field_name_2' => 'Value 2',
'field_name_3' => 'Value 3',
'uploaded_file' => $fileAttachment
);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
$data = curl_exec($curl);
curl_close($curl);
هنگامی که می خواهید یک فایل را آپلود کنید، در وهله اول باید یک شیء CURLFile
ایجاد کنید. از PHP 5.5 به بعد، ایجاد آن نسبتاً آسان است، زیرا فقط باید از تابع curl_file_create
برای ایجاد یک شیء CURLFile
استفاده کنید. اولین آرگومان تابع curl_file_create
مسیر مطلق فایلی است که می خواهید آپلود کنید.
اگر هنوز از نسخه قدیمی PHP استفاده میکنید، که توصیه نمیشود، ما از دستور '@' . realpath('/absolute/path/to/file/')
برای ایجاد پیوند فایل استفاده کردهایم.
در نهایت، ما هدر Content-Type
را روی multipart/form-data
تنظیم کردهایم چون قرار است یک درخواست POST از فرم چند بخشی باشد. به غیر از آن، بقیه کد یک درخواست معمولی cURL POST است.
تا کنون، ما چند روش مختلف cURL را که اغلب در PHP استفاده میشوند، بررسی کردهایم. در بخش بعدی، خواهیم دید که چگونه میتوانید از کتابخانه Guzzle استفاده کنید، که وقتی با درخواستهای HTTP در PHP سروکار دارید، کار را برای شما آسانتر میکند.
Guzzle HTTP Client چیست؟
طبق اسناد رسمی:
Guzzle یک سرویس گیرنده PHP HTTP است که ارسال درخواست های HTTP را آسان و ادغام با سرویس های وب را ساده می کند.
بیایید به سرعت مزایای استفاده از Guzzle را بر روی توابع cURL PHP مرور کنیم:
- یک رابط ساده برای انواع مختلف داده ها
- از درخواست های همزمان و ناهمزمان پشتیبانی می کند
- از cURL، سوکت ها و جریان های PHP پشتیبانی می کند
- سازگار با PSR-7
- و بیشتر
در مجموع، این کتابخانه، یکی از بهترین کتابخانه ها برای استفاده در زمانی است که می خواهید با روش های مختلف ارتباط های HTTP برقرار کنید. در این بخش، نحوه نصب Guzzle را مورد بحث قرار خواهیم داد، سپس چند مثال سریع برای نشان دادن قدرت این کتابخانه ارائه خواهیم کرد!
نحوه نصب کتابخانه Guzzle
اسناد رسمی توصیه می کنند که برای نصب Guzzle از Composer استفاده کنید. (آموزش مرتبط = composer چیست و چگونه نصب می شود؟)
دستور زیر را برای نصب Guzzle در پروژه خود اجرا می کنیم.
composer require guzzlehttp/guzzle:^7.0
$composer require guzzlehttp/guzzle:^7.0
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 6 installs, 0 updates, 0 removals
- Installing psr/http-message (1.0.1): Loading from cache
- Installing psr/http-client (1.0.1): Loading from cache
- Installing ralouphie/getallheaders (3.0.3): Loading from cache
- Installing guzzlehttp/psr7 (1.7.0): Loading from cache
- Installing guzzlehttp/promises (1.4.1): Loading from cache
- Installing guzzlehttp/guzzle (7.2.0): Loading from cache
guzzlehttp/psr7 suggests installing laminas/laminas-httphandlerrunner (Emit PSR-7 responses)
guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware)
Writing lock file
Generating autoload files
ارسال درخواست GET با استفاده از Guzzle
در این بخش، خواهیم دید که چگونه می توانید درخواست های GET را با Guzzle ارسال کنید.
ما مثالی را که قبلاً در مورد آن صحبت کردیم با این روش باز نویسی می کنیم، زیرا به شما کمک می کند تا بفهمید چگونه می توانید کد cURL PHP موجود خود را به پیاده سازی مبتنی بر Guzzle تبدیل کنید.
بیایید نگاهی به مثال اصلاح شده بیندازیم.
<?php
require 'vendor/autoload.php';
$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com');
$responseContents = $response->getBody();
یک نمونه از کلاس \GuzzleHttp\Client
ایجاد کرده ایم و به متغیر $client
اختصاص داده شده است. و اکنون، شما به بسیاری از متد های کاربردی ارائه شده توسط کلاس \GuzzleHttp\Client
دسترسی دارید.
در مورد ما، باید محتوا را با متد GET واکشی کنیم، بنابراین از متد get
کلاس \GuzzleHttp\Client
استفاده کردهایم و شیء GuzzleHttp\Psr7\Response
را برمیگرداند. شیء GuzzleHttp\Psr7\Response
متدهای مختلفی مانند getBody
، getReasonPhrase
، getStatusCode
و غیره را ارائه می دهد. ما از متد getBody
برای واکشی محتوای بدنه پاسخ استفاده کرده ایم.
بنابراین به این ترتیب می توانید درخواست های HTTP GET را با Guzzle انجام دهید.
چگونه یک درخواست POST با Guzzle ایجاد کنیم
در این بخش، خواهیم دید که چگونه می توانید درخواست های HTTP POST را با Guzzle انجام دهید.
ما مثال curl_post_example.php را که در بخش قبلی مورد بحث قرار دادیم، اصلاح می کنیم. کد اصلاح شده با Guzzle به این شکل است.
<?php
require 'vendor/autoload.php';
$client = new \GuzzleHttp\Client();
$options = [
'form_params' => [
"field_name_1" => "Value 1",
"field_name_2" => "Value 2",
"field_name_3" => "Value 3",
]
];
$response = $client->post("{POST_REST_ENDPOINT}", $options);
$responseContents = $response->getBody();
?>
از آنجایی که این یک درخواست POST است، باید آرایه $options
را به عنوان آرگومان دوم متد post
ارسال کنیم. مثال ما، حاوی داده های فرم است که باید به عنوان داده POST ارسال کنیم.
اگر نمیدانید چگونه دادههای JSON را پست کنید، فقط باید کلید form_params
را به json
تغییر دهید و به سادگی دادهها به صورت JSON ارسال میشوند!
همچنین، اگر میخواهید هر هدر HTTP را همراه با درخواست ارسال کنید، میتوانید این کار را با کلید headers
انجام دهید، همانطور که در قطعه زیر نشان داده شده است.
$headers = array(
'Content-Type' => 'application/json'
);
$options = [
'json' => [
"field_name_1" => "Value 1",
"field_name_2" => "Value 2",
"field_name_3" => "Value 3",
],
'headers' => $headers
];
در واقع، کتابخانه Guzzle گزینه های پیکربندی زیادی را برای هر روش ارائه می دهد. همچنین، راههای متعددی برای انجام یک کار وجود دارد، بنابراین من شما را تشویق میکنم آن را با جزئیات بررسی کنید، و مطمئن هستم که سرگرمکننده خواهد بود!
این یک معرفی سریع برای کتابخانه Guzzle، همراه با توابع PHP cURL بود.
دیدگاهها