Робота з файлами в PHP
Перевірка існування та розміру файлу
Відкриття та закриття файлів
Запис у файл
Читання з файлу
Безсумнівно, читання є найголовнішою операцією, яка виконується з файлами. Нижче описані деякі функції, що підвищують ефективність читання з файлу. Синтаксис цих функцій практично точно копіює синтаксис аналогічних функцій запису.
is_readable ()
Функція i s_readable () дозволяє переконатися в тому, що файл існує і для нього дозволена операція читання. Можливість читання перевіряється як для файлу, так і для каталогу. Синтаксис функції is_readable ():
bool is_readable (string файл]
Швидше за все, PHP буде працювати під ідентифікатором користувача, використовуваним web-сервером (як правило, «nobody»), тому для того щоб функція is_readable () повертала TRUE, читання з файлу повинна бути дозволено всім бажаючим. Наступний приклад показує, як переконатися в те, що файл існує і доступний для читання:
if (is_readable ($ filename)): // Відкрити файл і встановити покажчик поточної позиції у кінець файлу $ Fh = fopen ($ filename, "r"); else: print "$ filename is not readable!"; endif;
fread ()
Функція fread () читає з файлу, заданого файловим маніпулятором, задану кількість байт. Синтаксис функції fwrite ():
int fread (int маніпулятор, int довжина)
Маніпулятор має посилатися на відкритий файл, доступний для читання (див. опис функції is_readable ()). Читання припиняється після прочитання заданої кількості байт або при досягненні кінця файлу. Розглянемо текстовий файл pastry.txt, наведений у лістингу 1. Читання і вивід цього файлу в браузері здійснюється наступним фрагментом:
$ Fh = fopen ('pastry.txt', "r") or die ("Can't open file!"); $ File = fread ($ fh, filesize ($ fh)); print $ file; fclose ($ fh);
Використовуючи функцію fіlesize () для визначення розміру pastry.txt в байтах, ви гарантуєте, що функція fread () прочитає весь вміст файлу.
Лістинг 1. Текстовий файл pastry.txt
Recipe: Pastry Dough 1 1 / 4 cups all-purpose flour 3 / 4 stick (6 tablespoons) unsalted butter, chopped 2 tablespoons vegetable shortening 1 / 4 teaspoon salt 3 tablespoons water
fgetc ()
Функція fgetc () повертає рядок, що містить один символ з файлу у поточній позиції вказівника, або FALSE при досягненні кінця файлу. Синтаксис функції fgetc ():
string fgetc (int маніпулятор)
Маніпулятор має посилатися на відкритий файл, доступний для читання (див. опис функції is_readable () раніше в цьому розділі). У наступному прикладі продемонстровані посимвольне читання і вивід файлу з використанням функції fgetc ():
$ Fh = fopen ("pastry.txt", "r"); while (! Feof ($ fh)): $ Char = fgetc ($ fh): print $ char; endwhile; fclose ($ fh);
fgets ()
Функція fgets () повертає рядок, прочитану від поточної позиції вказівника у файлі, що визначається файловим маніпулятором. Файловий покажчик повинен посилатися на відкритий файл, доступний для читання (див. опис функції is_readable () раніше в цьому розділі). Синтаксис функції fgets ():
string fgets (int маніпулятор, int довжина)
Читання припиняється при виконанні однієї з наступних умов:
• з файлу прочитано довжина - 1 байт;
• з файлу прочитаний символ нового рядка (включається в рядок, що повертається);
• з файлу прочитаний ознака кінця файлу (EOF).
Якщо ви хочете організувати Прогресивне читання файлу, передайте в другому параметрі значення, що свідомо перевищує кількість байт в рядку. Приклад прогресивного читання і виведення файлу:
$ Fh = fopen ("pastry.txt", "r"); while (! feof ($ fh)); $ Line = fgets ($ fh, 4096); print $ line. "<br>"; endwhile; fclose ($ fh):
fgetss ()
Функція fgetss () повністю аналогічна fgets () за одним винятком - вона намагається видаляти з прочитаного тексту всі теги HTML і PHP:
string fgetss (Int маніпулятор, int довжина [, string розширення_тегу])
Перш ніж переходити до прикладів, ознайомтеся з вмістом лістингу 2 - цей файл використовується в лістингу 3 та 4.
Лістинг 2. Файл science.html
<html> <head> <title> Breaking News - Science </title> <body> <h1> Alien lifeform discovered </h1> <br> <b> August 20. 2000 </b> <br> Early this morning, a strange new form of fungus was found growing in the closet of WJ Gilmore's old apartment refrigerator. It is not known if powerful radiation emanating from the tenant's computer monitor aided in this evolution.<br/> </Body> </Html>
Лістинг З. Видалення тегів з файлу HTML перед відображенням у браузері
<? $ Fh = fopen ("science.html", "r"); while (! feof ($ fh)): print fgetss ($ fh, 2048); endwhile; fclose ($ fh); ?>
Результат наведено нижче. Як бачите, з файлу science.html були вилучені всі теги HTML, що призвело до втрати форматування:
Breaking News - Science Alien lifeform discovered August 20. 2000 Early this morning, a strange new form of fungus was found growing in the closet of WJ Gilmore's old apartment refrigerator. It is not known if powerful radiation emanating from the tenant's computer monitor aided in this evolution.
У деяких ситуаціях з файлу видаляються всі теги, крім деяких - наприклад, тегів розриву рядків. Лістинг 4 показує, як це робиться.
Лістинг 4. Вибіркове видалення тегів з файлу HTML
<? $ Fh = fopenC'science. Html "," r "); $ Allowable = "<br>"; while (! feof ($ fh)): print fgetss ($ fh. 2048, $ allowable); endwhile; fclose ($ fh); ?>
Результат:
Breaking News - Science Alien lifeform discovered August 20. 2000 Early this morning, a strange new form of fungus was found growing in the closet of WJ Gilmore's old apartment refrigerator. It is not known if powerful radiation emanating from the tenant's computer monitor aided in this evolution.
Як бачите, функція fgetss () спрощує перетворення файлів, особливо за наявності великої кількості файлів HTML, відформатованих схожим чином.
Читання файлу в масив
Функція file () завантажує весь вміст файлу в індексованих масив. Кожен елемент масиву відповідає одному рядку файлу. Синтаксис функції filе ():
array file (string файл [, int включення_шляху])
Якщо необов'язковий третій параметр включення_шляху дорівнює 1, то шлях до файлу визначається по відношенню до каталогу включення файл, вказаною у файлі php.ini. У лістингу 5 функція file () використовується для завантаження файлу pastry.txt (див. лістинг 1).
Лістинг 5. Завантаження файлу pastry.txt функцією file ()
<? $ File_array = file ("pastry.txt"); while (list ($ line_num. $ line) = eacht ($ file_array)): print "<b> Line $ line_num: </ b>", htmlspecialchars ($ line), "<br> \ n" endwhile; ?>
Кожен рядок масиву виводиться разом з номером:
Line 0: Recipe: Pastry Dough Line 1: 1 1 / 4 cups all-purpose flour Line 2: 3 / 4 stick (6 tablespoons) unsalted butter, chopped Line 3: 2 tablespoons vegetable shortening Line 4: 1 / 4 teaspoon salt Line 5: 3 tablespoons water
Перенаправлення файлу в стандартний вихідний потік
Функція readfile () читає вміст файлу і направляє його в стандартний вивід (у більшості випадків - в браузер). Синтаксис функції readfile ():
int readfile (string файл [, int включення_шляху])
Функція повертає кількість прочитаних байтів. Файл може знаходитися в локальній файловій системі, існувати у вигляді стандартного потоку вводу / виводу або представляти файл у віддаленій системі, що приймається засобами HTTP або FTP. Параметр файл задається за тими ж правилами, що і у функції fopen ().
Припустимо, у вас є файл latorre.txt, вміст якого ви хочете вивести в браузері:
Restaurant "La Тоrrе." located in Nettuno, Italy, offers an eclectic blend of style. history, and fine seafood cuisine.
Within the walls of the medieval borgo surrounding the city, one can dine while watching the passersby shop in the
village boutiques. Comfort coupled with only the freshest seafare make La Torre one of Italy's finest restaurants.
При виконанні наступного фрагмента весь вміст latorre.txt направляється в стандартний вихідний потік:
<? $ Restaurant_file = "latorre.txt"; // Направити весь файл у стандартний вихідний потік readfile ($ restaurant_filе); ?>