همانطور که می بینید خروجی تابع fopen را در یکی متغیر ریخته ایم . این متغیر همان چیزی است که قرار است نقش دستگیره فایل را بازی کند و در حقیقت یک اشاره گر به فایل (File Pointer) است .
نحوه کار دستور fopen :
دستور fopen به این شکل عمل می کند که دو پارامتر می گیرد که هر دو الزامی هستند . اولین پارامتر تابع fopen نام یا آدرس فایل است . یادتان باشد که منظور از نام فایل ، فقط نام آن فایل به همراه پسوند یا انشعاب (extension) نیست . بلکه آدرس کامل فایل است که باید به نام فایل به همراه انشعاب منتهی شود مثلا ممکن است این نام (یا بهتر بگوییم آدرس) به شکل زیر باشد :
/var/www/html/site/file.txt
البته معمولا هیچ گاه به این شکل آدرس مطلق فایل را نمی نویسیم بلکه آدرس باید به صورت نسبی باشد . یعنی اگر تابع fopen در فایلی بنام index.php نوشته و اجرا گردد که این فایل در پوشه site (به آدرس فوق توجه کنید) و در کنار فایل file.txt باشد لزومی ندارد آدرس کامل فایل را بنویسید بلکه نام فایل به تنهایی کفایت می کند (مانند آنچه که در کد فوق نوشتیم).
دومین پارامتر دستور fopen مود یا حالتی است که برای باز نمودن فایل باید مورد توجه PHP قرار گیرد . این مود نشاندهنده اینست که هدف از باز نمودن فایل چیست ؟ و همیشه باید این نکته را مد نظر قرار داد که نزدیکترین مود به هدف را برای باز کردن فایل در PHP انتخاب کنیم . به عنوان مثال مود r بدین معنیست که فایل باید برای خواند باز شود و فایل بازشده در این حالت ، Read Only خواهد بود و نمی توان در آن نوشت در حالیکه اگر از مود +w استفاده شود هم امکان خواندن از فایل وجود دارد و هم امکان نوشتن در فایل . حال اگر هدف از برنامه ما صرفا خواندن یک فایل و نشان دادن محتویات آن باشد آیا لزومی دارد این فایل در مود +w باز شود ؟ پاسخ منفی است .
10 مود برای باز کردن فایل در PHP وجود دارد که در زیر ما 8 تای آنها را بررسی می کنیم :
1- مود r : بدین معناست که فایل در حالت فقط خواندنی (Read Only) باز می شود و عملیات خواندن از ابتدای فایل شروع خواهد شد . اگر فایل وجود نداشته باشد دچار خطا می شود .
2- مود +r : این مود فایل را در حالت نوشتن و خواندن باز می کند و عملیات مربوطه را از ابتدای فایل شروع می کند .
3- مود w : بدین معناست که فایل فقط در حالت نوشتن (Write Only) باز می شود .این بدان معناست که حتی داده ای را که خودمان در فایل می نویسیم نمی توانیم بخوانیم . اگر فایل وجود داشته باشد ، باز شده و محتویات قبلی آن پاک می شود و اگر وجود نداشته باشد ابتدا فایلی با نام داده شده ایجاد شده و بعد باز می شود . ضمن اینکه کرسر فایل در ابتدای آن قرار میگیرد .
4- مود +w : این مود فایل را در حالت خواندن و نوشتن باز می کند . تفاوت این حالت با حالت دوم یعنی +r اینست که در این حالت اگر فایل وجود نداشته باشد ، فایلی با این نام ایجاد خواهد شد .
5- مود a : این مود فایل را در حالت نوشتن باز می کند . تفاوت این حالت با مود w اینست که در مود w فایل باز شده و محتوبات آن پاک می شود اما در مود a فایل append می شود یعنی فایل باز شده و کرسر آن در انتهای فایل قرار می گیرد و محتوبات قبلی فایل حفظ می شود . هنگامی که فایل وجود نداشته باشد این دو مود شبیه هم کار می کنند .
6- مود +a : در این مود همانند مود a عمل می شود (در مورد نوشتن) با این تفاوت که امکان خواندن از فایلی که در این مود باز می شود نیز وجود دارد . ولی به هر حال کرسر فایل در انتهای آن قرار می گیرد .
7- مود x : در این مود اگر فایل مذکور وجود داشته باشد پیغام هشدار (warning) صادر شده و خروجی تابع fopen مقدار منطقی false خواهد بود . اگر فایل وجود نداشته باشد ایجاد شده و برای نوشتن باز می شود .پس طبیعتا کرسر فایل در ابتدای آن قرار می گیرد .
8- مود +x : همانند مود x عمل می کند با این تفاوت که در این مود امکان خواندن از فایل نیز وجود دارد . (اشتباه نکنید : خواندن از فایلی که خودمان ایجاد کرده ایم و نه فایلی که از قبل وجود دارد چرا که همانطور که گقتیم در این صورت خروجی تابع fopen برابر مقدار منطقی false شده و warning تولید می شود.)
خب حال که فایل را باز کردیم خروجی آنرا در بک متغیر میریزم تا برای ادامه کار از آن استفاده کنیم . در انتهای کار با فایل باید حتما فایل را ببندید تا منبعی از منابع سیستم عامل را آزاد کنیم .اگر این کار را انجام ندهید مفسر PHP به شما خطا نمی دهد بلکه امنیت فایل به خطر می افتد چرا که دارای یک ارتباط باز خواهد بود که ممکن است مورد استفاده سوء قرار بگیرد . ضمن اینکه منبعی از منابع سیستم عامل اشغال خواهد ماند . همانطور که می بینید در دستورات بالا این کار توسط تابع fclose انجام شده است . به شما توصیه می کنم به محض نوشتن تابع fopen از تابع fclose استفاده کنید چرا که بعدا ممکن است آنرا فراموش کنید !
البته معمولا دستور fopen به تنهایی به کار نمی رود و با تابع exit همراهی می شود . این کار برای اینست که اگر عملیات باز کردن فایل با تابع fopen ناموفق بود اجرای اسکریپت ادامه پیدا نکند . اجرای این کار به شکل زیر است :
$fp = fopen("file.txt" , "r") or exit("Unable to open file !");
فهم درست چگونگی اجرای این دستور در گرو شناخت درست رفتار PHP در برخورد با عملگر or است . عملگر or باعث می شود که اگر اجرای دستور اول ناموفق بود مفسر PHP به سراغ اجرای دستور exit می رود .
خواندن از فایل در PHP
بعد از باز کردن فایل نوبت خواندن فایل در PHP می رسد . برای خواندن از فایل توابع زیادی وجود دارد . یکی از این توابع که فایل را با ساختار مناسبی که معمولا ما انتظار داریم میخواند تابع fgets است . تابع fgets فایل را خط به خط میخواند . اما یک سئوال مطرح است و آن اینکه تا چه زمانی این کار انجام می شود ؟ این دستور صرفا در هربار خواندن از فایل یک خط را تا به انتها خوانده و در بافر حافظه قرار میدهد و به ابتدای خط بعدی می رود . بنابراین برای اینکه فایل را تا انتها بتوانید بخوانید باید این کار را در یک حلقه انجام دهید . شرط این حلقه باید بررسی این نکته باشد که چه زمانی به انتهای فایل رسیده ایم ؟ اینجا پای تابع دیگری از PHP به میان کشیده میشود و آن تابع feof است . این تابع بررسی می کند که آیا این فایل به انتها رسیده است یا خیر ؟ اگر به انتها رسیده باشد خروجی این تابع true خواهد بود بنابراین این تابع را در حلقه به همراه علامت ! (not) بکار می بریم به این معنا که به php بگوئیم تا زمانی که این فایل به انتها نرسیده یک خط از آن بخوان . پس اگر همه این مطالب را بخواهیم با هم بررسی کنیم به قطعه کد زیر می رسیم :
$fp = fopen("file.txt" , "r") or exit("Unable to open file !");
while(!feof($fp))
{
$line = fgets($fp);
echo $line."
";
}
fclose($fp);
?>
تابع دیگری که برای خواندن از فایل در PHP وجود دارد تابع fgetc است . این تابع فایل را به صورت حرف به حرف (character by character) میخواند .
کلی ترین و اصلی ترین تابعی که در php برای خواندن از فایل وجود دارد تابع fread است . این تابع دو پارامتر می گیرد . اولی متغیر handle مربوط به فایل و دومی یک عدد صحیح است که نشاندهنده تعداد بایت هایی است که باید از این فایل خوانده شود . برای فایل های متنی انگلیسی هر بایت معادل یک کاراکتر و برای فایل هایی با نوع انکدینک یونیکد (unicode) هر حرف معادل دو بایت است . اگر بخواهید کل فایل را با یکبار انجام عمل fread بخوانید باید در پارامتر دوم سایز کل فایل را مشخص کنید . برای مشخص کردن سایز کل فایل می توان از تابع filesize استفاده کرد . خروجی تابع filesize در PHP عددی صحیح است که نشاندهنده سایز کل فایل است . خروجی تابع fread در PHP نیز یک رشته است . نحوه کار با این دو تابع به شکل زیر است . همانطور که میبینید برای انجام کار با fread معمولا نیازی به استفاده از حلقه نیست (مگر اینکه بخواهید در هر بار سایز مشخصی از فایل را بخوانید.)
$fp = fopen ("file.txt" , "r");
$str = fread($fp , filesize($fp));
echo $str;
?>
نوشتن در فایل در PHP
برای نوشتن در فایل توسط PHP میتوان به راحتی از تابع fwrite استفاده کرد . این تابع دو پارامتر میگیرد . اولی متغیر handle فایل و دومی رشته ایست که میخواهیم در فایل بنویسیم . البته این تابع به شرطی با موفقیت انجام می شود که فایل در مودی باز شود که اجازه نوشتن نیز داشته باشد .
fwrite($fp , "Some Text");
?>
پایان بخش هشتم
منتظر بخش نهم باشید.
برای خرید آموزش تصویری PHP به زبان فارسی می توانید از لینک زیر استفاده کنید.