نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی
  • خانه
  • اهن
  • php به یک متغیر. نحوه خواندن صحیح فایل ها با PHP

php به یک متغیر. نحوه خواندن صحیح فایل ها با PHP

دانلود $_ (8)

من باید یک فایل PHP را در یک متغیر بارگذاری کنم. به عنوان مثال include();

من یک فایل html ساده مثل این آپلود کردم:

$Vdata = file_get_contents("textfile.txt");

اما الان باید یک فایل PHP آپلود کنم.

پاسخ ها

اگر فایل شما دارای عبارت بازگشت است:

"Afeganistão"، "ZA" => "África do Sul"، ... "ZW" => "Zimbabué");

شما می توانید این متغیر را به صورت زیر دریافت کنید:

$data = شامل $filePath;

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

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

$string = eval(file_get_contents("file.php"));

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

حدس می زنم می خواهید چه چیزی به دست آورید محتوای تولید شده توسط PHP، اگر چنین است:

$Vdata = file_get_contents("http://YOUR_HOST/YOUR/FILE.php");

در غیر این صورت اگر بخواهید کد منبع فایل PHP، این همان فایل txt است:

$Vdata = file_get_contents("path/to/YOUR/FILE.php");

در تئوری شما فقط می توانید از fopen استفاده کنید و سپس از stream_get_contents استفاده کنید.

$stream = fopen("file.php","r"); $string = stream_get_contents($stream); fclose($stream);

اگر استفاده می کنید http://همانطور که توسط eye پیشنهاد شده است، شما فقط می توانید خروجی اسکریپت PHP را بخوانید. فقط در صورتی می توانید یک اسکریپت PHP را بخوانید که روی همان سروری باشد که اسکریپت شما قرار دارد. سپس می توانید از چیزی مانند استفاده کنید

$Vdata = file_get_contents("/path/to/your/file.php");

در اینجا نحوه انجام آن است (راه های زیادی وجود دارد):

  1. تبدیل داده به JSON
  2. زنگ زدن AJAXبرای دریافت فایل JSON
  3. دگرگونی JSONبه یک شی جاوا اسکریپت

مرحله 1

connect_error) ( die("اتصال ناموفق: " . $conn->connect_error); ) $sql = "انتخاب شناسه، نام، تصویر از تلفن"; $result = $conn->query($sql); while($row =$result->fetch_assoc())($v=$row; ) echo json_encode($v); $conn->close(); ?>

گام 2

تابع showUser(fnc) ( var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() ( if (this.readyState == 4 && this.status == 200) (// STEP 3 var p=JSON.parse( this.responseText))))

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

کار با فایل ها به 3 مرحله تقسیم می شود:

  1. باز کردن یک فایل
  2. دستکاری داده.
  3. بستن یک فایل

من. باز کردن یک فایل

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

$fp = fopen("counter.txt"، "r");

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

  1. r - باز کردن فایل فقط خواندنی.
  2. r+ - باز کردن یک فایل برای خواندن و نوشتن به طور همزمان.
  3. w - یک فایل خالی جدید ایجاد کنید. اگر چنین فایلی از قبل در زمان تماس وجود داشته باشد، از بین می رود.
  4. w+ - مشابه r+، فقط در صورت وجود چنین فایلی در زمان تماس، محتویات آن حذف می شود.
  5. a - یک فایل موجود را در حالت نوشتن باز می کند، در حالی که نشانگر به آخرین بایت فایل (به انتهای فایل) منتقل می شود.
  6. a+ - فایل را در حالت خواندن و نوشتن باز می کند، در حالی که نشانگر به آخرین بایت فایل (به انتهای فایل) منتقل می شود. محتویات فایل حذف نمی شود.

توجه: می تواند یک پارامتر اختیاری دیگر در انتهای هر یک از خطوط وجود داشته باشد: b یا t. اگر b مشخص شده باشد، فایل در حالت خواندن/نوشتن باینری باز می شود. اگر t، حالت ترجمه خوراک خط برای فایل تنظیم شده است، یعنی. به عنوان متن در نظر گرفته می شود.

برای نشان دادن، سناریوی زیر را در نظر بگیرید:

//فایل را در حالت های مختلف باز می کند
$fp = fopen("counter.txt"، "r"); // حالت باینری
$fp = fopen("counter.txt"، "rt"); // حالت متنی
$fp = fopen("http://www.yandex.ru", "r");// اتصال HTTP را برای خواندن باز می کند
$fp = fopen("ftp://user: [ایمیل محافظت شده]"، "w")؛ //اتصال FTP را با لاگین و رمز عبور باز کنید
?>

II. دستکاری داده های فایل

با استفاده از تابع می توانید داده ها را با استفاده از PHP روی یک فایل بنویسید fwrite(). این تابع 2 پارامتر مورد نیاز و 1 پارامتر اختیاری را می گیرد. پارامترهای مورد نیاز عبارتند از توصیفگر فایل و حالت فایل:

$fp = fopen("counter.txt"، "a"); // فایل را در حالت نوشتن باز کنید
$mytext = "باید این رشته را بنویسیم\r\n"; // رشته منبع
$test = fwrite ($fp، $mytext)؛ // در فایل بنویسید
if ($test) echo "داده ها با موفقیت در فایل نوشته شد.";
else echo "خطا در نوشتن در فایل."؛
fclose($fp); // بستن فایل
?>

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


اگر ($fp)
{
در حالی که (!feof($fp))
{
$mytext = fgets($fp، 999);
echo $mytext."
";
}
}

fclose($fp);
?>

نکته: در این مثال، مقدار 999 تعداد کاراکترهایی را تعیین می کند که تا زمانی که نشانگر به انتهای فایل (EOF) برسد خوانده می شود.

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

echoreadfile("counter.txt");
?>

همچنین می توانید از تابع fpassthru() استفاده کنید که 1 پارامتر مورد نیاز را می گیرد. قبل از استفاده از این ویژگی باید فایل را در حالت خواندن باز کنید. در پایان خواندن فایل، تابع به طور خودکار فایل را می بندد (در این حالت، توصیف کننده فایل نامعتبر می شود).

$fp = fopen("counter.txt"، "r"); // فایل را در حالت خواندن باز کنید
if ($fp) echo fpassthru($fp);
elseecho "خطا در باز کردن فایل"؛
?>

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

توجه: از عملکرد استفاده نکنید فایل()به فایل های باینری (باینری-ایمن)، زیرا از نظر خواندن فایل های باینری ایمن نیست، اگر در همان زمان با یک کاراکتر انتهای فایل (EOF) در جایی روبرو شوید، آن را تضمین نمی کند که کل فایل باینری را بخوانید.

$file_array = file("counter.txt"); // فایل را در $file_array بخوانید
// کار با داده های آرایه
?>

توجه: کار با آرایه ها با جزئیات شرح داده شده است، نویسندگان: Mukhametshin D.F.، Simdyanov I.V.

در پایان مقاله، یک "دستور العمل" خوب در آرایه ها پیدا خواهید کرد که راه حل هایی برای بسیاری از مشکلاتی که برنامه نویسان وب روزانه با آن مواجه هستند را ارائه می دهد.

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

$fp = fopen("counter.txt"، "r"); // فایل را در حالت خواندن باز کنید
اگر ($fp)
{
while(!feof($fp))
{
$char = fgetc($fp);
if ($char == "c") $i = $i + 1;// یافتن کاراکتر "c"
}
echo "تعداد کاراکترهای "c" در فایل: ". $i;
}
else echo "خطا در باز کردن فایل"؛
?>

III. بستن یک فایل

فایل با استفاده از تابع بسته می شود fclose()، که 1 پارامتر لازم را می گیرد.

$fp = fopen("counter.txt"، "r");
اگر ($fp)
{
echo "پرونده باز است"؛
fclose($fp); // بستن فایل
}
?>

مجموعه دستور غذا

1) باید بررسی کنیم که آیا این یا آن فایل وجود دارد یا خیر. برای این کار از تابع استفاده می کنیم فایل وجود دارد().

myfile("counter.txt"); // از تابع myfile استفاده کنید و نام فایل را به عنوان آرگومان ارسال کنید

تابع myfile($name) //یک تابع برای بررسی وجود فایل ایجاد کنید
{
if (file_exists($name)) echo "فایل وجود دارد";

}
?>

توجه: عملکرد فایل وجود داردفایل های موجود در وب سرور راه دور را بررسی نمی کند. برای اینکه عملکرد به درستی کار کند، فایل با اسکریپت باید در سروری قرار داشته باشد که فایل مورد بررسی در آن قرار دارد.

2) اندازه فایل را با استفاده از تابع تعیین کنید حجم فایل()

myfile("counter.txt");

تابع myfile($name) //یک تابع برای بررسی وجود فایل و تعیین اندازه فایل ایجاد کنید
{
if (file_exists($name)) echo "اندازه فایل: ".filesize($name)." بایت";
else echo "فایل وجود ندارد"؛
}
?>

3) ایجاد یک فایل موقت با استفاده از تابع tmpfile()

$myfile = tmpfile();
fwrite($myfile، "این خط در یک فایل موقت نوشته می شود."); // در یک فایل موقت بنویسید
fseek($myfile, 0); // نشانگر فایل را تنظیم کنید
echo fread($myfile، 1024); // نمایش محتویات فایل
?>

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

$fp = file("counter.txt");
echo "تعداد خطوط در فایل: ".count($fp);
?>

5) باید از مکانیزم قفل فایل استفاده کنیم

$fp = fopen("counter.txt"، "a");
flock ($fp، LOCK_EX); // قفل فایل برای نوشتن
fwrite($fp، "رشته برای نوشتن");
flock ($fp، LOCK_UN); // قفل را آزاد کنید
fclose($fp);
?>

6) باید خط خاصی را از فایل حذف کنیم

$num_string = 5; //خط 5 را از فایل حذف کنید
$file = file("counter.txt"); // کل فایل را در یک آرایه بخوانید

برای ($i = 0؛ $i< sizeof($file); $i++)
if($i == $num_stroka) unset($file[$i]);

$fp = fopen("counter.txt"، "w");
fputs($fp، implode(""، $file));
fclose($fp);
?>

7) تعریف نوع فایل. ما از تابع استفاده می کنیم

درباره استفاده از توابع fopen، fclose، feof، fgets، fgetss و fscanf

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

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

روش های سنتی فوپن

روش‌های fopen شاید آشناترین روش‌ها برای برنامه‌نویسان C و C++ قدیم باشند، زیرا اگر با این زبان‌های برنامه‌نویسی کار کرده باشید، کم و بیش ابزارهایی هستند که سال‌ها در دسترس شما بوده‌اند. برای هر یک از روش‌ها، همانطور که در فهرست 1 نشان داده شده است، از روش استاندارد استفاده از fopen برای باز کردن یک فایل، تابعی برای خواندن داده‌ها و سپس fclose برای بستن فایل پیروی می‌کنید.

فهرست 1. باز کردن و خواندن یک فایل با fgets
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) ($line = fgets($file_handle); echo $line; ) fclose($file_handle);

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

  1. شما فایل را باز کنید. $file_handle یک مرجع به خود فایل دارد.
  2. بررسی کنید که آیا به پایان فایل رسیده اید یا خیر.
  3. خواندن فایل را ادامه دهید تا به انتهای آن برسید و هر خطی را که خواندید چاپ کنید.
  4. شما فایل را ببندید.

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

تابع fopen

تابع fopen با یک فایل ارتباط برقرار می کند. من می گویم "اتصال"، زیرا، علاوه بر باز کردن یک فایل، fopen همچنین می تواند URL را باز کند:

$fh = fopen("http://127.0.0.1/", "r");

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

توجه داشته باشید:گزینه "r" استفاده شده در fopen نشان می دهد که فایل فقط خواندنی است. از آنجایی که نوشتن در یک فایل خارج از محدوده این مقاله است، من تمام مقادیر ممکن برای پارامتر را فهرست نمی کنم. با این حال، اگر در حال خواندن فایل‌های باینری برای سازگاری بین پلتفرم هستید، باید «r» را به «rb» تغییر دهید. نمونه ای از این نوع در زیر آورده خواهد شد.

عملکرد feof

دستور feof تعیین می کند که آیا خواندن تا انتهای فایل انجام شده است و مقدار True (True) یا False (False) را برمی گرداند. حلقه ورود تا پایان "myfile" ادامه دارد. توجه داشته باشید که اگر در حال خواندن یک URL هستید و زمان اتصال به پایان رسیده است، feof False را برمی‌گرداند زیرا داده دیگری برای خواندن وجود ندارد.

تابع fclose

بیایید از وسط لیست 1 بگذریم و تا آخر برویم. fclose برعکس fopen را انجام می دهد: اتصال به یک فایل یا URL را می بندد. پس از اجرای این تابع، دیگر قادر به خواندن از یک فایل یا سوکت نخواهید بود.

تابع fgets

بازگشت به چند خط در فهرست 1 شما را به قلب فرآیند پردازش فایل می رساند: خواندن خود فایل. تابع fgets "سلاح" ای است که برای مثال اول انتخاب کردید. یک خط داده را از یک فایل می گیرد و آن را به عنوان یک رشته برمی گرداند. از آنجا، می توانید داده ها را خروجی یا به روش دیگری پردازش کنید. مثال در فهرست 1 کل فایل را چاپ می کند.

اگر تصمیم دارید اندازه تکه داده‌ای را که با آن کار می‌کنید محدود کنید، می‌توانید یک آرگومان به fgets اضافه کنید تا حداکثر طول رشته داده‌ای که گرفته می‌شود را محدود کنید. به عنوان مثال، از کد زیر برای محدود کردن یک رشته به 80 کاراکتر استفاده کنید:

$string = fgets($file_handle, 81);

"\0"، نشانگر پایان خط در C را به خاطر بسپارید و طول آن را یک کاراکتر بیشتر از آنچه واقعاً نیاز دارید تنظیم کنید. همانطور که می بینید، در مثال بالا زمانی که به 80 کاراکتر نیاز دارید از 81 استفاده می شود. هر زمان که نیاز به تعیین محدودیت رشته ای برای این تابع دارید، اضافه کردن یک کاراکتر اضافی را به یک عادت تبدیل کنید.

عملکرد فرید

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

و در اینجا به فرید روی می آوریم. تابع fread برای هدفی کمی متفاوت از fgets استفاده می شود: برای خواندن از فایل های باینری (یعنی فایل هایی که در اصل از متن قابل خواندن توسط انسان تشکیل نشده اند) طراحی شده است. از آنجایی که مفهوم "رشته" برای فایل های باینری مرتبط نیست (ساختارهای داده های منطقی معمولاً به خطوط تقسیم نمی شوند)، باید تعداد بایت هایی را که باید خوانده شوند را مشخص کنید.

$fh = fopen("myfile", "rb"); $data = fread($file_handle, 4096);

مثال بالا 4096 بایت (4 کیلوبایت) داده را می خواند. توجه داشته باشید که مهم نیست چه مقداری را مشخص می کنید، fread بیش از 8192 بایت (8 کیلوبایت) نخواهد خواند.

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

$fh = fopen("myfile", "rb"); $data = fread($fh, fileize("myfile")); fclose($fh);

اگر فایل بزرگتر است، باید از یک حلقه برای خواندن بقیه آن استفاده کنید.

تابع fscanf

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

لیست ($field1، $field2، $field3) = fscanf($fh، "%s %s %s");

رشته های قالب مورد استفاده در این تابع در بسیاری از منابع مانند PHP.net مستند شده اند، بنابراین من آن اطلاعات را در اینجا تکرار نمی کنم. کافی است بگوییم قالب بندی رشته ها بسیار انعطاف پذیر است. همچنین لازم به ذکر است که تمامی فیلدها در متغیر برگردانده شده توسط تابع قرار می گیرند. (در C، آنها به عنوان آرگومان ارسال می شوند.)

تابع fgetss

تابع fgetss با توابع فایل سنتی متفاوت است و به شما ایده بهتری از قابلیت های PHP می دهد. مانند fgets کار می کند، اما هر تگ HTML یا PHP را که پیدا می کند دور می اندازد و فقط متن خالی را باقی می گذارد. فایل HTML زیر را بردارید.

فهرست 2. نمونه فایل HTML
عنوان من

اگر معنی "Cause there ain" t هیچ کس برای اینکه به شما درد ندهد چیست" را می فهمید، پس بیش از حد به گروه America گوش می دهید.

اجازه دهید آن را از تابع fgetss عبور دهیم.

فهرست 3. استفاده از fgetss
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) ( echo = fgetss($file_handle); ) fclose($file_handle);

در اینجا چیزی است که به عنوان خروجی دریافت خواهید کرد:

عنوان من اگر متوجه شدید که "Cause there ain" t هیچ کس برای اینکه درد شما را نداشته باشد به چه معناست، پس بیش از حد به گروه America گوش می دهید.

تابع fpassthru

صرف نظر از نحوه خواندن داده ها از یک فایل، می توانید بقیه داده ها را با استفاده از لوله خروجی استاندارد با تابع fpassthru چاپ کنید.

fpassthru ($fh)؛

این تابع داده ها را چاپ می کند بنابراین نیازی به قرار دادن آنها در یک متغیر نیست.

پردازش غیرخطی فایل: حرکت در فایل

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

fseek ($fh, 0);

مثال بالا به ابتدای فایل باز می گردد. اگر نمی خواهید به ابتدای فایل بپرید - مثلاً یک کیلوبایت کافی است - به سادگی بنویسید:

fseek ($fh، 1024)؛

از PHP V4.0، چندین گزینه دیگر نیز موجود است. به عنوان مثال، اگر می خواهید 100 بایت از موقعیت فعلی خود به جلو پرش کنید، می توانید از کد زیر استفاده کنید:

fseek ($fh، 100، SEEK_CUR)؛

به طور مشابه، پرش 100 بایت به عقب توسط:

fseek($fh، -100، SEEK_CUR);

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

fseek($fh، -100، SEEK_END);

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

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

گرفتن کل فایل

اکنون به برخی از قابلیت های منحصر به فرد پردازش فایل PHP می پردازیم: مدیریت بلوک های بزرگ داده در یک یا دو خط. به عنوان مثال، چگونه می توانید یک فایل را بگیرید و تمام محتوای آن را در صفحه وب خود نمایش دهید؟ خوب، شما نمونه ای از استفاده از یک حلقه با fgets را مشاهده کرده اید. اما چگونه می توان آن را آسان تر کرد؟ هنگام استفاده از fgetcontents، که کل فایل را روی یک رشته قرار می دهد، فرآیند تقریباً به طرز مضحکی آسان است.

$my_file = file_get_contents ("myfilename"); echo $my_file;

اگرچه بهترین گزینه نیست، اما می توانید این دستور را حتی کوتاه تر بنویسید:

echo file_get_contents("myfilename");

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

echo file_get_contents("http://127.0.0.1/");

این دستور در واقع همان است:

$fh = fopen("http://127.0.0.1/", "r"); fpassthru ($fh)؛

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

readfile("http://127.0.0.1/");

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

@readfile("http://127.0.0.1/");

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

$array = split("\n", file_get_contents("myfile"));

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

$array = file("myfile");

لازم به ذکر است که بین دو مثال بالا تفاوت جزئی وجود دارد. دستور split خطوط جدید را حذف می کند، در حالی که دستور فایل، خطوط آرایه را با خطوط جدید پایان می دهد (درست مانند fgets).

با این حال، قابلیت های PHP بسیار فراتر از آن چیزی است که در بالا توضیح داده شد. شما می توانید کل فایل های .ini به سبک PHP را تنها با یک فرمان parse_ini_file تجزیه کنید. دستور parse_ini_file برای فایل هایی مانند Listing 4 اعمال می شود.

لیست 4. نمونه فایل .ini
; نام نظر = تلاش "شاه آرتور" = جستجوی رنگ مورد علاقه جام مقدس = آبی ساموئل کلمنس = مارک تواین کارین جانسون = ووپی گلدبرگ

دستورات زیر یک فایل را به صورت آرایه نشان می دهند و سپس آن آرایه را چاپ می کنند:

$file_array = parse_ini_file("holy_grail.ini"); print_r $file_array;

این خروجی زیر را تولید می کند:

فهرست 5. خروجی
آرایه (=> شاه آرتور => به دنبال جام مقدس => آبی => مارک تواین => ووپی گلدبرگ)

البته ممکن است متوجه شوید که این دستور بخش هایی را ادغام کرده است. این عمل پیش‌فرض است، اما می‌توانید به راحتی آن را با آرگومان دوم به parse_ini_file: process_sections که یک متغیر بولی است، سفارشی کنید. process_sections را روی True قرار دهید.

$file_array = parse_ini_file("holy_grail.ini"، true); print_r $file_array;

و خروجی شما به صورت زیر خواهد بود:

فهرست 6. خروجی
آرایه ( => آرایه ( => شاه آرتور => جستجوی جام مقدس => آبی) => آرایه ( => مارک تواین => ووپی گلدبرگ))

PHP داده ها را در یک آرایه چند بعدی قرار می دهد که به راحتی قابل تجزیه است.

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

سبک برنامه نویسی خوب

هرگز تصور نکنید که همه چیز در برنامه شما همانطور که می خواهید کار می کند. به عنوان مثال: اگر فایل مورد نظر شما منتقل شده باشد چه می شود؟ اگر در نتیجه تغییر در مجوزها، نتوانید محتوای فایل را بخوانید چه؟ با استفاده از روش های file_exists و is_readable می توانید از قبل وجود یک فایل و حقوق خواندن آن را بررسی کنید.

لیست 7. استفاده از file_exists و is_readable است
$filename = "myfile"; if (file_exists($filename) && is_readable ($filename)) ($fh = fopen($filename, "r"); # پردازش fclose($fh)؛ )

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

if ($fh = fopen($filename, "r")) (# پردازش fclose($fh)؛ )

از آنجایی که fopen در صورت شکست، False را برمی‌گرداند، این تضمین می‌کند که فایل تنها در صورتی پردازش می‌شود که فایل باز شود. البته، اگر فایل وجود نداشته باشد یا غیرقابل خواندن باشد، انتظار دارید مقدار بازگشتی منفی باشد. بنابراین چنین چکی دامی است که تمام مشکلات احتمالی در آن می افتد. همچنین، می‌توانید از برنامه برای خروج یا نمایش پیام خطا در صورت باز نشدن فایل استفاده کنید.

مانند fopen، توابع file_get_contents، file و readfile اگر فایل باز یا پردازش نشود، False را برمی‌گردانند. توابع fgets، fgetss، fread، fscanf و fclose نیز در صورت خطا، False را برمی‌گردانند. البته، به استثنای fclose، احتمالاً قبلاً نتایجی را که آنها برمی‌گردانند پردازش کرده‌اید. در مورد fclose، اگر توصیفگر فایل به درستی بسته نشده باشد، کار زیادی نمی توانید انجام دهید، بنابراین بررسی مقدار بازگشتی fclose معمولاً اضافی است.

انتخاب باشماست

PHP هیچ کمبودی در راه های کارآمد برای خواندن و تجزیه فایل ها ندارد. توابع کلاسیک مانند fread می توانند در بیشتر مواقع به خوبی به شما کمک کنند، یا در صورت نیاز برای انجام کار، ممکن است جذب سادگی فایل خواندن بیشتر شوید. انتخاب واقعاً به آنچه در تلاش برای انجام دادن هستید بستگی دارد.

اگر حجم زیادی از داده را پردازش می کنید، fscanf احتمالاً مفیدتر و کارآمدتر از مثلاً استفاده از فایل در ترکیب با دستورات تقسیم و sprintf بعدی است. از طرف دیگر، اگر فقط مقدار زیادی متن را با تغییرات جزئی نمایش می دهید، در مقابل، استفاده از فایل، file_get_contents یا توابع readfile ممکن است مناسب تر باشد. این راه حل احتمالاً هنگام استفاده از PHP برای کش کردن یا حتی ایجاد یک سرور پروکسی موقت درست است.

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

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

file_exists() و is_file().

تابع file_exists() بررسی می کند که آیا فایل داده شده وجود دارد یا خیر. اگر فایل وجود داشته باشد، تابع TRUE و در غیر این صورت FALSE را برمی گرداند. سینتکس تابع file_exists() به صورت زیر است:

bool file_exists (فایل رشته)

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

اگر (!file_exists($filename)) :

چاپ "فایل $filename وجود ندارد!";

is_file()

تابع is_file() وجود یک فایل معین و توانایی انجام عملیات خواندن/نوشتن روی آن را بررسی می کند. اساسا، is_file() نسخه قوی تری از file_exists() است که نه تنها وجود فایل را بررسی می کند، بلکه می تواند داده ها را بخواند و بنویسد:

bool is_file (فایل رشته)

مثال زیر نشان می دهد که چگونه می توان تأیید کرد که یک فایل وجود دارد و آیا می توان عملیات را روی آن انجام داد:

$file = "somefile.txt";

if (is_file ($file)):

چاپ "فایل $file معتبر است و وجود دارد!";

چاپ "فایل $file وجود ندارد یا یک فایل معتبر نیست!";

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

تابع filesize() اندازه (بر حسب بایت) فایل را با نام داده شده یا FALSE در صورت خطا برمی گرداند. سینتکس تابع fileize() به صورت زیر است:

اندازه فایل int (نام فایل رشته)

فرض کنید می خواهید اندازه فایل pastry.txt را تعیین کنید. برای بدست آوردن اطلاعات مورد نیاز می توانید از تابع fileize() استفاده کنید:

$fs = fileize("pastry.txt"); چاپ "Pastry.txt $fs بایت است.";

نتیجه زیر نمایش داده می شود:

Pastry.txt 179 بایت است.

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

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

قبل از انجام عملیات I/O روی یک فایل، باید با تابع ()fopen باز شود.

تابع fopen() فایل را باز می کند (در صورت وجود) و یک عدد صحیح را برمی گرداند - به اصطلاح دسته فایل(دسته پرونده). سینتکس تابع fopen() به صورت زیر است:

int fopen (فایل رشته، حالت رشته[، int include_path])

فایلی که باز می شود می تواند در سیستم فایل محلی قرار داشته باشد، به عنوان ورودی/خروجی استاندارد وجود داشته باشد، یا فایلی را در یک سیستم راه دور که توسط HTTP یا FTP پذیرفته شده است را نشان دهد.

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

اگر پارامتر حاوی نام یک فایل محلی باشد، تابع fopen() آن فایل را باز می کند و یک handle را برمی گرداند.

اگر پارامتر روی php://stdin، php://stdout یا php://stderr تنظیم شود، جریان ورودی/خروجی استاندارد مربوطه باز می شود.

اگر پارامتر با پیشوند http:// شروع شود، تابع یک اتصال HTTP را به سرور باز می کند و یک دسته برای فایل مشخص شده برمی گرداند.

اگر پارامتر با پیشوند ftp:// شروع شود، تابع یک اتصال FTP به سرور باز می کند و یک دسته برای فایل مشخص شده برمی گرداند. در این مورد، باید به دو مورد توجه ویژه داشته باشید: اگر سرور از حالت منفعل FTP پشتیبانی نمی کند، فراخوانی ()fopen با شکست مواجه می شود. علاوه بر این، فایل های FTP یا برای خواندن یا برای نوشتن باز می شوند.

هنگامی که در حالت غیرفعال کار می کند، سرور LR منتظر اتصالات مشتریان می ماند. هنگام کار در حالت فعال، سرور خود با مشتری ارتباط برقرار می کند. حالت پیش فرض معمولاً حالت فعال است.

پارامتر mode تعیین می کند که آیا می توان فایل را از روی آن خواند یا نوشت. روی میز. 7.1 مقادیری را فهرست می کند که حالت باز کردن فایل را تعیین می کند.

جدول 7.1. حالت های باز کردن فایل

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

اگر پارامتر سوم اختیاری include_path 1 باشد، مسیر فایل نسبت به دایرکتوری include مشخص شده در فایل php.ini است (به فصل 1 مراجعه کنید).

در زیر نمونه ای از باز کردن یک فایل با تابع ()fopen است. فراخوانی ()die، که همراه با fopen() استفاده می‌شود، در صورت باز نشدن فایل، پیام خطا را چاپ می‌کند:

$file = "userdata.txt"; // برخی از فایل ها

$fh = fopen($file, "a+") or die("فایل ($file) وجود ندارد!");

قطعه زیر یک اتصال به یک سایت PHP (http://www.php.net) را باز می کند:

$site = "http://www.php.net": // سرور قابل دسترسی از طریق HTTP

$sh = fopen($site., "r"); //دستکاری کننده را با صفحه فهرست Php.net مرتبط کنید

پس از تکمیل، فایل همیشه باید با تابع fclose() بسته شود.

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

int fclose (دستکاری کننده int)

تابع fclose() با موفقیت فقط فایل هایی را می بندد که قبلاً توسط توابع ()fopen یا fsockopen() باز شده بودند. نمونه ای از بستن یک فایل:

$file = "userdata.txt";

if (file_exists ($file)) :

$fh = fopen($file, "r");

// انجام عملیات فایل

چاپ "فایل فایل وجود ندارد!"؛

در فایل بنویسید

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

تابع is_writeable() تأیید می کند که فایل وجود دارد و قابل نوشتن است. قابلیت نوشتن هم برای فایل و هم برای دایرکتوری بررسی می شود. نحو تابع is_writeable() به صورت زیر است:

bool is_writeable (فایل رشته ای)

یک نکته مهم: PHP به احتمال زیاد تحت شناسه کاربری استفاده شده توسط وب سرور (معمولا "هیچکس") اجرا می شود. مثالی از استفاده از is_writeable() در توضیحات تابع fwrite() آورده شده است.

تابع fwrite() محتویات یک متغیر رشته را در فایل مشخص شده توسط دسته فایل می نویسد. نحو تابع fwrite() به صورت زیر است:

int fwrite (دستکاری کننده int، متغیر رشته [، طول int])

اگر یک پارامتر طول اختیاری هنگام فراخوانی تابع ارسال شود، ضبط یا پس از نوشتن تعداد مشخص شده کاراکترها یا زمانی که به انتهای رشته رسیده است متوقف می شود. بررسی توانایی نوشتن در یک فایل در مثال زیر نشان داده شده است:

// اطلاعاتی در مورد ترافیک سایت کاربر

$data = "08:13:00|12:37:12|208.247.106.187|Win98";

$filename = "somefile.txt";

// اگر فایل وجود داشته باشد و بتوان آن را نوشت

if (is_writeable ($filename)) :

$fh = fopen($filename, "a+");

// محتویات $data را در یک فایل بنویسید

$success - fwrite($fh، $data);

// بستن فایل

fclose($fh); دیگر:

چاپ "نام فایل برای نوشتن باز نشد"؛

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

تابع ()fputs نام مستعار fwrite() است و دقیقاً همان نحو را دارد. سینتکس تابع fputs() به صورت زیر است:

int fputs (دستکاری کننده int، متغیر رشته [، طول int])

من شخصا ترجیح می دهم از fputs() استفاده کنم. به خاطر داشته باشید که این فقط یک موضوع سبک است و ربطی به تفاوت بین این دو عملکرد ندارد.

خواندن از روی یک فایل

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

تابع i s_readable() به شما این امکان را می دهد که مطمئن شوید فایل وجود دارد و عملیات خواندن برای آن مجاز است. خوانایی هم برای فایل و هم برای دایرکتوری بررسی می شود. نحو تابع is_readable() به صورت زیر است:

هو is_readable (فایل رشته)

به احتمال زیاد، PHP تحت شناسه کاربری استفاده شده توسط وب سرور (معمولاً "nobody") اجرا می شود، بنابراین برای اینکه تابع is_readable() TRUE را بازگرداند، همه باید اجازه داشته باشند از فایل بخوانند. مثال زیر نشان می دهد که چگونه می توان تأیید کرد که یک فایل وجود دارد و قابل خواندن است:

if (is_readable($filename)) :

// فایل را باز کنید و نشانگر موقعیت فعلی را در انتهای فایل تنظیم کنید

$fh = fopen($filename, "r");

چاپ "$filename قابل خواندن نیست!";

تابع fread() تعداد مشخص شده بایت را از فایل مشخص شده توسط دسته فایل می خواند. نحو تابع fwrite() به صورت زیر است:

int fread (دستکاری کننده int، طول int)

دستکاری کننده باید به یک فایل قابل خواندن باز مراجعه کند (به توضیحات تابع is_readable() مراجعه کنید). خواندن پس از خواندن تعداد مشخص شده بایت یا زمانی که فایل به پایان می رسد متوقف می شود. فایل متنی pastry.txt نشان داده شده در لیست 7.1 را در نظر بگیرید. خواندن و خروجی این فایل در مرورگر توسط قطعه زیر انجام می شود:

$fh = fopen("pastry.txt"، "r") or die("نمی توان فایل را باز کرد!");

$file = fread($fh، حجم فایل($fh));

با استفاده از تابع ()fllesize برای تعیین اندازه pastry.txt بر حسب بایت، مطمئن می شوید که تابع ()fread کل محتویات فایل را می خواند.

فهرست 7.1. فایل متنی pastry.txt

دستور تهیه: خمیر شیرینی

1 1/4 فنجان آرد همه منظوره

3/4 چوب (6 قاشق غذاخوری) کره بدون نمک، خرد شده

2 قاشق غذاخوری شیرین کننده سبزیجات 1/4 قاشق چایخوری نمک

3 قاشق غذاخوری آب

تابع fgetc() رشته ای حاوی یک کاراکتر از فایل در موقعیت اشاره گر فعلی یا FALSE را در صورت رسیدن به انتهای فایل برمی گرداند. سینتکس تابع fgetc() به صورت زیر است:

رشته fgetc (دستکاری کننده int)

دستکاری کننده باید به یک فایل قابل خواندن باز مراجعه کند (توضیحات تابع is_readable() را قبلا در این فصل ببینید). مثال زیر خواندن و خروجی یک فایل کاراکتر به کاراکتر را با استفاده از تابع ()fgetc نشان می دهد:

$fh = fopen("pastry.txt"، "r"); در حالی که (!feof($fh)):

$char = fgetc($fh):

چاپ $char; بی پایان

تابع fgets () رشته خوانده شده را از موقعیت فعلی اشاره گر در فایل مشخص شده توسط filehandle برمی گرداند. نشانگر فایل باید به یک فایل قابل خواندن باز اشاره کند (توضیحات تابع is_readable() را در ابتدا در این فصل ببینید). نحو تابع fgets() :

رشته fgets (دستکاری کننده int، طول int)

خواندن زمانی متوقف می شود که یکی از شرایط زیر برآورده شود:

  • خواندن از طول فایل -- 1 بایت.
  • یک کاراکتر خط جدید از فایل (شامل رشته برگشتی) خوانده شد.
  • پایان فایل (EOF) از فایل خوانده شده است.

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

$fh = fopen("pastry.txt"، "r");

در حالی که (!feof($fh));

$line = fgets ($fh, 4096)؛

خط $ چاپ کنید. "
";

تابع fgetss () دقیقاً مشابه fgets () است با یک استثنا - سعی می کند تمام تگ های HTML و PHP را از متن خوانده شده حذف کند:

رشته fgetss (دستکاری کننده Int، طول int [، رشته مجاز_برچسب ها])

قبل از رفتن به مثال ها، نگاهی به لیست 7.2 بیندازید -- این فایل در لیست های 7.3 و 7.4 استفاده می شود.

لیست 7.2. فایل Science.html

آخرین اخبار - علم

شکل حیات بیگانه کشف شد


20 اوت 2000

اوایل صبح امروز، شکل جدیدی از قارچ در حال رشد در کمد یخچال قدیمی آپارتمان W. J. Gilmore پیدا شد. مشخص نیست که آیا تشعشعات قدرتمندی که از مانیتور رایانه مستاجر ساطع می شود به این تکامل کمک کرده است یا خیر.

لیست 7.3. حذف برچسب ها از فایل HTML قبل از نمایش در مرورگر

$fh = fopen("science.html"، "r");

در حالی که (!feof($fh)):

چاپ fgetss ($fh، 2048)؛

نتیجه در پاین نشان داده شده است. همانطور که می بینید، تمام تگ های HTML از فایل Science.html حذف شده اند و در نتیجه قالب بندی از بین می رود:

در برخی شرایط، همه تگ ها از فایل حذف می شوند، به جز برخی از آنها - به عنوان مثال، برچسب های شکست خط
. فهرست 7.4 نشان می دهد که چگونه این کار انجام می شود.

لیست 7.4. حذف انتخابی برچسب ها از یک فایل HTML

$fh = fopenC"science.html"، "r");

$allowable="
";

در حالی که (!feof($fh)):

print fgetss ($fh. 2048, $allowable);

نتیجه:

آخرین اخبار - شکل حیات بیگانه Science Alien در 20 آگوست کشف شد. 2000 اوایل صبح امروز، شکل جدیدی از قارچ در حال رشد در کمد یخچال آپارتمان قدیمی WJ Gilmore کشف شد. سیر تکاملی.

همانطور که می بینید، تابع fgetss () تبدیل فایل ها را آسان می کند، به خصوص اگر تعداد زیادی فایل HTML با فرمت مشابه داشته باشید.

خواندن یک فایل در یک آرایه

تابع file() کل محتویات یک فایل را در یک آرایه قابل نمایه سازی بارگذاری می کند. هر عنصر آرایه مربوط به یک خط از فایل است. سینتکس تابع file() به صورت زیر است:

فایل آرایه (فایل رشته[, int include_path])

اگر پارامتر سوم اختیاری include_path 1 باشد، مسیر فایل نسبت به دایرکتوری include مشخص شده در فایل php.ini است (به فصل 1 مراجعه کنید). لیست 7-5 از تابع file() برای بارگیری فایل pastry.txt استفاده می کند (به لیست 7-1 مراجعه کنید).

$file_array = file("pastry.txt");

while (list($line_num. $line) = eacht($file_array)):

چاپ" خط$line_num:"، htmlspecialchars($line)،"
\n"

هر ردیف از آرایه به همراه یک عدد خروجی می شود:

خط 0: دستور غذا: خمیر شیرینی

خط 1: 1 1/4 فنجان آرد همه منظوره

خط 2: 3/4 چوب (6 قاشق غذاخوری) کره بدون نمک، خرد شده

خط 3: 2 قاشق غذاخوری شورتنینگ سبزیجات

خط 4: 1/4 قاشق چایخوری نمک

خط 5: 3 قاشق غذاخوری آب

تغییر مسیر یک فایل به خروجی استاندارد

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

int readfile (فایل رشته[, int include_path])

تابع تعداد بایت های خوانده شده را برمی گرداند. فایل می تواند در سیستم فایل محلی قرار داشته باشد، به عنوان ورودی/خروجی استاندارد وجود داشته باشد، یا فایلی را بر روی یک سیستم راه دور که توسط HTTP یا FTP پذیرفته شده است را نشان دهد. پارامتر فایل مطابق با قوانین تابع ()fopen تنظیم می شود.

فرض کنید یک فایل latore.txt دارید که می خواهید در مرورگر نمایش دهید:

رستوران "La Torre." واقع در نتتونو، ایتالیا، ترکیبی از سبک را ارائه می دهد. تاریخ، و غذاهای دریایی خوب. در داخل دیوارهای بورگوی قرون وسطایی اطراف شهر، می‌توان در حین تماشای خرید عابران در بوتیک‌های روستا، شام خورد. راحتی همراه با تازه ترین غذاهای دریایی، La Torre را به یکی از بهترین رستوران های ایتالیا تبدیل کرده است.

هنگامی که قطعه زیر اجرا می شود، کل محتوای latorre.txt به جریان خروجی استاندارد ارسال می شود:

$restaurant_file = "latorre.txt";

// کل فایل را به خروجی استاندارد ارسال کنید

readfile($restaurant_file);

باز کردن پرونده یک فرآیند

همراه با فایل‌های معمولی، می‌توانید فایل‌هندل‌ها را برای تعامل با فرآیندهای روی سرور باز کنید. مشکل توسط تابع popen() که دارای دستور زیر است حل می شود:

int popen (فرمان رشته، حالت رشته)

پارامتر فرمان دستور سیستم را برای اجرا مشخص می کند و پارامتر mode حالت دسترسی را توصیف می کند:

// فایل "spices.txt" را برای نوشتن باز کنید

$fh = fopen("spices.txt"،"w");

// چند خط متن اضافه کنید

fputs($fh، "جعفری، مریم گلی، رزماری\n");

fputs($fh، "پاپریکا، نمک، فلفل\n");

fputs($fh، "ریحان، مریم گلی، زنجبیل\n");

// Close Manipulator

// یک فرآیند grep یونیکس را برای جستجوی کلمه Basil در spices.txt باز کنید

$fh - popen("grep ریحان< spices.txt", "r");

// خروجی grep را چاپ کنید

نتیجه به این شکل است:

ریحان، مریم گلی، زنجبیل

تابع ()fpassthru مشابه تابع passthru() است که در بخش "اجرای برنامه های خارجی" این فصل بحث شده است.

پس از اتمام تمام عملیات، فایل یا فرآیند باید بسته شود. تابع pclose() اتصال به فرآیند مشخص شده توسط دسته را می بندد، مشابه نحوه بستن تابع fclose() فایلی که توسط تابع fopen() باز می شود. نحو تابع ()pclose:

int pclose (دستکاری کننده int)

در پارامتر دستکاری کنندهدستکاری کننده ای که قبلاً از یک فراخوانی موفق ()popen به دست آمده بود، ارسال می شود.

باز کردن اتصال سوکت

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

تابع fsockopen() یک اتصال سوکت به یک سرور در اینترنت برقرار می کند

از طریق پروتکل TCP یا UDP. سینتکس تابع fsockopen() به صورت زیر است:

int fsockopen (میزبان رشته، پورت int [، کد خطای int [، متن خطای رشته [، زمان پایان ورودی]]])

پارامترهای اختیاری error_code و error_text حاوی اطلاعاتی هستند که در صورت عدم اتصال به سرور نمایش داده می شوند. هر دو پارامتر باید توسط مرجع ارسال شوند. سومین پارامتر اختیاری، timeout، مدت زمان انتظار برای پاسخ از طرف سرور (در ثانیه) را مشخص می کند. لیست 7-6 نحوه استفاده از تابع ()fsockopen را برای به دست آوردن اطلاعات در مورد سرور نشان می دهد. با این حال، قبل از نگاه کردن به لیست 7.6، یک تابع دیگر وجود دارد که باید معرفی شود، socket_set_blocking().

UDP (User Datagram Protocol) یک پروتکل ارتباطی است که اتصال گرا نیست.

socket_set_blocking()

تابع socket_set_b1ocki ng() به شما اجازه می دهد تا کنترل های زمان بندی را برای عملیات سرور تنظیم کنید:

socket_set_blocking (Int manipulator، mode boolean)

پارامتر مانیپولاتور سوکتی که قبلاً باز شده را مشخص می‌کند و پارامتر حالت حالتی را که سوکت به آن سوئیچ می‌کند (در حالت مسدود کردن، نادرست برای حالت غیر مسدود) انتخاب می‌کند. نمونه ای از استفاده از توابع fsockopen() و socket_set_blocking() در لیست 7.6 نشان داده شده است.

لیست 7.6. با استفاده از تابع fsockopen() برای دریافت اطلاعات سرور

تابع getthehost($host.$path) (

// اتصال به گره را باز کنید

$fp - fsockopen($host, 80, &$errno, &$errstr, 30);

// به حالت مسدود کردن بروید

socket_set_blocking ($fp، 1)،

// ارسال سرصفحه

fputs($fp,"GET $path HTTP/1.1\r\n");

fputs ($fp، "میزبان: $host\r\n\r\n"); $x = 1;

// هدرها را دریافت کنید

در حالی که ($x< 10) :

$headers = fgets ($fp, 4096);

// Close Manipulator

getthehost("www.apress.com"، "/");

فهرست 7.6 نتیجه زیر را ایجاد می کند:

سرور HTTP/1.1 200 OK: Microsoft-IIS/4.0 Content-location:

2000 20:25:06 GMT برچسب ET: "f0a61666dbff1bf1:34a5" طول محتوا: 1311

تابع ()pfsockopen یک نسخه ثابت از ()fsockopen است. این بدان معنی است که با پایان یافتن اسکریپتی که تابع در آن فراخوانی شده است، اتصال به طور خودکار قطع نمی شود. نحو تابع ()pfsockopen:

int pfsockopen (میزبان رشته، پورت int [، int error_code [، string error_text [، int timeout]]])

بسته به اهداف خاص برنامه شما، ممکن است استفاده از pfsockopen() به جای fsockopen() راحت تر باشد.

راه اندازی برنامه های خارجی

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

تابع exec() برنامه داده شده را اجرا می کند و آخرین خط خروجی آن را برمی گرداند. سینتکس تابع exec() به صورت زیر است:

string exec (فرمان رشته [، آرایه رشته [، بازگشت int]])

لطفاً توجه داشته باشید که تابع exec() فقط دستور را اجرا می کند و نتایج کار خود را خروجی نمی دهد. تمام خروجی های فرمان را می توان در یک پارامتر آرایه اختیاری ذخیره کرد. همچنین، اگر یک متغیر بازگشتی نیز در هنگام تعیین پارامتر آرایه مشخص شود، به دومی کد بازگشتی دستور اجرا شده اختصاص داده می شود.

فهرست 7.7 نحوه استفاده از تابع exec() را برای اجرای تابع پینگ سیستم یونیکس نشان می دهد.

لیست 7.7. بررسی ارتباط با سرور با استفاده از تابع ()exec

exec("ping -c 5 www.php.net", $ping);

// در ویندوز، exec("ping -n 5 www.php.net. $ping);

برای ($i=0; $i< count($ping);$i++) :

چاپ"
$ping[$i]";

نتیجه:

PING www.php.net (208.247.106.187): 56 بایت داده

64 بایت از 208.247.106.187: icmp_seq=0 ttl=243 time=66.602 ms

64 بایت از 208.247.106.187: icmp_seq=1 ttl=243 time=55.723 ms

64 بایت از 208.247.106.187: icmp_seq=2 ttl=243 time=70.779 ms

64 بایت از 208.247.106.187: icmp_seq=3 ttl=243 time=55.339 ms

64 بایت از 208.247.106.187: icmp_seq=4 ttl=243 time=69.865 ms

آمار پینگ www.php.net --

5 بسته ارسال شد. 5 بسته دریافت شد. 0% از دست دادن بسته

رفت و برگشت min/avg/max/stddev - 55.339/63.662/70.779/6.783 ms

بکتیک

راه دیگری برای اجرای دستورات سیستم وجود دارد که نیازی به فراخوانی توابع ندارد - فرمان اجرا شده در بکتیک (``) محصور می شود و نتایج کار آن در مرورگر نمایش داده می شود. مثال:

چاپ"

خروجی $
";

این قطعه محتوای دایرکتوری که اسکریپت در آن قرار دارد را در مرورگر چاپ می کند.

پارامتر داخلی ping -c 5 (-n 5 در سیستم ویندوز) تعداد دفعات نظرسنجی از سرور را مشخص می کند.

اگر فقط می خواهید خروجی خام یک دستور را برگردانید، از تابع passthru() که در زیر توضیح داده شده است استفاده کنید.

تابع passthru () تقریباً مانند exec () عمل می کند، با یک استثنا - به طور خودکار نتایج فرمان را خروجی می دهد. نحو تابع passthru() به صورت زیر است:

void passthru (فرمان رشته [, int return])

اگر پارامتر بازگشتی اختیاری در فراخوانی passthru() ارسال شود، این متغیر روی کد بازگشتی دستور اجرا شده تنظیم می‌شود.

escapeshellcmd()

تابع ()escapeshellcmd از تمام کاراکترهای بالقوه خطرناکی که کاربر می تواند وارد کند (به عنوان مثال، در فرم HTML) برای اجرای دستورات exec()، passthru()، system() یا ()popen می گریزد. نحو:

string escapeshellcmd (فرمان رشته)

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

$user_input = `rm -rf *`; // دایرکتوری والد و همه زیر شاخه های آن را حذف کنید

exec($user_input); // $user_input را اجرا کنید!!!

اگر اقدامات احتیاطی انجام نشود، چنین دستوری منجر به فاجعه می شود. با این حال، می توانید از توابع escapeshellcmd() برای فرار از ورودی کاربر استفاده کنید:

$user_input = `rm - rf *`; // دایرکتوری والد و همه زیر شاخه های آن را حذف کنید

exec(escapeshellcmd($user_input)); // فرار از شخصیت های خطرناک

تابع escapeshellcmd() از کاراکتر * فرار می کند و از عواقب فاجعه بار اجرای دستور جلوگیری می کند.

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

کار با فایل سیستم

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

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

نام پایه رشته (نام کامل رشته)

انتخاب نام فایل پایه از نام کامل به صورت زیر انجام می شود:

$path = "/usr/local/phppower/htdocs/index.php"; $file = basename($path); // $file = "index.php"

در واقع این تابع مسیر را از نام کامل حذف می کند و فقط نام فایل را باقی می گذارد.

تابع getlastmod() آخرین تاریخ و زمان تغییر صفحه ای که تابع از آن فراخوانی شده است را برمی گرداند. نحو تابع getlastmod() به صورت زیر است:

int getlastmod (باطل)

مقدار برگشتی با فرمت تاریخ/زمان یونیکس مطابقت دارد و می توانید از تابع date() برای قالب بندی آن استفاده کنید. قطعه زیر تاریخ آخرین تغییر صفحه را چاپ می کند:

echo "آخرین تغییر: ".date("H:i:s a". getlastmod());

تابع stat() یک آرایه قابل نمایه سازی را با اطلاعات دقیق در مورد فایل با نام داده شده برمی گرداند:

آرایه آمار (نام فایل رشته)

اطلاعات زیر در عناصر آرایه برگردانده می شود:

0 دستگاه

2 حالت حفاظت از گره شاخص

3 تعداد پیوندها

4 شناسه کاربری مالک

5 شناسه گروه مالک

6 نوع دستگاه Inode

7 اندازه بر حسب بایت

8 زمان آخرین دسترسی

9 زمان آخرین اصلاح

10 آخرین زمان اصلاح

11 اندازه بلوک برای ورودی/خروجی در سیستم فایل

12 تعداد بلوک های اختصاص داده شده

بنابراین، اگر می خواهید بدانید آخرین بار چه زمانی به فایل دسترسی داشته اید، به عنصر 8 آرایه برگشتی نگاه کنید. یک مثال را در نظر بگیرید:

$file - "datafile.txt";

لیست ($dev، $inode، $inodep، $nlink، $uid، $gid، $inodev، $size، $atime، $mtime، $ctime،

$bsize) = stat ($file);

چاپ "$file $size بایت است.
";

چاپ "آخرین زمان دسترسی: $atime
";

چاپ "آخرین زمان اصلاح: $mtime
";

نتیجه:

popen.php 289 بایت است.

آخرین زمان دسترسی: 15 اوت 2000 ساعت 12:00:00

آخرین زمان اصلاح: 15 اوت 2000، 10:07:18 صبح

در این مثال، من از ساختار list() برای نامگذاری هر مقدار بازگشتی استفاده کرده ام. البته، شما می توانید به خوبی یک آرایه را برگردانید، عناصر را حلقه بزنید و تمام اطلاعات مورد نیاز خود را نمایش دهید. همانطور که می بینید، تابع stat() به شما اجازه می دهد تا اطلاعات مفید مختلفی در مورد یک فایل دریافت کنید.

نمایش و تغییر ویژگی های فایل ها

هر فایل در سیستم های خانواده یونیکس دارای سه ویژگی مهم است:

  • متعلق به یک گروه؛
  • مالک؛
  • مجوزها

همه این ویژگی ها را می توان با استفاده از توابع مناسب PHP تغییر داد. ویژگی های توضیح داده شده در این بخش در سیستم های خانواده ویندوز کار نمی کند.

اگر با سیستم عامل های یونیکس تازه کار هستید، اطلاعات مربوط به ویژگی های سیستم فایل یونیکس را می توانید در http://sunsite.auc.dk/linux-newbie/FAQ2.htm بیابید. موضوعات مالکیت گروهی، مالکیت و مجوزها در بخش 3.2.6 پوشش داده شده است.

تابع chgrp() سعی می کند گروهی را که فایل داده شده به آن تعلق دارد تغییر دهد. نحو تابع chgrp():

int chgrp (نام فایل رشته، گروه ترکیبی)

تابع filegroup() شناسه گروه صاحب فایل را با نام داده شده یا FALSE در صورت خطا برمی گرداند. سینتکس تابع filegroup() به صورت زیر است:

گروه فایل int (نام فایل رشته)

تابع chmod() مجوزهای یک فایل با نام داده شده را تغییر می دهد. نحو تابع chmod() به صورت زیر است:

int chmod (نام فایل رشته، مجوزهای int)

مجوزها به صورت اکتال مشخص شده اند. مشخصات تنظیم پارامتر تابع chmod () در مثال زیر نشان داده شده است:

chmod("data_file.txt"، g+r); // کار نمی کند

chmod("data_file.txt"، 766); // کار نمی کند

chmod("data_file.txt"، 0766); // کار کردن

تابع fileperms () مجوزهای فایل را با نام داده شده یا خطای FALSE برمی گرداند. سینتکس تابع fileperms() به صورت زیر است:

int fileperms (نام فایل رشته)

تابع chown() سعی می کند مالک یک فایل را تغییر دهد. حق تغییر مالک یک فایل فقط به یک کاربر ممتاز داده می شود. نحو تابع chown() به صورت زیر است:

int chown (نام فایل رشته، کاربر مختلط)

تابع fileowner() شناسه کاربری را برای صاحب فایل با نام داده شده برمی گرداند. سینتکس تابع fileowner() به صورت زیر است:

مالک فایل int (نام فایل رشته)

کپی و تغییر نام فایل ها

سایر عملکردهای مفید سیستم که اسکریپت های PHP می توانند انجام دهند شامل کپی و تغییر نام فایل ها در سرور است. این عملیات توسط دو تابع copy() و rename() انجام می شود.

کپی کردن یک فایل در یک اسکریپت PHP به اندازه استفاده از دستور cp یونیکس آسان است. مشکل با تابع copy() PHP حل می شود. نحو تابع copy() به صورت زیر است:

کپی int (منبع رشته، مقصد رشته)

تابع copy() سعی می کند فایل منبع را در فایل مقصد کپی کند. در مورد موفقیت TRUE، در صورت شکست FALSE را برمی گرداند. اگر فایل مقصد وجود نداشته باشد، تابع copy() آن را ایجاد می کند. مثال زیر نحوه پشتیبان گیری از یک فایل را با استفاده از تابع copy() نشان می دهد:

$data_file = "data.txt";

copy($data_file. $data_file".bak") یا die("نمی توان $data_file را کپی کرد");

تابع rename() یک فایل را تغییر نام می دهد. در موفقیت TRUE، در شکست FALSE را برمی‌گرداند. نحو تابع rename():

تغییر نام bool (رشته old_name، رشته new_name)

مثالی از تغییر نام یک فایل با تابع ()rename:

$data_file = "data.txt";

تغییر نام ($data file, $datafile".old") یا die ("نام فایل $data تغییر نام داده نشد");

حذف فایل ها

تابع unlink () فایلی با نام داده شده را حذف می کند. نحو:

int unlink (فایل رشته)

اگر با PHP روی یک سیستم ویندوز کار می کنید، هنگام استفاده از این تابع مشکلاتی وجود دارد. در این مورد، می توانید از تابع system() که در بالا توضیح داده شد استفاده کنید و فایل را با دستور DOS del حذف کنید:

system("del filename.txt");

کار با دایرکتوری ها

توابع PHP به شما این امکان را می دهند که محتویات دایرکتوری ها را مشاهده کرده و در میان آنها پیمایش کنید. فهرست 7-8 یک ساختار دایرکتوری یونیکس معمولی را نشان می دهد.

لیست 7.8. ساختار دایرکتوری معمولی

تابع dirname() مکمل basename() -- مسیر را از نام فایل کاملا واجد شرایط استخراج می کند. نحو تابع dirname():

نام رشته (مسیر رشته)

مثالی از استفاده از dirname() برای استخراج یک مسیر از یک نام کاملا واجد شرایط:

$path = "/usr/locla/phppower/htdocs/index.php";

$file = dirname($path); // $file = "usr/local/phppower/htdocs"

تابع dirname() گاهی همراه با متغیر $SCRIPT_FILENAME برای دریافت مسیر کامل اسکریپتی که دستور از آن اجرا می شود استفاده می شود:

$dir - dirname($SCRIPT_FILENAME);

تابع is_dir() بررسی می کند که آیا فایل با نام داده شده یک دایرکتوری است یا خیر:

bool is_dir (نام فایل رشته)

مثال زیر از ساختار دایرکتوری فهرست 7.8 استفاده می کند:

$ isdir = is_dir("index.html"); // FALSE را برمی‌گرداند

$isdir = is_dir("کتاب"); // TRUE را برمی گرداند

تابع mkdir() همانند دستور یونیکس با همین نام عمل می کند - یک دایرکتوری جدید ایجاد می کند. سینتکس تابع mkdir() به صورت زیر است:

int mkdir (مسیر رشته، حالت int)

پارامتر path مسیر ایجاد دایرکتوری جدید را مشخص می کند. فراموش نکنید که پارامتر را با نام دایرکتوری جدید پایان دهید! پارامتر mode مجوزهای اختصاص داده شده به دایرکتوری ایجاد شده را تعیین می کند.

همانطور که تابع ()fopen یک دسته را برای یک فایل معین باز می کند، تابع opendir نیز یک دسته را برای یک دایرکتوری باز می کند. سینتکس تابع opendir() به صورت زیر است:

int opendir (مسیر رشته)

تابع ()closedir دسته دایرکتوری ارسال شده به عنوان پارامتر را می بندد. نحو تابع ()closedir:

void closeir(int directory_manipulator)

تابع readdir() عنصر بعدی دایرکتوری داده شده را برمی گرداند. نحو:

string readdir(int directory_manipulator)

با استفاده از این تابع، می توانید به راحتی تمام فایل ها و زیر شاخه ها را در فهرست فعلی فهرست کنید:

$dh = opendir(" .);

در حالی که ($file = readdir($dh)) :

چاپ "$file
"؛ پایان

تابع chdir () درست مانند دستور cd یونیکس کار می کند، به این ترتیب که به دایرکتوری مشخص شده توسط پارامتر تغییر می کند. نحو تابع ()chdir:

int chdir (دایرکتوری رشته ای)

در مثال زیر به دایرکتوری کتاب/فرعی رفته و محتوای آن را نمایش می دهیم:

$newdir = "کتاب";

chdir($newdir) or die("نمی توان به دایرکتوری تغییر داد ($newdir)"); $dh = opendir(" . ");

while ($file = readdir($dh)) ;

چاپ "$file
";

تابع rewlnddir() نشانگر موقعیت فعلی را در ابتدای دایرکتوری باز شده توسط تابع opendir() تنظیم می کند. نحو تابع rewinddir():

void rewinddir(int dir_nipulator)

پروژه 1: یک ضربه شمار ساده

اسکریپت ارائه شده در این بخش تعداد بازدیدها را برای صفحه ای که در آن قرار دارد می شمارد. قبل از رفتن به کد در لیست 7-9، الگوریتم نوشته شده در شبه کد را مرور کنید:

  1. متغیر $access را به نام فایلی که مقدار شمارنده را ذخیره می کند، تنظیم کنید.
  2. از تابع file() برای خواندن محتوای $access در آرایه $visits استفاده کنید. پیشوند @ قبل از نام تابع، خطاهای احتمالی را سرکوب می کند (به عنوان مثال، عدم وجود فایلی با نام داده شده).
  3. متغیر $current_visitors را روی مقدار اولین (و تنها) عنصر آرایه $visits تنظیم کنید.
  4. ارزش $current_visitors را 1 افزایش دهید.
  5. فایل $access را برای نوشتن باز کنید و نشانگر موقعیت فعلی را روی ابتدای فایل تنظیم کنید.
  6. مقدار $current_visitors را در فایل $access بنویسید.
  7. بازکننده مربوط به فایل $access را ببندید.

لیست 7.9. شمارشگر ضربه ساده

// سناریو: شمارنده ضربه ساده

// هدف: ذخیره تعداد بازدیدها در فایل

$access = "hits.txt"; // نام فایل به صورت دلخواه انتخاب می شود

$current_visitors = $visits; // اولین (و تنها) عنصر را بازیابی کنید

++$current_visitors; // افزایش تعداد ضربه ها

$fh = fopen($access. "w"); // فایل hits.txt را باز کرده و تنظیم کنید

// اشاره گر به موقعیت فعلی در ابتدای فایل

@fwrite($fh، $current_visitors);// مقدار شمارنده جدید بنویسید

// برای فایل "hits.txt"

fclose($fh); // دسته فایل "hits.txt" را ببندید

پروژه 2: ساخت نقشه سایت

اسکریپت در لیست 7-10 یک نقشه سایت ایجاد می کند، یک نمایش سلسله مراتبی از تمام پوشه ها و فایل های روی سرور، که از یک فهرست مشخص شروع می شود. هنگام محاسبه padding عناصر تشکیل دهنده نقشه سایت، از توابع تعریف شده در این فصل و فصل قبل استفاده می شود. قبل از شروع برنامه، الگوریتم نوشته شده در شبه کد را مرور کنید:

  1. متغیرهای سرویس را برای ذخیره دایرکتوری والد، نام فایل گرافیکی با تصویر پوشه، نام صفحه و پرچم سیستم عامل سرور (ویندوز یا سیستم دیگر) اعلام کنید.
  2. یک تابع display_directory() که محتویات یک دایرکتوری را می خواند و آن را برای نمایش در مرورگر قالب بندی می کند، اعلام کنید.
  3. مسیر دایرکتوری را با الحاق نام ارسال شده در متغیر $dir1 با $dir بسازید.
  4. دایرکتوری را باز کنید و محتویات آن را بخوانید. نام دایرکتوری ها و فایل ها را فرمت کرده و در مرورگر نمایش دهید.
  5. اگر فایل فعلی یک دایرکتوری است، تابع display_directory() را به صورت بازگشتی فراخوانی کرده و نام دایرکتوری جدید را برای نمایش ارسال کنید. تورفتگی استفاده شده هنگام قالب بندی خروجی را محاسبه کنید.

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

لیست 7.10. برنامه sitemap.php

// فایل: sitemap.php

// هدف: ساخت نقشه سایت

// دایرکتوری که از آن می توان ساخت نقشه را شروع کرد

$beg_path = "C:\Program FilesVApache Group\Apache\htdocs\phprecipes";

// فایل با یک تصویر گرافیکی از پوشه.

// مسیر باید نسبی* به دایرکتوری ریشه سرور آپاچی باشد

$folder_location = "C:\My Documents\PHP for Programmers\FINAL CHPS\graphics\folder.gif";

// متن در عنوان پنجره $page_name = "PHPRecipes SiteMap";

// در کدام سیستم از اسکریپت استفاده می شود - لینوکس یا ویندوز؟

// (0 - ویندوز؛ 1 - لینوکس)

$usingjinux = 0;

// تابع: display_directory

// هدف: خواندن محتویات دایرکتوری مشخص شده توسط پارامتر

// $dir1 و سپس قالب بندی سلسله مراتب دایرکتوری ها و فایل ها.

// تابع را می توان به صورت بازگشتی فراخوانی کرد.

تابع display_directory ($dir1، $folder_location، $using_linux، $init_depth) (

// مسیر به روز رسانی

sdh = opendir($dir);

while($file = readdir($dh)) :

// عناصر دایرکتوری "." و ".." خروجی نیستند.

if (($file != ".") && ($file != "..")) :

اگر ($using_linux == 0) :

$depth = explode("\\", $dir): else:

$depth = explode("/", $dir); endif; $curtent_depth = sizeof($depth);

// مسیر را طبق قوانین سیستم عامل مورد استفاده بسازید. اگر ($using_linux == 0) :

$tab_depth = $current_deptn - $init_depth;

$file = $dir. "\\", $file; دیگر:

$file = $dir. "/",$file; endif;

// آیا متغیر $file حاوی دایرکتوری است؟ if (dir($file)) است:

// محاسبه padding

در حالی که ($x< ($tab_depth * 2)) :

$x++; بی پایان

چاپ"

".basename($file)."
";

// شمارنده افزایشی

// فراخوانی بازگشتی به تابع display_directory().

display_directory ($file، $folder_location، $using_linux، $init_depth);

// دایرکتوری نیست

// مسیر را طبق قوانین مورد استفاده بسازید

// سیستم عامل.

اگر ($using_linux == 0) :

$tab_depth = ($current_depth - $init_depth) - 2; $x = 0;

// محاسبه padding

در حالی که ($x< (($tab_depth * 2) + 5)) :

چاپ" ".basename($file)."
";

چاپ" ".basename($file)."
";

endif; // Is_dir(پرونده) endif: // اگر ! "." یا ".."

// بستن دایرکتوری closeir($dh);

<? print "$page_name"; ?>

// محاسبه padding اولیه

اگر ($using_linux == 0) :

$depth = explode("\\", $beg_path);

$depth = explode("/", $beg_path);

$init_depth = sizeof($depth);

display_directory ($beg_path، $folder_location، $using_linux، $init_depth);

روی انجیر شکل 7.1 خروجی اسکریپت یک کاتالوگ را با چندین فصل در این کتاب نشان می دهد.

برنج. 7.1. نمایش ساختار دایرکتوری روی سرور با استفاده از اسکریپت sitemap.php

نتایج

در این فصل بسیاری از ابزارهای PHP برای کار با فایل ها معرفی شده است. به ویژه سؤالات زیر را در نظر گرفتیم:

  • بررسی وجود فایل ها؛
  • باز کردن و بستن فایل ها و جریان های ورودی/خروجی؛
  • نوشتن روی یک فایل و خواندن از آن؛
  • تغییر مسیر فایل به جریان خروجی؛
  • راه اندازی برنامه های خارجی؛
  • عملیات سیستم فایل

مطالب این فصل زمینه را برای فصل بعدی، رشته ها و عبارات با قاعده فراهم می کند، زیرا پردازش رشته و عملیات I/O در توسعه برنامه های کاربردی وب بسیار مرتبط هستند.

آخرین به روز رسانی: 1.11.2015

مانند بسیاری از زبان های برنامه نویسی، PHP از فایل ها پشتیبانی می کند که یکی از راه های ذخیره سازی اطلاعات است.

خواندن و نوشتن فایل ها

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

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

    "r" : فایل به صورت فقط خواندنی باز می شود. اگر فایل وجود نداشته باشد، false را برمی گرداند

    "r+" : فایل به صورت فقط خواندنی و قابل نوشتن باز می شود. اگر فایل وجود نداشته باشد، false را برمی گرداند

    "w" : فایل برای نوشتن باز می شود. اگر چنین فایلی از قبل وجود داشته باشد، بازنویسی می شود، اگر نه، آنگاه ایجاد می شود.

    "w+" : فایل برای نوشتن با خوانایی باز می شود. اگر چنین فایلی از قبل وجود داشته باشد، بازنویسی می شود، اگر نه، آنگاه ایجاد می شود.

    "a" : فایل برای نوشتن باز می شود. اگر چنین فایلی از قبل وجود داشته باشد، داده ها در انتهای فایل نوشته می شوند و داده های قدیمی باقی می مانند. اگر فایل وجود نداشته باشد، ایجاد می شود

    "a+" : فایل برای خواندن و نوشتن باز می شود. اگر فایل از قبل وجود داشته باشد، داده ها به انتهای فایل اضافه می شوند. اگر فایل وجود نداشته باشد، ایجاد می شود

نتیجه تابع fopen یک توصیفگر فایل است. این دسته برای عملیات روی فایل و برای بستن آن استفاده می شود.

پس از اتمام، فایل باید با استفاده از تابع fclose() بسته شود که یک توصیفگر فایل را به عنوان پارامتر می گیرد. به عنوان مثال، اجازه دهید یک فایل را باز و بسته کنیم:

$fd = fopen("form.php"، "r") یا die("فایل باز نشد"); fclose($fd);

ساختار or die ("متن خطا") به شما این امکان را می دهد که اسکریپت را خاتمه دهید و اگر تابع fopen نتواند فایل را باز کند، پیام خطا را نمایش دهید.

خواندن یک فایل

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

هر بار که fgets() را فراخوانی می کنید، PHP یک اشاره گر را در انتهای رشته خوانده شده قرار می دهد. برای ردیابی پایان یک فایل، از تابع feof() استفاده می شود که با پایان یافتن فایل، مقدار true را برمی گرداند. و تا پایان فایل می توانیم از تابع fgets() استفاده کنیم.

خواندن کل فایل

در این حالت، نیازی نیست که فایل را به صراحت باز کنیم، یک دسته بگیریم و سپس فایل را ببندیم.

مسدود کردن خواندن

شما همچنین می توانید یک خواندن بلوک به بلوک انجام دهید، یعنی تعداد معینی از بایت ها را از یک فایل با استفاده از تابع fread() بخوانید:

تابع fread() دو پارامتر دارد: توصیفگر فایل برای خواندن و تعداد بایت هایی که باید خوانده شوند. هنگام خواندن یک بلوک، نشانگر فایل به انتهای این بلوک منتقل می شود. و همچنین با کمک تابع feof () می توانید تکمیل فایل را پیگیری کنید.

فایل بنویس

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

تابع دیگر fputs() به طور مشابه کار می کند:

کار با نشانگر فایل

هنگام باز کردن فایل برای خواندن یا نوشتن در حالت "w"، نشانگر فایل در ابتدا قرار می گیرد. هنگام خواندن داده ها، PHP نشانگر فایل را به انتهای بلوک داده های خوانده شده منتقل می کند. با این حال، ما همچنین می توانیم به صورت دستی نشانگر را در فایل دستکاری کرده و آن را در یک مکان دلخواه تنظیم کنیم. برای این کار باید از تابع استفاده کنید fseek، که دارای تعریف رسمی زیر است:

int fseek (منبع $handle , int $offset [, int $whence = SEEK_SET ])

پارامتر $handle یک دسته فایل را نشان می دهد. پارامتر $offset مقداری است که بر حسب بایت نسبت به ابتدای فایلی که خواندن/نوشتن از آن شروع می شود، فاصله دارد. سومین پارامتر اختیاری نحوه تنظیم افست را مشخص می کند. می تواند سه مقدار داشته باشد:

    SEEK_SET: مقدار پیش‌فرض، مقدار افست را بر روی بایت‌های آفست از ابتدای فایل تنظیم می‌کند

    SEEK_CUR : افست را به گونه ای تنظیم می کند که بایت ها را نسبت به شروع موقعیت فعلی در فایل تغییر دهد.

    SEEK_END : افست را به گونه ای تنظیم می کند که بایت های انتهای فایل را جایگزین کند

اگر نشانگر با موفقیت تنظیم شود، تابع fseek () 0 و در صورت شکست -1 را برمی‌گرداند.

مثالی از استفاده از تابع:

$fd = fopen("hello.txt"، "w+") or die("فایل باز نشد"); $str = "سلام دنیا!"; // رشته برای نوشتن fwrite ($fd, $str); // رشته را در ابتدای fseek بنویسید($fd, 0); // نشانگر فایل را در ابتدای fwrite قرار دهید ($fd, "Oink"); // خط را در ابتدای fseek بنویسید($fd, 0, SEEK_END); // نشانگر را در انتهای fwrite قرار دهید ($fd, $str); // یک خط دیگر در انتهای fclose($fd) بنویسید.

برترین مقالات مرتبط