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

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

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

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

فرآیند کار با فایل

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

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

فرض کنید در کنار قطعه کد زیر، یک فایل به نام data.txt داریم. با دستور echo متن‌های درون فایل را نمایش می‌دهیم.

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

اما ما نیاز به کارهای بیشتری داریم. قبل از وارد شدن به مراحل کار با فایل در PHP، بهتر است پرکاربردترین مدهای باز شدن فایل (mode) را با هم بررسی کنیم.

مدهای باز کردن

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

modeنحوه باز کردن
rفقط برای خواندن از ابتدا
wفقط برای نوشتن از ابتدا، حذف محتوای قبلی
aفقط برای نوشتن از انتها، حفظ محتوای قبلی
r+برای خواندن و نوشتن از ابتدا
w+خواندن و نوشتن از ابتدا، حذف قبلی‌ها
a+خواندن و نوشتن از انتها، حفظ قبلی‌ها

در هر دو حالت مدهای w و a اگر فایلی با نام مورد نظر وجود نداشت، آن فایل ساخته شده و برای نوشتن باز می‌شود. یک مد x فقط برای نوشتن استفاده می‌شود و اگر فایل وجود نداشت، false برمی‌گرداند.

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

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

مراحل کار با فایل در PHP

فرض کنید یک فایل متنی به نام settings.conf در فولدر app کنار قطعه کدهای زیر داریم. در نتیجه مسیر فایل به شکل app/settings.conf مشخص می‌شود.

در این مثال‌ها من از سطح دسترسی a+ استفاده می‌کنم. به این معنی که فایل را برای خواندن و نوشتن باز می‌کند، اگر فایل وجود نداشت آن را ایجاد کرده و اگر محتوایی از قبل در آن بود، نوشتن را از انتهای فایل شروع می‌کند.

باز کردن فایل

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

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

<?php
$file = fopen("app/settings.conf", "a+");

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

<?php
$file = fopen("app/settings.conf", "a+");
if(!$file){
   echo "Open File Failed!";
}

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

<?php
$file = fopen("app/settings.conf", "a+") or die("Open File Failed!");

به متغیر $file در این مثال، اشاره‌گر به فایل یا File Pointer هم گفته می‌شود.

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

از تابع fread() برای خواندن محتویات فایل استفاده می‌شود. پارامتر ورودی اول، شئ فایل (همان متغیر $file) است. دومین پارامتر تعداد بایت‌ها برای خوانده شدن از فایل را مشخص می‌کند. مثلاً اگر بخواهیم فقط 25 بایت اول از فایل را بخوانیم عدد 25 را به عنوان آرگومان دوم تعریف می‌کنیم.

خروجی تابع خواندن فایل از نوع string در PHP است. در نتیجه برای چاپ محتویات در خروجی، باید آن را چاپ کنیم. در قطعه کد زیر من از echo استفاده کرده‌ام:

<?php
$file = fopen("app/settings.conf", "a+") or die("Open File Failed!");
echo fread($file, 25);

از تابع filesize() برای محاسبه اندازه فایل در PHP استفاده می‌شود. این تابع، مسیر فایل (path) به صورت رشته متنی گرفته و حجم فایل بر اساس بایت (bytes) را خروجی می‌دهد. پس اگر بخواهیم همه فایل را با تابع fread() بخوانیم، به صورت زیر عمل می‌کنیم:

<?php
$file = fopen("app/settings.conf", "a+") or die("Open File Failed!");
echo fread($file, filesize("app/settings.conf"));

توابع دیگری هم برای خواندن وجود دارد، که به طور خلاصه عبارت‌اند از:

  • fgets() برای خواندن یک خط از فایل استفاده می‌شود. در هر بار اجرای این تابع روی $file خط بعدی به عنوان خروجی به ما داده می‌شود. وقتی به انتهای فایل برسیم، به ما false می‌دهد.
  • fgetc() در هر بار فراخوانی این تابع، یک کاراکتر از فایل به ما داده می‌شود. وقتی به انتهای فایل برسیم، در هر بار صدا زدن به ما false برگردانده می‌شود.

در آموزش زیر توابع کاربردی مخصوص خواندن یک فایل همراه با مثال به طور جامع بررسی شده است:

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

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

نوشتن در فایل با fwrite

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

قطعه کد زیر، دو رشته متنی جدید به انتهای فایل اضافه می‌کند:

<?php
$file = fopen("app/settings.conf", "a+") or die("Open File Failed!");
fwrite($file, "hello Omid, ");
fwrite($file, "welcome to SabzDanesh!");

در بالا، فایل را در حالت a+ باز کرده بودم؛ اگر فایل در حالت w باز شود، محتوای جدید جایگزین محتوای قبلی می‌شود. در بعضی منابع آموزشی از این روش با عنوان رونویسی فایل یا بازنویسی (overwriting) نام برده شده است. که در حقیقت نوشتن از ابتدای فایل است.

<?php
$file = fopen("app/settings.conf", "w") or die("Open File Failed!");
fwrite($file, "hello Omid, ");
fwrite($file, "welcome to SabzDanesh!");

تابع دیگری به نام fputs() وجود دارد که دقیقاً مشابه fwrite() عمل می‌کند.

در آموزش زیر توابع کاربردی مخصوص نوشتن در فایل به طور کامل و با مثال‌های بیشتر بررسی شده است:

نوشتن فایل در PHP

نوشتن فایل در PHP

بستن فایل در PHP

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

برای بستن یک فایل باز شده، از تابع fclose() استفاده می‌کنیم. فقط کافی است متغیر $file را به عنوان ورودی به تابع بدهیم.

<?php
$file = fopen("app/settings.conf", "w");
// doing something
fclose($file);

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

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

پروژه ساده کار با فایل PHP

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

فرض کنید فایل old.txt را داریم. قرار است یک فایل به نام new.txt ایجاد کرده و محتوای قبلی را خط به خط درون فایل جدید بریزیم. در انتهای فایل جدید، اطلاعات سایت خود را اضافه کرده و در نهایت فایل قدیمی را حذف کنیم.

در این کد، علاوه بر استفاده از حلقه در PHP، با دو تابع جدید هم آشنا می‌شویم:

  1. تابع feof() برای چک کردن انتهای فایل (اصطلاحاً EOF) وقتی نشان‌گر خواندن به انتهای فایل می‌رسد، این تابع به ما true می‌دهد.
  2. تابع unlink() برای حذف فایل استفاده می‌شود. فقط کافی است مسیر (path) فایل را به عنوان ورودی به تابع بدهیم تا عملیات حذف فایل در PHP انجام شود.
<?php
$old_file = fopen("old.txt", "r");
$new_file = fopen("new.txt", "a+");

while( !feof($old_file) ){
    fwrite( $new_file, fgets($old_file) );
}
fclose($old_file);

fwrite($new_file, "This is end of new file from SabzDanesh.com");
fclose($new_file);

unlink("old.txt");
echo "Operation Successful!";
?>
آپلود فایل در PHP

آپلود فایل در PHP

جمع‌بندی آموزش کار با فایل در PHP

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

از fread() برای خواندن فایل و از fwrite() برای نوشتن در فایل استفاده می‌کنیم. وقتی کارمان تمام شد، با صدا زدن تابع fclose() فایلی که باز کرده بودیم را می‌بندیم. در این بین با توابع کمکی دیگر نظیر unlink برای حذف فایل آشنا شدیم.

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