آموزش برنامه نویسی PHP-جلسه دوازدهم

آموزش برنامه نویسی PHP-جلسه دوازدهم

مدیریت فایل بخش مهمی از برنامه وب است. شما اغلب نیاز به بازکردن و پردازش یک فایل برای کارهای مختلف دارید.

Table of contents [Show] [Hide]

آموزش کار با فایل در PHP؛ از خواندن و نوشتن تا مدیریت فایل‌ها

کار با فایل‌ها یکی از قابلیت‌های مهم PHP است که در بسیاری از پروژه‌های وب به آن نیاز پیدا می‌کنیم. ذخیره اطلاعات در فایل‌های متنی، ثبت لاگ‌ها، خواندن فایل‌های تنظیمات، ایجاد گزارش، مدیریت فایل‌های آپلودشده و پردازش فایل‌های CSV تنها بخشی از کاربردهای File Handling در PHP هستند.

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

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

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

کار با فایل در PHP چیست؟

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

برای مثال، فرض کنید فایل زیر را در پروژه خود داریم:

webdictionary.txt

محتوای فایل نیز می‌تواند به شکل زیر باشد:

PHP is a popular server-side scripting language.
PHP is widely used for web development.

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

خواندن فایل با readfile()

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

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

مثال استفاده از readfile()

<?php

echo readfile("webdictionary.txt");

?>

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

چه زمانی از readfile() استفاده کنیم؟

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

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

باز کردن فایل با fopen()

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

این تابع فایل را با یک حالت مشخص باز می‌کند و یک File Handle در اختیار ما قرار می‌دهد. این شناسه بعداً برای خواندن یا نوشتن روی فایل استفاده می‌شود.

ساختار کلی تابع به شکل زیر است:

fopen(filename, mode);

پارامتر اول یعنی filename نام یا مسیر فایل را مشخص می‌کند.

پارامتر دوم یعنی mode مشخص می‌کند فایل با چه سطح دسترسی و رفتاری باز شود.

مثال استفاده از fopen()

<?php

$myfile = fopen("webdictionary.txt", "r");

if ($myfile === false) {
    die("Unable to open file!");
}

?>

در این مثال فایل webdictionary.txt در حالت خواندن (r) باز شده است.

حالت‌های مختلف fopen() در PHP

انتخاب حالت مناسب هنگام باز کردن فایل اهمیت زیادی دارد؛ زیرا بعضی از modeها می‌توانند محتوای قبلی فایل را حذف کنند.

Modeتوضیح
rفقط خواندن؛ اشاره‌گر از ابتدای فایل شروع می‌شود
wفقط نوشتن؛ محتوای قبلی فایل حذف می‌شود و در صورت نبود فایل، فایل جدید ایجاد می‌شود
aفقط نوشتن؛ اطلاعات قبلی حفظ شده و داده جدید به انتهای فایل اضافه می‌شود
xایجاد فایل جدید برای نوشتن؛ اگر فایل وجود داشته باشد، عملیات شکست می‌خورد
r+خواندن و نوشتن؛ اشاره‌گر از ابتدای فایل شروع می‌شود
w+خواندن و نوشتن؛ محتوای قبلی فایل حذف می‌شود
a+خواندن و نوشتن؛ اطلاعات قبلی حفظ می‌شود و نوشتن از انتهای فایل انجام می‌شود
x+ایجاد فایل جدید برای خواندن و نوشتن؛ اگر فایل وجود داشته باشد، عملیات شکست می‌خورد

حالت r

حالت r فایل را فقط برای خواندن باز می‌کند.

$myfile = fopen("webdictionary.txt", "r");

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

حالت w

حالت w فایل را برای نوشتن باز می‌کند.

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

اگر فایل وجود نداشته باشد، PHP فایل جدیدی ایجاد می‌کند.

$myfile = fopen("example.txt", "w");

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

حالت a

حالت a برای اضافه کردن اطلاعات جدید به انتهای فایل استفاده می‌شود.

در این حالت محتوای قبلی فایل حفظ می‌شود.

$myfile = fopen("example.txt", "a");

این mode برای ثبت Log، گزارش‌ها و اطلاعاتی که باید به انتهای فایل اضافه شوند بسیار کاربردی است.

حالت x

حالت x برای ایجاد یک فایل جدید استفاده می‌شود.

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

$myfile = fopen("newfile.txt", "x");

این حالت زمانی مفید است که بخواهیم مطمئن شویم فایل موردنظر قبلاً وجود نداشته است.

خواندن فایل با fread()

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

ساختار این تابع:

fread(stream, length);

پارامتر stream همان File Handle است و پارامتر length حداکثر تعداد بایت‌هایی را مشخص می‌کند که باید خوانده شوند.

مثال استفاده از fread()

<?php

$myfile = fopen("webdictionary.txt", "r");

if ($myfile === false) {
    die("Unable to open file!");
}

$content = fread($myfile, filesize("webdictionary.txt"));

echo $content;

fclose($myfile);

?>

در این مثال ابتدا فایل را باز کرده‌ایم، سپس اندازه فایل را با filesize() به دست آورده‌ایم و در نهایت کل محتوای فایل را با fread() خوانده‌ایم.

بستن فایل با fclose()

بعد از پایان کار با فایل، بهتر است آن را با استفاده از fclose() ببندیم.

fclose($myfile);

مثال کامل

<?php

$myfile = fopen("webdictionary.txt", "r");

if ($myfile === false) {
    die("Unable to open file!");
}

echo fread($myfile, filesize("webdictionary.txt"));

fclose($myfile);

?>

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

خواندن یک خط با fgets()

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

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

مثال استفاده از fgets()

<?php

$myfile = fopen("webdictionary.txt", "r");

if ($myfile === false) {
    die("Unable to open file!");
}

echo fgets($myfile);

fclose($myfile);

?>

در این مثال اولین خط فایل خوانده و نمایش داده می‌شود.

بررسی پایان فایل با feof()

تابع feof() بررسی می‌کند که آیا اشاره‌گر فایل به انتهای فایل رسیده است یا خیر.

ساختار آن:

feof($file);

یکی از روش‌های رایج استفاده از feof() به شکل زیر است:

<?php

$myfile = fopen("webdictionary.txt", "r");

if ($myfile === false) {
    die("Unable to open file!");
}

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

fclose($myfile);

?>

با این حال، هنگام خواندن خطوط فایل، استفاده از الگوی زیر معمولاً انتخاب مطمئن‌تری است:

while (($line = fgets($myfile)) !== false) {
    echo $line;
}

در این روش مستقیماً نتیجه عملیات خواندن بررسی می‌شود.

ایجاد فایل در PHP

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

اگر فایلی وجود نداشته باشد و آن را با modeهایی مانند w یا a باز کنیم، PHP می‌تواند فایل را ایجاد کند؛ البته به شرطی که اسکریپت دسترسی لازم برای ایجاد فایل را داشته باشد.

مثال ایجاد فایل

<?php

$myfile = fopen("newfile.txt", "w");

if ($myfile === false) {
    die("Unable to create file!");
}

fclose($myfile);

?>

پس از اجرای این کد، در صورت وجود مجوزهای لازم، فایل newfile.txt ایجاد خواهد شد.

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

تابع fwrite() برای نوشتن اطلاعات در یک فایل بازشده استفاده می‌شود.

ساختار کلی:

fwrite(stream, data);

مثال استفاده از fwrite()

<?php

$myfile = fopen("newfile.txt", "w");

if ($myfile === false) {
    die("Unable to open file!");
}

$txt = "John Doe\n";
fwrite($myfile, $txt);

$txt = "Jane Doe\n";
fwrite($myfile, $txt);

fclose($myfile);

?>

در این مثال دو خط داخل فایل نوشته می‌شود.

محتوای فایل تقریباً به شکل زیر خواهد بود:

John Doe
Jane Doe

تفاوت modeهای w و a

یکی از مهم‌ترین نکات در کار با فایل‌های PHP، تفاوت w و a است.

استفاده از w

$myfile = fopen("data.txt", "w");

در صورت وجود فایل، محتوای قبلی آن حذف می‌شود و اطلاعات جدید نوشته خواهند شد.

مثلاً:

fwrite($myfile, "Hello");

می‌تواند محتوای قبلی فایل را جایگزین کند.

استفاده از a

$myfile = fopen("data.txt", "a");

در این حالت اطلاعات قبلی فایل حفظ می‌شوند و داده جدید در انتهای فایل قرار می‌گیرد.

مثال

<?php

$myfile = fopen("log.txt", "a");

if ($myfile === false) {
    die("Unable to open file!");
}

fwrite($myfile, "New log entry\n");

fclose($myfile);

?>

این روش برای ثبت رخدادها، گزارش‌ها و Logها بسیار کاربردی است.

بررسی وجود فایل با file_exists()

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

برای این کار از file_exists() استفاده می‌کنیم.

<?php

if (file_exists("webdictionary.txt")) {
    echo "File exists.";
} else {
    echo "File does not exist.";
}

?>

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

دریافت اندازه فایل با filesize()

تابع filesize() اندازه فایل را بر حسب بایت برمی‌گرداند.

<?php

$size = filesize("webdictionary.txt");

echo $size . " bytes";

?>

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

خواندن فایل با file_get_contents()

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

مثال

<?php

$content = file_get_contents("webdictionary.txt");

if ($content === false) {
    die("Unable to read file!");
}

echo $content;

?>

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

مقایسه با fopen() و fread()

روش کلاسیک:

$handle = fopen("data.txt", "r");
$content = fread($handle, filesize("data.txt"));
fclose($handle);

روش ساده‌تر:

$content = file_get_contents("data.txt");

انتخاب بین این روش‌ها به نیاز پروژه و نحوه پردازش فایل بستگی دارد.

نوشتن فایل با file_put_contents()

برای نوشتن ساده اطلاعات در فایل، file_put_contents() گزینه بسیار مناسبی است.

<?php

$result = file_put_contents("data.txt", "Hello PHP!");

if ($result === false) {
    die("Unable to write file!");
}

?>

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

به‌صورت پیش‌فرض، محتوای قبلی فایل با محتوای جدید جایگزین می‌شود.

اضافه کردن اطلاعات به انتهای فایل با FILE_APPEND

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

<?php

file_put_contents(
    "log.txt",
    "New log entry\n",
    FILE_APPEND
);

?>

در سناریوهایی که چند پردازش ممکن است هم‌زمان روی یک فایل بنویسند، می‌توان از LOCK_EX نیز استفاده کرد:

<?php

file_put_contents(
    "log.txt",
    "New log entry\n",
    FILE_APPEND | LOCK_EX
);

?>

حذف فایل با unlink()

برای حذف یک فایل در PHP می‌توانیم از تابع unlink() استفاده کنیم.

<?php

if (file_exists("oldfile.txt")) {
    unlink("oldfile.txt");
}

?>

از آنجا که حذف فایل یک عملیات برگشت‌ناپذیر است، بهتر است قبل از اجرای unlink() مسیر فایل را به‌دقت بررسی کنیم.

مدیریت خطا هنگام کار با فایل

در پروژه‌های واقعی نباید فرض کنیم که همیشه فایل با موفقیت باز یا نوشته می‌شود.

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

یک نمونه ساده:

<?php

$myfile = fopen("data.txt", "r");

if ($myfile === false) {
    die("Unable to open file.");
}

$content = file_get_contents("data.txt");

if ($content === false) {
    fclose($myfile);
    die("Unable to read file.");
}

echo $content;

fclose($myfile);

?>

در پروژه‌های حرفه‌ای‌تر بهتر است خطاها به شکل مناسب Log شوند و اطلاعات فنی حساس مستقیماً به کاربر نمایش داده نشوند.

نکات امنیتی کار با فایل‌ها

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

به مسیر فایل ورودی کاربر اعتماد نکنید

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

$file = $_GET['file'];

و سپس استفاده مستقیم از آن:

file_get_contents($file);

می‌تواند زمینه دسترسی ناخواسته به فایل‌های سیستم را فراهم کند.

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

در آپلود فایل فقط پسوند را بررسی نکنید

در پروژه‌هایی که امکان آپلود فایل وجود دارد، بررسی ساده پسوند فایل کافی نیست.

مواردی مانند موارد زیر نیز باید کنترل شوند:

  • نوع واقعی فایل
  • حجم فایل
  • نام فایل
  • محل ذخیره‌سازی
  • مجوزهای دسترسی
  • امکان اجرای فایل در مسیر آپلود
  • پسوندهای مجاز

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

از نام فایل کنترل‌نشده استفاده نکنید

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

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

مجوزهای فایل را مدیریت کنید

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

اعطای دسترسی بیش از حد می‌تواند در صورت وجود یک آسیب‌پذیری، خطرات امنیتی ایجاد کند.

Encoding فایل‌های متنی را در نظر بگیرید

اگر با متن فارسی یا چندزبانه کار می‌کنید، بهتر است پروژه از UTF-8 استفاده کند و Encoding فایل‌ها نیز به‌درستی مدیریت شود.

مثال عملی: ثبت Log در فایل

یکی از کاربردهای رایج کار با فایل، ثبت رخدادهای برنامه در یک فایل Log است.

<?php

$message = date('Y-m-d H:i:s') . " - User logged in\n";

$result = file_put_contents(
    "app.log",
    $message,
    FILE_APPEND | LOCK_EX
);

if ($result === false) {
    die("Unable to write log.");
}

?>

هر بار که این کد اجرا شود، یک رکورد جدید به انتهای فایل app.log اضافه می‌شود.

برای مثال:

2026-09-24 10:15:21 - User logged in
2026-09-24 10:18:42 - User logged in
2026-09-24 10:21:07 - User logged in

در پروژه‌های بزرگ، سیستم‌های Logging تخصصی معمولاً انتخاب مناسب‌تری نسبت به نگهداری تمام Logها در یک فایل ساده هستند.

تفاوت توابع مهم کار با فایل در PHP

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

تابعکاربرد
readfile()خواندن و خروجی مستقیم کل فایل
fopen()باز کردن فایل
fread()خواندن تعداد مشخصی بایت
fgets()خواندن یک خط
feof()بررسی رسیدن به انتهای فایل
fwrite()نوشتن در فایل بازشده
fclose()بستن فایل
file_get_contents()دریافت کل محتوای فایل
file_put_contents()نوشتن محتوا در فایل
file_exists()بررسی وجود فایل
filesize()دریافت اندازه فایل
unlink()حذف فایل

fopen() یا file_get_contents()؟

انتخاب بین این دو روش به نیاز پروژه بستگی دارد.

اگر فقط می‌خواهید محتوای یک فایل را یکجا بخوانید:

$content = file_get_contents("data.txt");

روش ساده و خوانایی است.

اما اگر می‌خواهید کنترل بیشتری روی فرآیند خواندن داشته باشید، مثلاً فایل را خط‌به‌خط پردازش کنید، استفاده از fopen() و fgets() مناسب‌تر است:

$handle = fopen("data.txt", "r");

while (($line = fgets($handle)) !== false) {
    // Process line
}

fclose($handle);

برای فایل‌های بزرگ، پردازش مرحله‌ای می‌تواند از بارگذاری کل محتوای فایل در حافظه جلوگیری کند.

جمع‌بندی

PHP ابزارهای متنوعی برای مدیریت فایل‌ها در اختیار توسعه‌دهندگان قرار می‌دهد. با استفاده از توابعی مانند fopen()، fread()، fgets()، fwrite() و fclose() می‌توان کنترل دقیقی روی عملیات فایل داشت.

در مقابل، برای عملیات ساده‌تر، توابعی مانند file_get_contents() و file_put_contents() می‌توانند کد را کوتاه‌تر و خواناتر کنند.

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

اگر در حال یادگیری PHP هستید، تسلط بر این توابع پایه خوبی برای ورود به مباحث پیشرفته‌تر مانند آپلود فایل در PHP، کار با CSV و JSON، مدیریت فایل‌های کاربران و ساخت سیستم Logging خواهد بود.

اشتراک گذاری :
مریم گوهرزاد
نویسنده

مریم گوهرزاد

مدرس و بنیانگذار هلدینگ آرتا رسانه. برنامه نویس و محقق حوزه بلاکچین و توسعه‌دهنده بلاکچین | متخصص Solidity | توسعه‌دهنده وب Full-Stackمن یک توسعه‌دهنده علاقه‌مند به فناوری‌های بلاکچین و وب ۳ هستم و در زمینه Solidity، توسعه قراردادهای هوشمند و ساخت برنامه‌های غیرمتمرکز (DApps) فعالیت می‌کنم. تمرکز من بر طراحی و پیاده‌سازی راهکارهایی است که در کنار بهره‌گیری از فناوری‌های نوین، عملکرد مناسب، امنیت و تجربه کاربری مطلوبی ارائه دهند.در کنار تخصص در حوزه بلاکچین، به عنوان یک توسعه‌دهنده وب Full-Stack نیز در طراحی و توسعه وب‌سایت‌ها و برنامه‌های تحت وب فعالیت می‌کنم. تجربه کار در بخش‌های Front-End و Back-End به من این امکان را داده است که پروژه‌ها را از مرحله ایده و طراحی تا توسعه و اجرا، با دیدی جامع دنبال کنم. در فرآیند توسعه، توجه ویژه‌ای به کدنویسی تمیز، معماری مناسب، طراحی واکنش‌گرا، عملکرد مطلوب و تجربه کاربری روان دارم.

TEST_VALUE_123
https://t.me/artarasaneh
tel:09193426251
https://wa.me/+989193426251
https://instagram.com/artarasaneh_com