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

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 مطالب بیشتر:
ساخت فید خوان آر اس اس (RSS Feed Reader) با PHP
نمایش قسمتی از متن و پاراگراف با PHP
ارسال ایمیل با PHP و کلاس PHPMailer
نمایش آمار بازدیدها با PHP بدون استفاده از دیتابیس
آموزش ساخت نقشه XML سایت (Sitemap) با PHP و MySQL
دیدگاه
more ۱۴۶ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
۱۶:۱۴ ۱۳۹۹/۰۲/۰۱
ببخشید یه سوال اگه بخایم واسه صفحاتی که دکمه نهایی کردن را دارند چیکار کنیم؟ یعنی این curl که شما در موردش حرف زدید چیزی در رابطه با دکمه ها نگفتید
منظورتان از "دکمه نهایی کردن" دقیقا مشخص نیست؟ اطلاعات را باید به فایل یا آدرس URL مقصد که وظیفه دریافت مقادیر را بر عهده دارد ارسال کنیم، به فرض اگر فرم HTML را در نظر بگیریم، اطلاعات باید به آدرسی که در قسمت action فرم درج می شود ارسال شوند، در صورت تمایل لطفا یک نمونه صفحه با توضیحات بیشتر ارسال کنید تا بررسی کنیم.
۱۴:۳۸ ۱۳۹۹/۰۲/۰۱
سلام ببخشید اون مقادیری که میخاد ارسال بشه مثلا زده var_1 از کجا میدونی که باید تو کدوم از input های سایتی که میخایم ارسال پارامتر بدیم بهش بره ؟؟؟
var_1 در واقع جانشین پارامتر name در یک فیلد HTML به فرض از نوع input است، به این صورت همان طور که یک فرم عادی را با متد POST ارسال و دریافت می کنیم، پارامترها را می توانیم با توابع ارسال کنیم.
مهدی توحیدی
۱۹:۴۵ ۱۳۹۹/۰۱/۲۶
سلام من میخوام وقتی یک صفحه رو در php با گت یا curl باز کردم اون صفحه مثلا تا سی ثانیه باز بمونه و بسته نشه حتی اگه پردازش تموم شده باشه! نمیدونم منظورمو فهمیدید یا نه حالت دیفالت جوریه که تا صفحه کامل بالا اومد بسته میشه. ولی من میخوام بعد اینکه لود صفحه کامل شد توی اون لینک به مدت 30 ثانیه بمونه. خواهش میکنم کمکم کنید خیلی نیاز دارم بهش باید چیکار کنم؟؟
اگر دقیق متوجه سوالتان شده باشیم احتمالا با تابع sleep در PHP میتوانید چنین وقفه ای ایجاد کنید:
https://www.php.net/manual/en/function.sleep.php
اگر منظورتان حالت دیگری است لطفا دقیقتر توضیح دهید (وقفه سمت سرور باشد یا سمت کاربر؟، سورس صفحه مقصد در اختیار شما است یا خیر؟) تا امکان راهنمایی بیشتر میسر باشد.
مهراد
۱۷:۵۰ ۱۳۹۸/۱۲/۲۰
سلام خسته نباشید!
میخواستم بپرسم آیا از cURL میشه به عنوان وب پراکسی استفاده کرد بطوری که یک url رو از کلاینت بگیره و اون رو به عنوان درخواست http از حودش به سایت دلخواهمون بفرسته یعنی مثل یک ف ش عمل کنه و ip ای که تو سرور مقصد یعنی سایت مورد نظرمون ثبت میشه به عنوان بازدید کننده ip این فایل php مون باشه که توش از cURL استفاده شده ؟
ایجاد پراکسی سرور در PHP با توابع ساده cURL عملا شدنی نیست، این امکان باید شامل پیش بینی شرایط پیچیده تری از تبادل انواع داده و پروتکل ها باشد، نمونه اسکریپت هایی در این خصوص نوشته شده که نیازمند دسترسی های کامل به سرور و امکان نصب نرم افزارهایی مانند Composer است، مثال:
https://github.com/jenssegers/php-proxy

https://www.hostinger.com/tutorials/how-to-install-composer
amin
۱۴:۵۹ ۱۳۹۸/۱۲/۰۵
با سلام آدرس مطالب سایت وبگو بعد از ای دی پست عنوان فارسی هست ولی زمانی که به سورس کد پست نگاه میکنیم قسمت فارسی لینک مطالب به این شکل %D9%85 است اگر امکان داره در این مورد توضیح و راهنمای بدین. با تشکر
آدرس های URL (مخفف Uniform Resource Locator) باید شامل کاراکترهای محدودی در استاندارد US-ASCII باشند، به همین دلیل امکان استفاده مستقیم از حروف فارسی و هر زبان دیگر دارای کاراکترهای غیر از US-ASCII به شکل استاندارد میسر نیست، برای رفع این مشکل از ساز و کار URL Encoding برای زبان های UTF-8 استفاده می شود، در این ساز و کار اعداد و حروف در کنار کاراکتر % در آدرس URL نماینده یک کاراکتر خاص غیر ASCII هستند که در نهایت توسط مرورگرها و مفسرها درک و معمولا به صورت خودکار به شکل اصلی ترجمه می شوند.
توابع مورد استفاده در PHP برای تبدیل حروف فارسی به آدرس URL و در صورت نیاز حالت عکس:
rawurlencode
rawurldecode

https://www.php.net/manual/en/function.rawurlencode.php
در جاوا اسکریپت:
encodeURIComponent
decodeURIComponent

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
حسن
۱۱:۳۱ ۱۳۹۸/۰۹/۱۶
سلام خسته نباشید میخواستم بدونم تابع
file_get_contents
سمت سرور اجرا میشه؟ یعنی یوزر نمیفهمه که تابع اجرا شده؟ و اینکه ادرس url که فراخوانی میشه رو نمیتونه ببینه؟ حتی اگه هکر باشه؟
چون من میخوام با این تابع وصل بشم به سایتی که یوزر نیم و پس داره و باید در url اونارو وارد کنم اون وقت کاربرای سایتم نباید url رو ببینند ... ممنون
فرآیندها در سرور اجرا می شود و کاربر صرفا نتیجه کار را مشاهده می کند، در واقع این تابع یک درخواست از سرور سایتتان به آدرس URL مقصد ارسال و نتیجه را در صفحه مرورگر نمایش می دهد، درست شبیه عملکرد مرورگرهای وب، منتها در مورد نام کاربری و کلمه عبور باید توجه داشته باشید سرور مبداء و مقصد هر دو از گواهی SSL معتبر استفاده کنند، همچنین برای بررسی بیشتر می توانید فرآیندهای ارسال و دریافت را با ابزارهای مرورگر (دکمه F12) مشاهده کنید.
Mohammad SaJaD Bagheriyeh haq
۱۵:۳۰ ۱۳۹۷/۰۹/۲۵
سلام خسته نباشید
من دارم به api سایت inax.ir کار میکنم وقتی اطلاعات ارسال میشه درسته و دریافتش هم درسته فقط جایی ذخیره نمیشه فقط چاپ میشه برای مثلا نوشتید که اگر متغیر result رو echo کنیم خروجی چاپ میشه ولی فقط برای من 0 یا 1 یا true یا false توشه
این در حالتی است که با متن ساده سر و کار داریم، با توجه به راهنمای API مد نظر، خروجی برای متدهایی به صورت JSON دریافت می شود که برای تجزیه آن باید از توابع مرتبط مانند json_decode استفاده کنید، اطلاعات بیشتر:
http://docs.php.net/manual/en/function.json-decode.php
رضا
۰۰:۱۴ ۱۳۹۷/۰۹/۱۱
سلام
من میخوام اطلاعاتی رو بصورت post اما خام به یه سرور دیگه ارسال کنم چطور میشه این کارو کرد
منظورتان از "خام" مشخص نیست؟!
ali
۱۵:۰۲ ۱۳۹۷/۰۵/۲۲
سلام می خواستم یک سری اطلاعات رو از یک سرور با یک یو ار ال بگیرم ولی سرعت پردازش اطلاعات بسیار کمه نمی دونم باید چی کار کنم
به طور معمول سرعت پردازش به چند عامل بستگی دارد، ممکن است مدت زمان پاسخگویی سرور مقصد به خودی خود طولانی باشد که در این مورد اگر به آن دسترسی نداشته باشیم، نمی توان کار خاصی صورت داد، اما اگر ایراد از بخش کدنویسی برنامه باشد، باید دید کدام قسمت باعث طولانی شدن فرآیند پردازش می شود و کدها را بهینه سازی کرد، همچنین از جمله دلایل دیگر می تواند استفاده از سرورهای پراکسی جهت اتصال باشد.
۲۳:۵۵ ۱۳۹۷/۰۵/۱۷
با درود ادرس صفحات سایت من بدین صورت فراخوانی میشه که باعث پیام خطاست
http://www.domin.ir/index.php_route=cms/demo
ولی وقتی درانتهای آدرس php. را با دست وارد میکنم صفحه درست نشون داده میشه میخواستم از طریق htaccess. به انتهای تمام صفحات php. اضافه کنم که بدین صورت بشه...
http://www.domin.ir/index.php_route=cms/demo.php
لطفا کدی که باعث افزودن به انتهای آدرس صفحات میشه را بفرمائید
برای نوشتن دستورات ریدایرکت در htaccess باید تمام الگوهای متصور سایت مشخص باشند، در اینجا صرفا یک الگو را مطرح کرده اید و با توجه به این الگو می توان نمونه کد زیر را نوشت (تست نشده!):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^index.php_route=cms/([^/]+) /index.php_route=cms/$1\.php [NC,L]
saeid
۰۹:۴۸ ۱۳۹۷/۰۳/۱۶
با سلام
من از این تابع استفاده میکنم برای url های درون یک آدرس بصورت زیر
<?php
$urlContent = file_get_contents('http://www.sanjesh.org');

$dom = new DOMDocument();
@$dom->loadHTML($urlContent);
$xpath = new DOMXPath(gzdecode($dom));
$hrefs = $xpath->evaluate("/html/body//a");

for($i = '0' ; $i < $hrefs->length; $i++){
$href = $hrefs->item($i);
$url = $href->getAttribute('href');
$url = filter_var($url, FILTER_SANITIZE_URL);
// validate url
if(!filter_var($url, FILTER_VALIDATE_URL) === false){
echo '<a href="'.$url.'">'.$url.'</a><br />';
}
}
?>
اما برای سایت تابناک این دستور کار نمیکنه و هیچ url ای نشون داده نمیشه
مشکل کجاست؟
محتوای سایت به صورت gzip فشرده شده است و ابتدا باید آن را به حالت عادی برگردانیم، این کار در کد بالا با تابع gzdecode انجام شده است (این تابع فقط باید برای این گونه سایت ها استفاده شود نه در حالت عادی!).
kiarash
۱۳:۵۹ ۱۳۹۷/۰۳/۱۰
سلام
می خواستم بدونم چطور میتونیم اطلاعات رو با استفاده از یک پروکسی ارسال کنیم البته با file_get_contents
با تشکر
لطفا به این آدرس مراجعه کنید، هم برای متد GET و هم متد POST نمونه کد وجود دارد:
https://stackoverflow.com/questions/14535197/using-proxy-with-file-get-contents
۰۶:۵۸ ۱۳۹۷/۰۲/۱۶
سلام
برای گرفتن حجم زیاد اطلاعات json بهتره از کدوم استفاده بشه ؟
File_get_contents یا curl ؟ از file_get_content استفاده کردم این ارور رو بهم داده
Fatal error: Out of memory (allocated 303038464) (tried to allocate 81 bytes
به نظر این خطا مربوط به حداکثر اطلاعاتی است که یک متغیر در مفسر PHP می تواند نگهداری کند و لذا تفاوتی بین روش ها نباید وجود داشته باشد، در شرایطی که حجم زیادی از اطلاعات رد و بدل می شود باید از شیوه تکه تکه (chunk) کردن آنها استفاده کنید، در این آدرس توضیحات به همراه نمونه کد وجود دارد:
https://stackoverflow.com/questions/5249279/file-get-contents-php-fatal-error-allowed-memory-exhausted
سایه
۱۶:۱۰ ۱۳۹۷/۰۱/۲۹
سلام. مشکل من توی ارسال بعضی پارامترهاست وقتی open new tab میزنم بعضی از پارامترهامو نشون نمیده ولی وقتی کلیک میکنم و صفحه جدیدی باز میشه همه پارامترها ارسال شده،
علتش چیه؟
ارائه راه حل برای مشکل مطرح شده نیاز به تست صفحه دارد، لطفا یک نمونه آدرس یا کد قرار دهید تا بررسی گردد.
نازنین
۱۵:۳۸ ۱۳۹۶/۱۱/۱۲
با سلام و تشکر از مطالب عالی
امکانش هست در مورد اون سمت هم مطلب بذارید؟
مثلا اگه ما بخوایم یک فایل رو بفرستیم به آدرس سرور خودمون و اونجا اون فایل رو ذخیره کنم چه دستوراتی باید توی سرور ما نوشته بشه؟
آموزش آپلود فایل با PHP قبلا در سایت منتشر شده است، لطفا عبارت "آپلود فایل با PHP + وبگو" را در گوگل جستجو کنید.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
2 × 6
20 × 20
=