5. Робота з файлами в PHP
Первинні вкладки
Зараз ми розглянемо найкорисніші функції:
1 2 3 4 5 | file_exists («test.txt») // існує файл filesize («test.txt») // дізнатися розмір файлу fileatime («test.txt») // дата останнього звернення до файлу filemtime («test.txt») // дата зміни файлу filectime («test.txt») // дата створення файлу |
Наприклад, на сервері є файл data_set.txt. Вміст файлу:
1 2 3 4 5 | Color one Color two Color three Color four Color five |
З файлами ми можемо працювати по-різному. Зараз ми детально розглянемо, як це робити. Для початку нам треба відкрити файл, прочитати, записати щось, а потім закрити.
У цьому випадку нам знадобиться функція відкриття файлу в PHP - fopen (filename, mode), куди ми передаємо файл, який ми відкриваємо і другим параметром якийсь режим роботи.
Режим роботи представляє з себе рядок у вигляді однієї літери.
- r - відкрити файл лише для читання;
- r + - відкрити файл для читання і запису;
- w - відкрити файл лише для запису. Якщо він існує, то поточний вміст файлу знищується. Поточна позиція встановлюється в початок;
- w + - відкрити файл для читання і запису. Якщо він існує, то поточний вміст файлу знищується. Поточна позиція встановлюється в початок;
- a - відкрити файл для запису. Поточна позиція встановлюється в кінець файлу;
- a + - відкрити файл для читання і запису. Поточна позиція встановлюється в кінець файлу;
- b - обробляти бінарний файл. Цей прапор необхідний при роботі з бінарними файлами в OC Windows;
Алгоритм відкриття і закриття файлу:
1 2 3 4 5 6 | <? php $ f = fopen ("data_set.txt", "r") or die ("Не вдається відкрити файл!"); // Тут працюємо з файлом // Закриваємо файл fclose ($ f); ?> |
По суті, можна і не закривати файл, він закриється сам, однак за специфікацією, якщо потрібно щось закрити, то це краще закрити. Як ви думаєте, що потрапляє в змінну $ f? Число? Не зовсім. Воно схоже на число, але це не число. Це той самий тип, який ми ще не розглядали - це тип ресурс (resource), тобто, грубо кажучи, це покажчик на цей файл або його ще називають - дескриптор відкритого файлу або просто дескриптор.
Читати ми можемо за допомогою функції fread («file», length). Туди ми передаємо дескриптор файлу і довжину рядки:
Якщо ж нам потрібно прочитати файл в PHP цілком, то ми це можемо зробити двома шляхами:
- це вказати у функції fread () другим параметром свідомо більше число, ніж сам файл:
1 2 3 4 5 | <?php $f = fopen("data_set.txt", "r") or die(“Не вдається відкрити файл!”); echo fread($f, 1000); fclose($f); ?> |
- використовувати функцію filesize ():
1 2 3 4 5 | <?php $f = fopen("data_set.txt", "r") or die(“Не вдається відкрити файл!”); echo fread($f, filesize("data_set.txt")); fclose($f); ?> |
Можна зачитати файл рядками.
1 2 3 4 5 | <? php $ f = fopen ("data_set.txt", "r") or die ("Не вдається відкрити файл!"); echo fgets ($ f); // Виведе Color one echo fgets ($ f); // Виведе Color two fclose ($ f); |
Кожен виклик функції fgets () зачитує рівно один рядок.
Є ще одна чудова функція, яка називається fgetss (). Суть її роботи полягає в тому, що вона читає текст, укладений в HTML теги і повертає його вже без HTML тегів. Сюди також передається дескриптор відкритого файлу, що не обов'язковий другий параметр - це довжина рядка і, якщо ми хочемо зберегти якісь теги, тобто теги, які ця функція не повинна вирізати, то третім параметром ми вказуємо ці теги, якщо їх декілька, то указувати їх треба без пробілів і ком, тобто разом, один за іншим. Ця функція так само читає файл построчно.
Далі, ми можемо зачитувати файл посимвольно. За допомогою функції fgetc ().
1 2 3 4 5 | <? php $ f = fopen ("data_set.txt", "r") or die ("Не вдається відкрити файл!"); echo fgetc ($ f); fclose ($ f); ?> |
Записувати ми можемо за допомогою двох функцій, вірніше одної, інша її синонім. Ось ці функції: fwrite () і fputs (). Тут все те ж саме - передаємо дескриптор файлу і сам рядок, який хочемо записати, ну і третій, необов'язковий параметр, ми можемо обмежити довжину записуваного рядка:
1 2 3 4 5 | <?php $f = fopen("data_set.txt", "a+") or die(“Не удается открыть файл!”); fputs($f, "TEST"); fclose($f); ?> |
В реальному житті ми в файлах можемо управляти курсором, пересувати його туди, куди нам треба. У PHP можемо робити те ж саме за допомогою функції fseek (). Ця функція приймає три параметри. У першому параметрі - дескриптор файлу, в другому параметрі - offset і в третьому - whence (offset - це кількість символів, на які потрібно пересунутися. Воно може бути, як позитивним, тоді ми рухаємося вперед, так і негативним, тоді ми рухаємося назад. whence - це одна з трьох констант, які ми можемо використовувати):
1 2 3 | SEEK_SET // рух починається з початку файлу SEEK_CUR // рух йде від поточної позиції SEEK_END // рух йде від кінця файлу |
Дізнатися, де знаходиться курсор, можна за допомогою функції ftell ($ f), куди передається тільки дескриптор файлу.
Пересунути курсор в самий початок або ще кажуть, скинути курсор, можна за допомогою функції rewind ($ f), куди також передається дескриптор файлу.
Ще одна дуже корисна функція, яку ми будемо використовувати досить часто - це функція feof ($ f). Ця функція говорить нам - чи дійшли ми до кінця файлу або не дійшли. Вона завжди повертає false і тільки в одному випадку повертається true - тоді, коли ми дочитали до кінця файл.
Те, що ми зараз розглянули - це досить детальна робота з файлами в PHP. Проте в реальності, як правило, нам буває потрібно просто зчитати файл, ну і іноді записати туди ж.
Тому нам необхідні команди для прямої роботи з даними, коли PHP основну роботу зробить за нас.
І перша така функція - це функція file (filename). Ця функція зачитує файл рядками в масив.
Тобто ми отримуємо масив, де в кожному елементі лежить рядок:
1 2 3 4 5 6 7 8 9 10 | <? php $ arr = file ("data_set.txt"); print_r ($ arr); / * Це все не потрібно. PHP це робить все за нас. $ f = fopen ("data_set.txt", "a +") or die ("Не вдається відкрити файл!"); echo fread ($ f, 1000); fclose ($ f); * / ?> |
Тепер ми просто працюємо з масивом:
1 2 3 4 5 6 | <? php $ arr = file ("data_set.txt"); foreach ($ arr as $ line) { echo $ line. "<br>"; } ?> |
Далі, можна зчитати весь файл в PHP повністю у вигляді одного рядка, тобто весь файл повертається просто у вигляді одного рядка. Робиться це за допомогою дуже часто використовуваної функції file_get_contents (filename):
1 2 3 4 | <?php $arr = file_get_contents("data_set.txt"); echo $arr; ?> |
За допомогою функції file_put_contents (filename, текст, FILE_APPEND). Якщо не вказати третій параметр-константу FILE_APPEND, тоді у насвідбудеться перезаписування файлу.
Ця константа говорить про те, що дані потрібно записати в кінець файлу:
1 2 3 | <?php file_put_contents("data_set.txt", "\nColor BLUE", FILE_APPEND); ?> |
Коли ми працюємо через функцію file_put_contents () і якщо файлу не існує, PHP намагається його створити. Як правило він його створює. Він може його не створити, тільки в тому випадку, якщо на нього немає прав. В іншому він його створить. Однак, коли ми користуємося функцією file () і файлу не існує, то вилетить помилка! Щоб уникнути помилки, завжди перевіряйте файл на наявність через функції file_exists (filename):
1 2 3 4 5 | <? php if (file_exists ("data_set.txt")) { щось робимо ... } ?> |
Йдемо далі. Ми так само можемо: копіювати файли, перейменовувати файли і видаляти файли. Робиться це за допомогою таких функцій:
1 2 3 | copy (filename, destination) // копіювання файлу rename (oldname, newname) // перейменування файлу unlink (filename) // видалення файлу |