آموزش خواندن فایل در PHP

برای خواندن محتوای فایل متنی در PHP توابع آماده‌ای وجود دارد که می‌توانیم به سادگی از آن‌ها استفاده کنیم. در این آموزش روش‌های خواندن فایل در PHP را با هم بررسی کرده و با توابع کاربردی آن آشنا می‌شویم.

حفظ کردن این توابع ضروری نیست. در این آموزش ۳ روش و چند تابع جانبی معرفی می‌کنم که صرفاً با امکانات و توانایی‌های زبان PHP برای خواندن فایل آشنا شوید. هر زمان در پروژه‌ای نیاز به این توابع داشتید، اگر یادتان نبود، با یک جستجوی ساده می‌توانید آن‌ها را پیدا کنید.

در مورد فرآیند مرحله به مرحله خواندن و نوشتن روی فایل در آموزش کار با فایل در PHP بحث شده است. در این آموزش صرفاً بحث خواندن فایل را با توابع خاص‌تر یاد می‌گیریم.

خواندن فایل در PHP

در این بخش با ۳ تابع از پیش تعریف شده آشنا شده و به کمک آن‌ها محتوای درون فایل‌ها را می‌خوانیم. در بخش بعدی علاوه بر معرفی چند تابع کمکی دیگر، مثال‌های پیچیده‌تری از این روش‌ها را می‌خوانیم.

در تمام مثال‌ها، فرض می‌کنیم یک فایل به نام data.txt در کنار کد قرار داشته و حاوی محتوای زیر است:

Hi dear user!
I hope you are happy and learn good things.
Thanks, SabzDanesh.com

برای آدرس‌دهی به فایل‌ها از مسیردهی نسبی (relative) استفاده می‌کنیم. در نتیجه اگر همین فایل در فولدر files قرار داشت، آدرس ما files/data.txt می‌شود.

تابع file_get_contents

این تابع همه محتوای فایل را به شکل یک رشته متنی در PHP (یا string) به ما می‌دهد. تابع file_get_contents() یک پارامتر ورودی اجباری دارد که آدرس فایل است.

<?php
$data = file_get_contents("data.txt");
echo $data;

در قطعه کد بالا، همه محتویات فایل data.txt درون متغیر $data قرار گرفته و در خط دوم آن را چاپ می‌کنیم. اگر این کار را انجام دهید، خروجی چیزی شبیه زیر خواهد شد:

Hi dear user! I hope you are happy and learn good things. Thanks, SabzDanesh.com

همانطور که می‌بینید، خط‌ها در خروجی به درستی نمایش داده نشده‌اند. اگر سورس صفحه را چک کنید، خواهید دید که خط به خط فایل به درستی نمایش داده می‌شود. برای اینکه این ساختار را در خروجی هم حفظ کنیم، از تگ pre در html استفاده می‌کنیم. بنابراین قطعه کد زیر، خروجی مشابه محتوای درون فایل را به ما خواهد داد:

<pre>
<?php
$data = file_get_contents("data.txt");
echo $data;
?>
</pre>

تابع خواندن فایل در PHP چهار ورودی دلخواه دیگر نیز می‌گیرد که دو مورد مهم آن‌ها عبارت‌اند از:

  • $offset : کاراکتر شروع خواندن را مشخص می‌کند. (ورودی چهارم، پیش‌فرض: 0)
  • $length : تعداد کاراکترهایی که باید از فایل خوانده شود. (ورودی پنجم، پیش‌فرض: اندازه فایل)

قطعه کد زیر، محتوای فایل از اندیس (ایندکس) 11 به تعداد 24 کاراکتر را خوانده و خروجی می‌دهد:

<?php
$data = file_get_contents("data.txt", null, null, 10, 24);

به کمک این تابع می‌توان کدهای HTML یک صفحه وب را نیز خوانده و از آن استفاده کرد. یعنی می‌توانید به جای آدرس یک فایل، آدرس یک صفحه از سایت (URL) را به عنوان ورودی به تابع بدهید.

خواندن فایل به صورت یکجا با readfile

تابع readfile() تقریباً مشابه قبلی عمل می‌کند یعنی همه محتویات درون یک فایل که به عنوان اولین آرگومان ورودی به آن داده می‌شود را به ما برمی‌گرداند. اما خروجی این تابع یک رشته نیست، بلکه یک عدد (int) است.

با فراخوانی این تابع، محتویات درون فایل در خروجی چاپ می‌شود و نیازی به دستور echo نیست. همچنین به عنوان خروجی تابع، تعداد کاراکترهای موجود در فایل که در خروجی چاپ شده‌اند داده می‌شود.

<?php
readfile("data.txt");

تفاوت readfile() و file_get_contents() در نوع خروجی آن‌هاست. هر دو عملیات خواندن فایل در PHP را انجام می‌دهند. اولی مستقیماً محتوای خوانده شده را در صفحه برنامه چاپ می‌کند اما دومی آن را به صورت یک رشته برمی‌گرداند.

خواندن فایل در PHP با fopen

برای کار با فایل‌های بزرگ و حجیم‌تر و یا بسته به نیاز برنامه، شاید بهتر باشد جزئیات باز و بسته کردن و دسترسی به محتوای فایل را خودمان مشخص کنیم.

برای این منظور از تابع fopen() برای خواندن فایل در PHP استفاده می‌کنیم. این تابع دو ورودی اجباری دارد:

  1. ورودی اول مسیر فایل برای باز کردن را مشخص می‌کند.
  2. ورودی دوم، حالت باز کردن (mode) فایل را برای برنامه مشخص می‌کند. در قطعه کد زیر، r به معنای باز کردن فایل فقط برای خواندن (Read Only) است.

خروجی این تابع از نوع File Handler یا Stream است. این مقدار برای اشاره به فایل باز شده استفاده می‌شود. بنابراین آن را در یک متغیر (در اینجا $file) نگهداری می‌کنیم تا جلوتر از آن استفاده کنیم.

<?php
$file = fopen("data.txt", "r");

پس از اینکه کارمان با فایل تمام شد، بهتر است با فراخوانی تابع fclose() آن را می‌بندیم تا از بروز خطاهای احتمالی و اشغال بیهوده رم جلوگیری شود.

حال به کمک توابع مختلف می‌توانیم محتوای درون فایل را به صورت بخش به بخش بخوانیم. یکی از این توابع، تابع fread() است که دو ورودی می‌گیرد. ورودی اول همان متغیر فایل و ورودی دوم تعداد کاراکترهایی که می‌خواهیم خوانده شود.

متغیر $file علاوه بر اینکه به فایل باز شده اشاره می‌کند، یک اشاره‌گر (pointer) به کاراکتر آخری که خوانده شده نگهداری می‌کند. در ابتدا که فایل باز می‌شود، اشاره‌گر روی کاراکتر اول است. وقتی مثلاً 10 کاراکتر از فایل را می‌خوانیم، اشاره‌گر روی 11 قرار می‌گیرد.

در قطعه کد زیر، پس از اینکه فایل برای عملیات خواندن در PHP باز شده است، 20 کاراکتر اول آن را در خروجی چاپ کرده‌ام. مجدداً بعد از چاپ کردن تگ <br> تعداد 25 کاراکتر بعدی فایل را در خروجی نمایش داده‌ام.

<?php
$file = fopen("data.txt", "r");
echo fread($file, 20);
echo '<br>';
echo fread($file, 25);
fclose($file);

در آموزش زیر با یک مثال پروژه‌ای، با تابع fopen() کار کرده و modeهای کاربردی آن را در یک جدول با هم مقایسه کرده‌ایم:

آموزش کار با فایل در PHP در ۴ مرحله

آموزش کار با فایل در PHP در ۴ مرحله

توابع کاربردی خواندن فایل

برای اینکه با متغیر $file کارهای بیشتری انجام دهیم، توابع کاربردی بیشتری وجود دارد. در ادامه ۳ تابع دیگر برای خواندن فایل در PHP را با هم یاد می‌گیریم.

بررسی رسیدن به انتهای فایل

وقتی فایلی را بخش به بخش می‌خوانیم، ممکن است لازم باشد بررسی کنیم آیا به انتهای فایل رسیده‌ایم یا نه. برای این کار، کافی است متغیر فایل را به تابع feof() بدهیم. اگر نتیجه true بود یعنی خواندن فایل به انتها رسیده است.

<?php
if( feof($file) ){
    echo "Read File Operation ended!";
}

خواندن خط به خط فایل در PHP

یکی از کاربردی‌تری توابع خواندن فایل در PHP تابع fgets() است. این تابع متغیر فایل را به عنوان ورودی گرفته و در هر بار اجرا، یک خط از آن را خروجی می‌دهد. (نوع خروجی رشته است.)

در قطعه کد زیر، فایل data.txt را باز کرده و با استفاده از یک حلقه while در PHP تا زمانی که به انتهای آن برسیم، محتویاتش را خط به خط چاپ کرده‌ایم.

<?php
$file = fopen("data.txt", "r");

while( !feof($file) ){
    echo fgets($file) . "<br>";
}
fclose($file);
?>

خواندن کاراکتر به کاراکتر از فایل

ممکن است بخواهیم فایل را به صورت کاراکتر به کاراکتر بخوانیم. با اینکه از این تابع کمتر استفاده می‌شود، ولی برای مواقعی که لازم است وجود علامت یا کاراکتری خاص در فایل را بررسی کنیم، می‌تواند برای ما بسیار کاربردی باشد.

مشابه تابع قبلی، تابع fgetc() متغیر فایل را به عنوان ورودی گرفته و در هر بار اجرا، یک کاراکتر از فایل را به ما می‌دهد. قطعه کد زیر، علاوه بر چاپ فایل در خروجی، تعداد کاراکترهای sکوچک در متن را نیز شمارش می‌کند.

<?php
$file = fopen("data.txt", "r");

$counter = 0;

while( !feof($file) ){
    $c = fgetc($file);
	if($c=='s'){$counter++;}
    echo $c;
}
fclose($file);

در این آموزش با ۳ تابع برای خواندن فایل در PHP آشنا شدیم. تابع file_get_contents() همه یا بخشی از فایل را به صورت یک رشته خروجی می‌دهد.تابع readfile() همه محتویات را در خروجی برنامه چاپ کرده و تعداد کاراکترهای موجود در آن را به عنوان خروجی خود در نظر می‌گیرد.

تابع دیگری به نام file() وجود دارد که خط به خط فایل را درون ایندکس‌های یک آرایه ریخته و یک آرایه PHP خروجی می‌دهد. یک مثال از این تابع را می‌توانید در مستندات آن بررسی کنید.

به کمک تابع fopen() می‌توانیم یک فایل را برای انجام کارهای مختلف باز کنیم. با تابع fread() تعداد مشخصی از کاراکترهای فایل خوانده می‌شود. از fgets() و fgetc() برای خواندن خط به خط فایل در PHP یا کاراکتر به کاراکتر استفاده می‌شود.