خواندن از فایل
همانطور که از نام این تابع پیداست، این تابع برای خواندن محتویات داخل یک فایل ساخته شده است. به کمک این تابع شما به راحتی میتوانید اطلاعات داخل فایل را خوانده و در یک متغیر قرار دهید. به کد زیر توجه نمایید:
$data = file_get_contents('image.png');
کد بالا اطلاعات موجود در فایل تصویری با نام image.png که در کنار فایل کد PHP قرار دارد را خوانده و محتویات آن را بصورت متنی داخل متغیر $data قرار میدهد. اما این تمام توانایی این تابع نیست!
[divider]
خواندن از آدرس اینترنتی
شما به کمک این تابع میتوانید یک آدرس اینترنتی را خوانده و آن را بصورت متن در داخل متغیری قرار دهید. یعنی در مثال بالا به جای آدرس فایل میتوان نشانی یک وبسایت را قرار داد و کدهای HTML آن نشانی را بصورت متنی خواند. در واقع کد بالا به این صورت تغییر خواهد کرد:
$data = file_get_contents('http://google.com');
شاید این قابلیت به این منظور ایجاد شده تا شما بتوانید فایلهای موجود در سرورهای دیگر را بخوانید و نیاز نباشد که فایلهای مورد نیازتان همیشه در همان سروری باشد که کدهای PHP در آن قرار دارند. اما قدرت این تابع به همین کارها محدود نمیشود. شما به کمک این تابع میتوانید درخواستهای GET و POST و… نیز ارسال کنید و جواب این درخواستها را بصورت فایل متنی دریافت کنید!
[divider]
ارسال درخواست GET و POST
به مثال زیر توجه کنید:
$data = file_get_contents('http://example.com?q=item&lang=fa');
همانطور که در مثال بالا میبینید متغیرهای q و lang به ترتیب با مقادیر item و fa به نشانی مورد نظر ارسال میشوند. این مدل ارسال درخواست که GET نام دارد به همین سادگی توسط تابع file_get_contents قابل استفاده است.
نوع دیگر درخواست که کمی پیچیدهتر است، نوع POST میباشد. این متد خود دارای حالتهای مختلف ارسال اطلاعات است که مهمترین آنها form-data و x-www-form-urlencoded و json هستند.
برای این آموزش میخواهیم حالت x-www-form-urlencoded را بررسی کنیم. به کد زیر توجه کنید:
$postdata = http_build_query( array( 'q' => 'item', 'lang' => 'fa' ) ); $opts = array('http' =>; array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $postdata ) ); $context = stream_context_create($opts); $result = file_get_contents("http://example.com", false, $context, -1, 40000);
در نمونه کد بالا ابتدا اطلاعاتی که میخواهیم ارسال کنیم را داخل یک آرایه قرار میدهیم و سپس به کمک تابع http_build_query آن را تبدیل به QueryString میکنیم. رشته متنی حاصل را در آرایه opts و به عنوان content یا همان محتوایی که قرار است ارسال شود، میگذاریم. همچنین متد POST و Header مناسب را تنظیم میکنیم.
در انتها باید اطلاعات و تنظیماتی که انجام داده ایم را به Stream Context تبدیل کنیم. شاید برایتان سوال پیش آید که Stream Context به چه دردی میخورد؟
جواب این است که تابع file_get_contents علاوه بر آدرس فایل پارامترهای دیگری نیز دریافت میکند که اختیاری هستند و در مواقع خاص استفاده میشوند. یکی از این پارامترها Context است. به همین دلیل است که در مثال بالا و در آخرین خط، پارامترهایی که به تابع file_get_contents دادهایم متفاوت با مثالهای قبل است. با این حال مانند مثالهای قبل، پس از اجرای کد بالا متنپاسخ درخواست در متغیر $result قرار میگیرد.
اگر میخواهید پارامترهای ورودی تابع file_get_contents را بطور کامل بشناسید، میتوانید به لینک زیر مراجعه کنید:
مستندات file_get_contentsURL فارسی در PHP
زمانی که میخواهید به آدرسی اطلاعات ارسال کنید که کاراکترهای فارسی در آن وجود دارد، اگر از کدهای بالا استفاده کنید با خطای ۴۰۰ که به معنای Bad Request است مواجه میشوید. این یعنی درخواست شما ساختار مناسبی ندارد.
برای حل این مشکل باید آن بخش از آدرس را که حاوی کاراکترهای فارسی است، به کمک تابع urlencode به فرمتی تبدیل کنید که برای سرور قابل فهم باشد. نمونه اصلاح شده درخواست GET:
$data = file_get_contents('http://example.com?q='.urlencode('متن فارسی'));
موفق و پیروز باشید!