شنبه ۲۲ شهریور ۱۴۰۴

Saturday, September 13, 2025 GMT +3:30

ارسال پارامتر به URL و دریافت مقادیر با PHP

php-curl-file-get-contents

زمانی که از ارسال پارامتر در وب صحبت می کنیم، بیشتر ذهنمان معطوف به فرم های HTML و متد POST یا GET می شود، البته این شیوه مرسوم و پرکاربردی برای ارسال داده ها از مرورگر (سمت کاربر) به یک سایت (سمت سرور) است، اما گاهی مواقع نیاز است که از این قالب سنتی پا را فراتر بنهیم و از روش های دیگری نیز استفاده کنیم، به فرض از همین استاندارد POST و GET در ارسال درخواست های آژاکسی (Ajax) نیز به سرور استفاده می شود، از طرفی کدها و توابعی در PHP وجود دارد که می توانند علاوه بر ارسال پارامترها به یک سرور (آدرس URL)، پاسخ آن را نیز دریافت کنند، امکان بالقوه ای که می تواند کاربردهای زیادی داشته باشد، از جمله مهمترین این توابع file_get_contents و cURL هستند که در ادامه آموزش به آنها خواهیم پرداخت.

تابع file_get_contents


از تابع file_get_contents در PHP برای خواند اطلاعات یک فایل یا آدرس URL استفاده می شود، به عنوان مثال:
<?php
$homepage = file_get_contents('https://webgoo.ir/');
echo $homepage;
?>
کد بالا با ارسال یک درخواست به آدرس تعیین شده، پاسخ سرور (که صفحه اول سایت «وبگو» است) را به صورت رشته متنی دریافت می کند، اکنون اگر با دستور echo از متغیر فرضی homepage خروجی بگیریم، اطلاعات دریافت شده نمایش داده می شوند.
تابع file_get_contents  پنج آرگومان به شرح زیر می پذیرد:
- آرگومان اول (filename): نام (یا آدرس) فایل یا URL.
- آرگومان دوم (use_include_path): فراخوانی فایل از دایرکتوری include_path در تنظیمات PHP.
- آرگومان سوم (context): محتوایی که به همراه درخواست ارسال می شود، این محتوا باید توسط تابع  stream_context_create (و بر اساس استانداردهای HTTP context options) ساخته شود تا معتبر باشد، تنظیمات قابل اعمال در این قسمت عبارتند از: method، header، user_agent، content، proxy، request_fulluri، follow_location، max_redirects، protocol_version، timeout و ignore_errors؛ اطلاعات بیشتر:
http://php.net/manual/en/context.http.php
- آرگومان چهارم (offset): محل و خط شروع خواندن اطلاعات (این قابلیت به دلیل پشتیبانی نشدن برای فایل های لوکال و محدودیت هایش، چندان کاربردی نیست).
- آرگومان پنجم (maxlen): حداکثر کاراکتری که تابع خواهد خواند (در حالت پیش فرض تمام اطلاعات خوانده می شود).

تابع file_get_contents و متد POST


تابع file_get_contents علاوه بر دریافت پاسخ یک سرور، این توانایی را دارد که در چاچوب متد POST پارامترهایی نیز به سرور مقصد ارسال نماید، همان طور که در توضیح آرگومان های آن گفته شد، این پارامترها باید در چارچوب استاندارد HTTP بوده و پیش از ارسال توسط تابع stream_context_create معتبر شوند، به این ترتیب می توان نحوه کار فرم های HTML را به راحتی شبیه سازی کرد، ضمن اینکه علاوه بر ارسال پارامترها، می توان هم زمان نتیجه درخواست را نیز دریافت کرد، به مثال زیر توجه کنید.
<?php
//مقادیری که باید ارسال شوند
$data = http_build_query(
    array(
    'var_1' => 'content_1',
    'var_2' => 'content_2',
    'var_3' => 'content_3'
    )
);
//تنظیم سربرگ های http
$http = array('http' =>
    array(
    'method'  => 'POST',
    'header'  => 'Content-type: application/x-www-form-urlencoded',
    'content' => $data
    )
);
//معتبر سازی با stream_context_create
$context = stream_context_create($http);
//ارسال درخواست و دریافت نتیجه
$result = file_get_contents('http://www.example.com/submit/get.php', FALSE, $context);
?>
نکته: برای نمایش نتیجه دریافتی می توانید از یک دستور ساده echo استفاده کرده و از متغیر result خروجی بگیرید.

تابع cURL


یکی از قدرتمند ترین کتابخانه های مربوط به کار با پروتکل های وب در PHP، کتابخانه libcurl است که از نسخه 4.0.2 به آن افزوده شده است، البته این کتابخه به صورت پیش فرض در مفسر PHP وجود ندارد، اما به جهت کاربردی بودن، معمولا در اکثر سرورها به صورت پیش فرض فعال است، به طور ساده کتابخانه libcurl دربرگیرنده مجموعه توابعی است که کار با پروتکل های وب (از جمله HTTPS، HTTP، FTP و...) را به صورت حرفه ای و با قابلیت های زیاد ممکن می کند، به مثال زیر توجه کنید.
<?php
$content = 'PHP cURL';
$curl = curl_init('http://www.example.com/submit/get.php');
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'var='.$content);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, FALSE);
$result = curl_exec($curl);
curl_close($curl);
?>
همان طور که در مثال بالا مشخص است، توابع مربوط به این کتابخانه با پیشوند _curl شروع می شوند، اما توضیح مختصری درباره برخی توابع این کتابخانه:
- تابع curl_init: با دریافت یک آدرس url، نشست cURL را آغاز می کند.
- تابع curl_setopt: تنظیم پارامترهای مورد نیاز برای اجرای صحیح یک نشست cURL.
- تابع curl_exec: اجرای یک نشست cURL.
- تابع curl_close: پایان یک نشست cURL.
- تابع curl_error: آخرین خطای رخ داده در نشست را نمایش می دهد.
- تابع curl_errno: شماره خطای برگردانده شده را نمایش می دهد.
البته توابع مربوط به این کتابخانه محدود به موارد گفته شده نمی شود:
http://www.php.net/manual/en/book.curl.php
به مثالی کاربردی توجه کنید.
<?php
//تنظیم آدرس url
$curl = curl_init('http://www.example.com/submit/get.php');
//تنظیم ارسال از طریق متد POST
curl_setopt($curl, CURLOPT_POST, 1);
//تنظیم پارامترها
curl_setopt($curl, CURLOPT_POSTFIELDS, 'var_1=content_1&var_2=content_2&var_3=content_3');
//تعین اینکه پاسخ سرور دریافت شود یا خیر
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
//اجرای نشست
$result = curl_exec($curl);
//پایان نشست
curl_close($curl);
?>
توضیح:
- آدرس url مقصد را در قسمت curl_init مشخص کنید.
- در تنظیمات مربوط به CURLOPT_POST، متد استفاده شده در درخواست را مشخص می کنیم، اگر مقدار 1 یا TRUE باشد، مقادیر CURLOPT_POSTFIELDS از طریق متد POST ارسال شده و پارامترهای احتمالی در آدرس URL نادیده گرفته می شوند (امکان ترکیب متد POST و GET در این حالت وجود ندارد).
- در تنظیمات قسمت CURLOPT_POSTFIELDS، پارامترها و مقادیر آنها را تعیین کنید، این پارامترها در واقع نقش نام فیلد و مقادیر آنها نقش مقدار فیلد را در یک فرم HTML بازی می کنند.
- در قسمت CURLOPT_RETURNTRANSFER، مشخص می کنیم که آیا پاسخ سرور نیز پس از ارسال درخواست دریافت شود یا خیر، اگر مقدار TRUE باشد، پاسخ به صورت رشته متنی دریافت می شود و اگر FALSE باشد، پاسخ دریافت نمی شود.
- برای تکمیل یک نشست cURL باید حتما با تابع curl_exec آن را اجرا کنیم.
- در نهایت نیز با تابع curl_close، نشست cURL را خاتمه می دهیم.
نکته: برای نمایش نتیجه دریافتی می توانید از یک دستور ساده echo استفاده کرده و از متغیر result خروجی بگیرید.
دسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
آموزش ساخت نقشه XML سایت (Sitemap) با PHP و MySQL
ارسال ایمیل با PHP و کلاس PHPMailer
ساخت فید خوان آر اس اس (RSS Feed Reader) با PHP
نمایش آمار بازدیدها با PHP بدون استفاده از دیتابیس
ساخت منوی هوشمند با PHP و CSS
دیدگاه
more ۱۴۶ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
حامد میرزایی
۱۵:۴۰ ۱۳۹۶/۱۱/۰۵
سلام خسته نباشید
یک سوالی از خدمتتون داشتم و خواهشا در این موضوع راهنمایی کنید با دستورات php می خواهیم کاری انجام دهیم که لود عکس ها 5 ثانیه دیرتر انجام بشه و برای لود فایل عکس کدی به شکل زیر داریم
$image_path='name.jpg';
$image=imagecreatefromjpeg($image_path);
header('Content-Type: image/jpeg');
imagejpeg($image);
مشکل کار اینجاست که حق استفاده از جاوا اسکریپت و اچ تی ام ال نداریم هرچی بنویسیم باید php باشه
ممنون از لطفتون
منتظر پاسخ از طرفتون هستم
PHP برای هدف شما مناسب نیست چون ایجاد وقفه در بارگذاری تصاویر فرآیندی مرتبط با سمت کاربر است، در هر صورت می توانید توابعی مانند unsleep را امتحان کنید:
<?php
//sleep (5 seconds/5000000 microseconds)
usleep(5000000);

//usleep
کدها را اینجا درج کنید.
?>
هادی
۲۰:۴۲ ۱۳۹۶/۱۱/۰۲
درود
من از یک API دارم ارسال و دریافت میزنم و مشکلی اینه که وقتی یه درخواست از دیتابیس ارسال میشه راحت جواب میاد ولی وقتی گزینه های دیتابیس بیشتر هستند دیگه کار نمیکنه
مثال
حذف شد
باز هم اگر یکی باشه کار میکنه
این نوع مشکلات در حین اجرا باید تست و بررسی شوند، متاسفانه با تکه کدهای درج شده نمی توانیم علت بروز چنین حالتی را در کوتاه مدت حدس بزنیم.
۰۲:۳۳ ۱۳۹۶/۰۸/۰۲
ببخشید میشه از ادرس یه قسمت رو حذف کنیم یعنی ادرس رو بگیرم یه قسمتی رو حذف کنیم و دوباره برگردونیم
مثلا برای کوتاه کردن لینک؟؟؟؟
سوالتان کمی مبهم است! اگر منظورتان طراحی سیستم هایی مانند کوتاه کننده لینک است این سایت ها برای آدرس URL اصلی یک معادل در دامنه خود به صورت کوتاه تعریف می کنند، زمانی که آدرس معادل از سرور آنها درخواست می شود، با انجام ریدایرکت کاربر را به آدرس URL اصلی هدایت می کنند، شکل دیگر این کار این است که محتوای سایت مورد نظر را در دامنه خود نشان می دهند که با تابع curl در PHP ممکن است، به شرط اینکه سایت هدف چنین قابلیتی را مسدود نکرده باشد.
ستار
۱۹:۲۶ ۱۳۹۶/۰۶/۲۰
سلام
من یه ادرس دارم که یه پست رو توی سایت میفرسته مثل
x.com/post.php?post=salam
که با curl کاملا کار میکنه و من اون رو توی کرون جاب گذاشتم و نتیجه دلخواه رو گرفتم اما مشکل اینه که اگه بخوام اون salam رو فارسی بنویسم وقتی توی مرورگر میزنم کاملا درست عمل میکنه و عبارت سلام میره اما وقتی توی curl میخوام توی هاستم سیو کنم تغییر قیافه میده و اینجوری سیو میشه
&#1587;&#1604;&#1575;&#1605;
باید چکار کنم درست بشه؟
ممنون
این مشکل نیاز به بررسی و تست آنلاین دارد، جهت راهنمایی بیشتر احتمالا باید از توابعی مانند urlencode یا utf8_decode استفاده کنید:
https://www.google.com/search?q=curl+utf-8+url
هادی
۰۹:۵۲ ۱۳۹۶/۰۵/۱۴
با سلام و عرض خسته نباشید
متد http_build_query کارش چیه؟
ممنون از شما
این متد یک آرایه به عنوان آرگیومنت می گیرد و یک رشته استاندارد برای ارسال پارامترهای قابل استفاده در متد POST یا GET خروجی می دهد که به آن در اصطلاح URL-encoded Query String می گویند، مثال و راهنمایی بیشتر:
http://php.net/manual/en/function.http-build-query.php
مهران
۱۲:۲۰ ۱۳۹۶/۰۵/۰۸
سلام خدا قوت
من از کد زیر استفاده میکنم
<?php
//مقادیری که باید ارسال شوند
$data = http_build_query(
array(
'var_1' => 'content_1',
'var_2' => 'content_2',
'var_3' => 'content_3'
)
);
//تنظیم سربرگ های http
$http = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $data
)
);
//معتبر سازی با stream_context_create
$context = stream_context_create($http);
//ارسال درخواست و دریافت نتیجه
$result = file_get_contents('http://www.example.com/submit/get.php', FALSE, $context);
?>
اگه بخوام ارایه ارسالی را در صفحه
http://www.example.com/submit/get.php
پردازش کنم باید چی کار کنم میخوام توی صفحه اعلامی حداقل ارایه data رو بتونم نمایش بدم
ممنون میشم زودتر جواب بگیرم
آرایه صرفا جهت ساخت و ارسال پارامترها در متد POST استفاده می شود، در واقع پس از ارسال درخواست در سمت سرور و فایل PHP، دیگر آرایه قابل دسترسی نیست و پارامترهای آن قابل دریافت هستند، به فرض:
$var_1 = @$_POST['var_1'];
ارشیا
۲۱:۰۶ ۱۳۹۶/۰۵/۰۴
با سلام و خسته نباشید
من مشکلی در دریافت مقادیر از یک سایت دارم
من پارامتر هایی رو با curl به یک سایت ارسال میکنم و سایت مقادیری رو بهمراه یک سشن بر میگردونه و در صفحه بعدی اون سشن رو برسی میکنه حالا من چطور میتونم اون سشن رو در php نگه دارم و به صفحه دیگه ای ارسال کنم؟ ایا راهی هست؟
یعنی سشن بجای اینکه در مرورگر نگه داشته بشه در صفحه php نگه داشته بشه، یا به صفحه بعدی انتقال داده بشه
با تشکر
سشن در سمت مرورگر به صورت کوکی ذخیره می شود، لذا باید از پارامترهای CURLOPT_COOKIEJAR و CURLOPT_COOKIEFILE استفاده کنید، مثال:
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_name');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_file.txt');
هادی
۲۰:۲۶ ۱۳۹۶/۰۴/۰۶
درود
من از طریق دیتابیس ،php و جی کوئری با توجه به انتخاب کاربر موجودی را نشان میدم و از کدهای زیر استفاده میکنم
کد صفحه index
حذف شد
و با این اسکریپت نیز به صفحه دیگر ارجاع میدم
حذف شد
در صفحه mojodi_test.php نیز با کد زیر فراخوانی و جواب را برگشت میدم
حذف شد
کد کامل کار میکنه ولی یه مشکل دارم ، وقتی add_new_row را میزنم تا یه زیر لیست دیگه اضافه بشه دیگه موجودی های آنها را نشان نمیده و فقط همون اولی را نشان میده
امکانش هست راهنمایی فرمایید ؟
رفع اینگونه موارد نیاز به بررسی و تست واقعی دارد و دسترسی به تمام سورس هایی که در عملکرد صفحه نقش دارند اجتناب ناپذیر است، متاسفانه با تکه کدهای درج شده امکان این نوع تست وجود ندارد!
هادی
۲۱:۲۱ ۱۳۹۶/۰۴/۰۵
ممنون که زود جواب دادین
از خروجی gettype گرفتم؛ جواب داد که از نوع string
و echo از
json_decode($result)
هم به نتیجه نرسید و چیزی نشون نداد.
در اصل دارم از وب سرویس rest یک سایت استفاده میکنم که طبق اموزش های شما موفق شدم خروجی بالا رو بگیرم.
ممنون میشم راهنمایی کنید.
کد شما در سوال قبلی جهت راهنمایی بیشتر ویرایش شد، اگر آرگیومنت دوم تابع json_decode برابر true باشد، نتیجه به صورت یک آرایه برگشت داده می شود که می توان از آن مطابق نیاز استفاده کرد.
هادی
۱۵:۴۹ ۱۳۹۶/۰۴/۰۴
سلام
من موقع خروجی گرفتن به همچین آرایه ای برخورد کردم:
<?php
$json_str = '{"status":1,"saens":[{"saens_name":"\u0633\u0627\u0646\u0633 \u0628\u0627\u0646\u0648\u0627\u0646 ( \u0645\u0627\u0647 \u0631\u0645\u0636\u0627\u0646 )","saens_row_id":103140,"price_market_adult":20000,"price_market_child":20000,"price_sale_adult":18000,"price_sale_child":18000,"discount_percent_adult":10,"discount_percent_child":10,"status_sell":true,"start_day":"\u06cc\u06a9\u0634\u0646\u0628\u0647","start_date":"1396\/04\/04","time":"20:30 \u0627\u0644\u06cc 02:00"}]}';
;
$json_array = json_decode($json_str, true);
var_dump($json_array);
echo $json_array['saens'][0]['saens_name'];
?>
چطور میشه فقط اون قسمتی که میخوام رو استخراج کنم.
از دستورات ارایه استفاده کردم موفق نشدم
هیچ جا هم راجع بهش توضیح ندادن
ظاهرا این فرمت مربوط به JSON است، لذا باید ابتدا آن را با تابع json_decode در PHP تبدیل به آرایه کنید، سپس از کلید و مقدار آرایه مطابق با نیازتان می توانید استفاده کنید:
http://php.net/manual/en/function.json-decode.php
حسام آقاجانی
۱۴:۴۲ ۱۳۹۶/۰۱/۱۶
سلام خسته نباشید من در سند PHP اطلاعات زیر را از یک فرم به صورت زیر دریافت کرده ام :
$username = $row['username'];
چگونه میتوانم این متغیر را به یک صفحه دیگر ارسال کنم تا نام کاربری فرد در آن مثلا با دستور :
echo $name
نمایش داده شود ؟
چند راه برای انجام این کار در PHP وجود دارد:
- روش اول اشتراک گذاری متغیر با استفاده از ایجاد یک نشست است، به طور مثال در صفحه اول نشست را شروع و متغیر را مقداردهی کنید:
<?php
session_start();
$_SESSION['name'] = $username;
?>
و در صفحات دیگر به روش زیر از متغیر خروجی بگیرید:
<?php
session_start();
echo 'Your Username: ' . $_SESSION['name'];
?>
برای استفاده از این روش باید با مبحث Session در PHP آشنا باشید.
- روش دیگر استفاده از پرس و جوی دیتابیس است، یعنی به فرض یک تابع داشته باشید که اطلاعات مربوط به نام کاربری را با توجه به اطلاعات نشست کاربر (که در هنگام ورود به پنل تنظیم می کنید) از دیتابیس دریافت کند، با این روش می توانید کلیه اطلاعات را از دیتابیس استخراج نمائید.
- روش دیگر انتقال اطلاعات و پارامترها از طریق متد GET و در آدرس URL است.
مهدی
۲۰:۳۸ ۱۳۹۵/۰۹/۱۳
با سلام و ضمن تشکر از مطالب خوبتون
یه سوال داشتم.
تو بخش اول چطوری میشه یک مقدار proxy را با file_get_contents و header ارسال کرد.
یه کدی شبیه زیر که کار کنه:
$url = 'http://t-wpersian.rozblog.com/';
$opts = array('http'=>array('header'=>"User-agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6\r\n" ."Referer: http://www.google.com\r\n" ."proxy: tcp://94.183.103.108:8080"));
$context = stream_context_create($opts);
$file = file_get_contents($url, true, $context);
در مثال زیر مشخص است:
<?php
//create a stream
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n",
'proxy' => 'tcp://221.176.14.72:80',
)
);

$context = stream_context_create($opts);
//open the file using the HTTP headers set above
$file = file_get_contents('http://ifconfig.me/ip', false, $context);
?>
۱۷:۴۷ ۱۳۹۵/۰۷/۱۴
سلام
خسته نباشید.
بنده کدی را نوشتم که مانند وردپرس که
doamin.ir/?p-8
رو وارد میکنید میرود به پست 8 (مثال) نوشته ام.
اما متاسفانه این کد عمل نمیکند ممنون میشم بگید مشکلش چیه.
باتشکر
کد:
<?php
$AD = 'http://sirra.blog.ir/post/';
$Url = $_GET['p'] ;
if ($Url != '' ) {$AdUr = $AD . $Url ;
header( 'Location:' . $AdUr ) ;}
?>
توضیح کد:
متغیر AD مساوی میشود با یک ادرس مشخص
و متغیر دیگری هم مساوی میشود با یک چیزی که کاربر وارد کرده است
سپس اگه چیزی که کاربر وارد کرد،خالی نبود،به آدرس مشخص میرود.
(توضیح بالا برداشت بنده از کاری که کدم باید انجام بدهد میباشد)
کد یک خطای Syntax داشت، کد بالا اصلاح شد!
۰۱:۴۹ ۱۳۹۵/۰۷/۱۱
سلام
من این کد رو قبلا پیدا کرده بودم ولی نتونستم چیزی ازش بفهمم ، لطفا یک کد آماده بدید که تست شده باشه.
اگر لازم باشه ، بابت این کد مبلغی رو هم پرداخت میکنم.
سپاس
برای تست باید اطلاعات API در اختیار باشد، در هر صورت SOAP با curl متفاوت است، ممکن است نتوانید برخی قابلیت های SOAP را با curl داشته باشید، مانند اجرای متدها، لذا استفاده این دو بجای هم توصیه نمی شود!
۲۰:۳۶ ۱۳۹۵/۰۷/۰۸
با سلام
چطور باید به جای کد زیر از curl استفاده کرد؟
$client = new SoapClient("http://www.hirdweb.com/soap/server.php?wsdl", array('trace' => 1));
$result=$client->__getFunctions();
print_r($result);
یعنی میخوام درخواست های soap را با تابع curl بفرستم و خروجی رو مثل بالا چاپ کنه.
لطفا به این صفحه مراجعه نمائید:
http://stackoverflow.com/questions/7120586/soap-request-in-php-with-curl
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
7 × 8
20 × 20
=