Advertisement
  1. Code
  2. PHP

نوشتن در فایل و خواندن فایل با پی اچ پی

Scroll to top
Read Time: 11 min

() translation by (you can also view the original English article)

در این آموزش, شما چندین تابع مهم که برای خواندن و نوشتن ساده که برای کار با فایل ها در پی اچ پی نیاز دارید را فرا میگیرید. شما فرا میگیرید که چطور یک فایل را بخوانید, چطور در یک فایل بنویسید, چطور در یک فایل متنی بنویسید و چطور وجود داشتن یک فایل را بررسی کنید.

خوشبختانه, پی اچ پی تعداد زیای تابع که برای خواندن و نوشتن اطلاعات در فایل نیاز است را فراهم کرده. در این آموزش, من به شما راحت ترین روش خواندن اطلاعات از یک فایل محلی یا یک فایل از راه دور و چگونگی استفاده از پرچم ها برای نوشتن در فایل انطور که ما میخواهیم را نشان میدهم.

بررسی کردن موجود بودن یک فایل

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

راحت ترین روش برای بررسی کردن موجود بودن فایل در پی اچ پی استفاده از تایع (file_exists($filename است. این تابع مقدار true را برمیگرداند اگر فایل یا پوشه ارسال شده با استفاده از filename$ وجود داشته باشد و در غیر اینصورت مقدار false را برمیگرداند. این ممکن است برای شما واضح باشد, ولی من تمایل دارم گوشزد کنم که filename$ همیشه فقط نام یک فایل نیست. همچنین می تواند یک آدرس کامل و یا نسبی باشد. برای مثال, ما میتوانیم از prime_numbers.txt یا science/project/periodic_table.txt استفاده کنیم.

همچنین این مهم است که بخاطر داشته باشید این تابع مقدار false را برای فایل هایی که به دلیل محدودیت های "حالت ایمن" غیرقابل دسترسی هستند برمی گرداند.

تابع دیگری که برای شما برای بررسی موجود بودن یک فایل میتوانید استفاده کنید ()is_file است. در مقایسه با ()file_exists, این تابع فقط مقدار true را زمانی برمیگرداند که مسیر ارسالی به یک فایل اشاره کند و نه یک پوشه.

مطمئن شوید که فایل در حقیقت وجود دارد

اگر کدی که شما مینویسید عملیات زیادی را روی یک فایل خاص انجام میدهد, ممکن است وقتی که از تابع بالا استفاده میکنید نتایج نادرستی بگیرید. این اتفاق به این دلیل است که نتایج اجرای هر دو تابع ()file_exists و ()is_file به منظور بهبود کارایی ذخیره(به طور موقت) می شوند. همچنین پی اچ پی مقدار های بازگشتی از تابع های سیستم فایل مانند ()filesize و ()filemtime و غیره ... را ذخیره میکند.

شما میتوانید با صدا زدن ()clearstatcache مطمئن شوید اطلاعاتی که به آن دسترسی پیدا میکنید به روز رسانی شده است.

به طور کلی این فقط یکی از مشکلاتی است که وقتی یک فایل چندین بار در یک اسکریپت برای مطلع شدن از وضعیت آن استفاده میشود پیش می آید. همچنین, وقتی شما در داخل اسکریپت با استفاده از کد ()unlink فایل را حذف میکنید اطلاعات ذخیره شده توسط پی اچ پی از بین می رود. اساسا این به این معنی است که شما با هیچکدام از مشکلات مربوط به ذخیره سازی وضعیت روبرو نمی شوید. اما خوب است این را بدانید که شما میتوانید در مواقعی که در زمان دسترسی به اطلاعات در مورد یک فایل اطلاعات قدیمی شده یا نتایج غیرمنتظره است حافظه را پاک کنید.

خواندن داده ها از یک فایل در پی اچ پی

یکی از ساده ترین راه های خواندن داده ها از یک فایل در پی اچ پی استفاده از تابع file_get_contents($filename, $use_include_path, $context, $offset, $maxlen) است. این تابع به سادگی محتویات فایل را می خواند و در قالب یک رشته به شما تحویل میدهد. همه ی پارامترها (مولفه ها) به جز اولی اختیاری هستند.

پارامتر دوم یک مقدار بولین (true یا false) برای تعیین اینکه باید به دنبال یک فایل در مسیر مشخص شده باشد یا خیر دریافت میکند, که می تواند با استفاده از تابع ()set_include_path تنظیم شود.

شما میتوانید از پارامتر سوم برای مشخص کردن گروهی از گزینه ها برای چگونگی دسترسی به فایل استفاده کنید. می توانید از این پارامتر برای مشخص کردن مقدار هدر متد HTTP استفاده کنید مانند Cookies و Host 

پارامتر offset$ مشخص کننده نقطه ای است که خواندن فایل اصلی از آنجا شروع میشود. اگر از یک مقدار منفی استفاده کنید شمارش از انتها به ابتدا انجام میشود. پشتیبانی از مقدار منفی برای شمارش از انتها به ابتدا, اولین بار در پی اچ پی 7.1.0 اضافه شد و این نکته حائز اهمیت است که بدانید از این ویژگی فقط برای فایل های محلی می توان استفاده کرد و در فایل هایی که از راه دور دسترسی داریم کار نمی کند.

تابع ()file_get_contents به صورت پیش فرض کل فایل را می خواند. برای تغییر این رفتار شما می تواند یک مقدار برای پارامتر maxlen$ تعیین کنید. شمارش تعداد کاراکتر هایی که شما تعیین میکنید از خطی که در پارامتر offset تعیین کردید شروع می شود.

این تابع زمانی که خواندن اطلاعات از فایلی که شما مشخص کردید ناموفق باشد مقدار false را برمیگرداند. با این حال, این تابع می تواند مقدار هایی را برگرداند که به نحوی معنی false را بدهد. بنابراین زمانی که برای بررسی مقدار برگشتی از if استفاده میکنید مطمئن شوید از عملگر === استفاده میکنید.

شما از این تابع برای بازکردن فایل های ریموت (از راه دور) می توانید استفاده کنید, اما این فقط زمانی ممکن است که allow-url-fopen در فایل php.ini مقدار true یا 1 را داشته باشد.

نوشتن اطلاعات در فایل در پی اچ پی

یکی از ساده ترین راه های نوشتن اطلاعات در فایل در پی اچ پی کمک گرفتن از تابع (file_put_contents($filename, $data, $flags, $context است.

پارامتر filename$ مشخص میکند که اطلاعات در کدام فایل باید نوشته شود. پارامتر دوم اطلاعاتی است که شما می خواهید در فایل بنویسید. بیشتر مواقع یک رشته است, اما همچنین میتواند آرایه یا جریانی از منابع باشد.

به خاطر داشته باشید که در صورتی که فایلی که شما مشخص کرده اید از قبل وجود نداشته باشد پی اچ پی آنرا به صورت خودکار میسازد. با این حال, پی اچ پی هیچ دایرکتوری برای شما نمیسازد. این, به این معنی است که شما می توانید فایلی با نام On the Origin of Species [Charles Darwin].txt را بدون خطا ذخیره کنید. با این حال, تنظیم پارامتر filename$ با مقدار Biology/Evolution/On the Origin of Species [Charles Darwin].txt در صورتی که دایرکتوری /Biology/Evolution از قبل ساخته نشده باشند باعث بروز خطا میشود.

پارامتر flags$ مشخص میکند که محتوا چگونه در فایل نوشته شود. این پارامتر می تواند هرکدام و یا همه ی مقدار های زیر را شامل شود :

  • FILE_USE_INCLUDE_PATH— این مقدار به پی اچ پی اطلاع می دهد که به دنبال نام فایل داده شده در دایرکتوری مورد نظر بگردد.
  • FILE_APPEND— این مقدار به پی اچ پی اطلاع می دهد که مقدار فرستاده شده توسط تابع را به فایل بچسباند بدون اینکه محتوای قبلی فایل از بین برود. این ویژگی می تواند بسیار کاربردی باشد وقتی که شما از قبل اطلاعاتی را در فایل ذخیره کردید مانند log یا خاطرات شخصی. ذخیره کردن اطلاعات جدید توسط شما مانند درجه حرارت و یا رویداد ها ی که امروز برای شما اتفاق افتاده بر روی اطلاعاتی که شما دیروز ذخیره کردید نوشته نمی شود.
  • LOCK_EX— این مقدار به پی اچ پی اطلاع می دهد که قبل از شروع به نوشتن اطلاعات در فایل یک قفل بر روی آن بگذارد. این ویژگی می تواند از اتفاقات غیر منتظره زمانی که دو اسکریپت متفاوت همزمان شروع به نوشتن و یا خواندن اطلاعات از یک فایل میکنند جلوگیری کند. با استفاده از این مقدار برای پارامتر, شما یک قفل انحصاری بر روی فایل دریافت میکنید. برای اطلاعات بیشتر در مورد این قفل می توانید به مستندات پی اچ پی در مورد تابع ()flock مراجعه کنید.

این تابع اندازه بایت های نوشته شده در فایل را در صورت موفق بودن بر میگرداند و در غیراینصورت(ناموفق بودن) عبارت false را برمیگرداند. با این حال, شما باید اپراتور های سختگیرانه ای برای بررسی موفق بودن نوشتن اطلاعات در فایل استفاده کنید. این, به این دلیل است که کدی که نشان می دهد 0 بایت در فایل نوشته شده به عنوان false ارزیابی می شود.

خواندن و نوشتن اطلاعات در فایل ها

شما می توانید سری به سایت Project Gutenberg بزنید و فایل های که در آن از تابع ()file_get_contents استفاده شده را دانلود کنید. اگر اطلاعات را در قالب رشته داشته باشید, به سادگی میتوانید آن را در یک فایل محلی با استفاده از تابع ()file_put_contents ذخیره کنید. مثال گفته شده خیلی ساده آن را انجام می دهد:

1
<?php
2
3
$filename = 'http://www.gutenberg.org/cache/epub/1228/pg1228.txt';
4
5
$book_content = file_get_contents($filename);
6
file_put_contents('Biology/Evolution/On the Origin of Species [Charles Darwin].txt', $book_content, LOCK_EX);
7
8
?>

شما می توانید صفحات وب یا محتوای وبسایت هایی مانند ویکی پدیا را با روشی مشابه ذخیره کنید. اگر نیاز دارید که HTML مفهومی باشد و محتوای HTML که به صورت محلی ذخیره کردید را تجزیه کنید, می توانید از آموزشی مانند تجزیه HTML با PHP با استفاده از DiDom استفاده کنید, این به شما در دریافت خودکار لینک ها, فایل های عکس و یا هر اطلاعات مشابه دیگری از صفحه وب کمک میکند.

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

1
<?php
2
3
$filename = 'On the Origin of Species [Charles Darwin].txt';
4
$book_content = file_get_contents($filename);
5
6
$book_content_lowercase = strtolower($book_content);
7
8
$individual_words = explode(' ', $book_content_lowercase);
9
echo "There are about ".count($individual_words)." words in the book: ".substr($filename, 0, -4).".\n";
10
11
$word_frequency = array_count_values($individual_words);
12
echo "Total number of unique words in the book are ".count($word_frequency).".\n";
13
echo "The word 'Elephant' occurs ".$word_frequency["elephant"]." times in the book.\n";
14
echo "The word 'Ant' occurs ".$word_frequency["ant"]." times in the book.\n";
15
16
if(isset($word_frequency["evolution"])) {
17
    echo "The word 'Evolution' occurs ".$word_frequency["evolution"]." times in the book.\n";
18
} else {
19
    echo "The word 'Evolution' does not occur even once in the book.\n";
20
}
21
22
arsort($word_frequency);
23
echo "The most used word in the book is: '".key($word_frequency)."'.\n";
24
25
/* Output of all the code above
26
27
There are about 147520 words in the book: On the Origin of Species [Charles Darwin].
28
Total number of unique words in the book are 22758.
29
The word 'Elephant' occurs 3 times in the book.
30
The word 'Ant' occurs 6 times in the book.
31
The word 'Evolution' does not occur even once in the book.
32
The most used word in the book is: 'the'.
33
?>

ما تمام کلمه ها را به حروف کوچک تبدیل میکنیم و فرض را بر این میگیریم تمام کلمه ها با فاصله (space) از هم جدا شدند. بعد از آن متن با استفاده از ()explode به یک آرایه برای ساده تر شدن تجزیه و تحلیل کلمات منحصر به فرد تبدیل می شود. شگفت انگیز است, کلمه "تحول" حتی یکبار هم در سراسر کتاب تئوری تحول جایگاه استفاده نشده.

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

واقع نگاری (log) اطلاعات با FILE_APPEND

یکی دیگر از مثال های کاربردی, واقع نگاری اطلاعات در دوره های کوتاه زمانی می باشد. به عنوان مثال این می تواند ورزش روزانه, اطلاعات آب و هوا, یا یک کلنی از زنبور ها که شما مراقبشان هستید باشد. وقتی شما اطلاعات را در قالب رشته داشته باشید, به راحتی می توانید آنها را با استفاده از پرچم FILE_APPEND در تابع ()file_put_contents به یکسری اطلاعات از قبل ذخیره شده در فایل اضافه کنید.

1
<?php
2
3
$filename = "bee-colony.txt";
4
5
$present = date('l | jS \of F Y h:i:s A', time());
6
$entry = $present."\n";
7
8
// A pseudo function which could be replaced with something real.

9
$bee_information = gather_bee_data();
10
$entry .= "$bee_information.\n\n";
11
12
file_put_contents($filename, $entry, FILE_APPEND|LOCK_EX);
13
14
?>

از کدهای مشابه می توان برای کارهایی مانند ذخیره ویژگی های محتوای ویکی پدیا در یک فایل به صورت روزانه یا دنبال کردن محتوای اخبار و عنوان خبرها برای دوره های هفتگی یا ماهانه استفاده کرد. تمام کاری که شما نیاز دارید انجام دهید این است که یک کد برای برداشتن اطلاعات و بعد از آن ذخیره کردن آن, مانند قطعه کد بالا بنویسید. یک آموزش مانند تجزیه HTML با PHP با استفاده از DiDOM می تواند به شما در قسمت برداشتن اطلاعات کمک کند.

به جای نوشتن متن با یک فرمت ساده, می توانید با کمک HTML خواندن آنرا در مرورگر ساده تر کنید. امکانات آن بی پایان است.

نکته آخر

راه های زیادی برای خواندن و نوشتن اطلاعات در فایل با استفاده از PHP وجود دارد. با این حال, دو تابع ()file_get_contents و ()file_put_contents تقریبا می تواند تمام نیاز های ساده شما را بدون پیچیدگی های غیرضرروی جوابگو باشد.

زمانی شما در استفاده از تابع ()file_get_contents به مشکل بر می خورید که فایل مورد نظر خیلی حجیم باشد — مانند 2 گیگابایت یا بیشتر. این به این دلیل است که تابع ()file_get_contents یکبار تمام فایل را در رم بارگزاری میکند, و در این مواقع احتمال زیادی برای پر شدن رم وجود دارد. در این مواقع, شما باید به تابع هایی مانند ()fgets و ()fread برای خواندن تکه کوچکی از فایل اعتماد کنید.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.