بکندباز

curl در php ‌+ نمونه کد

امروز، قصد داریم افزونه 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 بود.

zohreh

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*