Робота з файлами в PHP
Зміст
Перевірка існування та розміру файлу
Перш ніж намагатися працювати з файлом, бажано переконатися в тому, що він існує. Для вирішення цього завдання зазвичай використовуються дві функції:
file_exists () і is_file ().
file_exists ().
Функція filе_ехists () перевіряє, чи існує заданий файл. Якщо файл існує, функція повертає TRUE, в іншому випадку повертається FALSE. Синтаксис функції file_exists ():
bool file_exists (string файл)
Приклад перевірки існування файлу:
if (! file_exists ($ filename)): print "File $ filename does not exist!"; endif:
is_file ()
Функція is_file () перевіряє існування заданого файлу і можливість виконання з ним операцій читання / запису. По суті, is_file () являє собою більш надійну версію file_exists (), яка перевіряє не тільки факт існування файлу, але і те, чи підтримує він читання і запис даних:
bool is_file (string файл)
Наступний приклад показує, як переконатися в існуванні файлу і можливості виконання операцій з ним:
$File = "somefile.txt"; if (is_file ($file)): print "The file $ file is valid and exists!"; else: print "The file $ file does not exist or it is not a valid file!"; endif:
Переконавшись у тому, що потрібний файл існує, і з ним можна виконувати різні операції читання / запису, можна переходити до наступного кроку - відкриття файлу.
filesize ()
Функція filesize () повертає розмір (в байтах) файлу з заданим ім'ям або FALSE в разі помилки. Синтаксис функції filesize ():
int filesize (string ім'я_файлу)
Припустимо, ви хочете визначити розмір файлу pastry.txt. Для отримання потрібної інформації можна скористатися функцією filesize ():
$Fs = filesize ("pastry.txt"); print "Pastry.txt is $Fs bytes.";
Виводиться наступний результат:
Pastry.txt is 179 bytes.
Перш ніж виконувати операції з файлом, необхідно відкрити його і пов'язати з файловим маніпулятором, а після завершення роботи з файлом його слід закрити.
Відкриття та закриття файлів
Перш ніж виконувати операції вводу / виводу з файлом, необхідно відкрити його функцією fopen ().
fopen ()
Функція fopen () відкриває файл (якщо він існує) і повертає ціле число - так званий файловий маніпулятор (file handle). Синтаксис функції fopen ():
int fopen (string файл, string режим [, int включення_шляху])
Відкриває файл може знаходитися в локальній файловій системі, існувати у вигляді стандартного потоку вводу / виводу або представляти файл у віддаленій системі, що приймається засобами HTTP або FTP.
Параметр файл може здаватися в декількох формах, перерахованих нижче:
• Якщо параметр містить ім'я локального файлу, функція fopen () відкриває цей файл і повертає маніпулятор.
• Якщо параметр заданий у вигляді php: / / stdin, php: / / stdout або php: / / stderr, відкривається відповідний стандартний потік вводу / виводу.
• Якщо параметр починається з префікса http://, функція відкриває підключення HTTP до сервера і повертає маніпулятор для зазначеного файлу.
• Якщо параметр починається з префікса ftp://, функція відкриває підключення FTP до сервера і повертає маніпулятор для зазначеного файлу. У цьому випадку слід звернути особливу увагу на дві обставини: якщо сервер не підтримує пасивний режим FTP, виклик fopen () завершується невдачею. Більш того, FTP-файли відкриваються або для читання, або для запису.
При роботі в пасивному режимі сервер &!!&!!&!!&&&!!&&&&&&&ЯР&&&&&!!&&&!!&!!&!!&& очікує підключення з боку клієнтів. При роботі в активному режимі сервер сам встановлює з'єднання з клієнтом. За замовчуванням звичайно використовується активний режим.
Параметр режим визначає можливість виконання читання і запису у файл. У табл. 1 перераховані деякі значення, що визначають режим відкриття файлу.
Режим | Опис |
---|---|
r | Файл відкривається тільки для читання. Якщо файлу не існує, виклик реєструє помилку. Після успішного відкриття вказівник файлу встановлюється на його перший байт, тобто на початок. |
r + | Файл відкривається одночасно для читання та запису. Вказівник поточної позиції встановлюється в початок файлу, тобто на перший байт. Якщо файлу не існує повертається false. Якщо в момент запису вказівник файлу встановлено приміром в середину файлу, то дані запишуться прямо поверх існуючих, а не розсунуть їх, при необхідності збільшивши розмір файлу. |
w | Тільки запис. Покажчик поточної позиції встановлюється в початок файлу, а весь вміст файлу знищується. Якщо файл не існує, функція намагається створити його. |
w + | Читання і запис. Покажчик поточної позиції встановлюється в початок файлу, а весь вміст файлу знищується. Якщо файл не існує, функція намагається створити його. |
a | Відкриває існуючий файл тільки для запису. Покажчик поточної позиції встановлюється в кінець файлу. Якщо файл не існує, функція намагається створити його. |
a + | Відкриває файл для читання та запису. Покажчик поточної позиції встановлюється в кінець файлу, при цьому вміст файлу не знищується. Якщо файл не існує, функція створює його. Ця функція є корисною, якщо потрібно дописати в файл, але не відомо, чи існує файл. |
Якщо необов'язковий третій параметр включення_шляху дорівнює 1, то шлях до файлу визначається по відношенню до каталогу включення файл, вказаною у файлі php.
Нижче наведено приклад відкриття файлу функцією fopen (). Виклик die (), який використовується у поєднанні з fopen (), забезпечує вивід повідомлення про помилку в тому випадку, якщо відкрити файл не вдасться:
$File = "userdata.txt"; // Певний файл $Fh = fopen ($ file, "a +") or die ("File ($file) does not exist!");
Наступний фрагмент відкриває підключення до сайту PHP (http://www.php.net):
$Site = "http://www.php.net": / / Сервер, доступний через HTTP $Sh = fopen ($site., "R"); / / Зв'язати маніпулятор з індексного сторінкою Php.net
Після завершення роботи файл завжди слід закривати функцією fclose ().
fclose ()
Функція fclose () закриває файл із заданим маніпулятором. При успішному закриття повертається TRUE, при невдачі - FALSE. Синтаксис функції fclose ():
int fclose (int маніпулятор)
Функція fclose () успішно закриває лише ті файли, які були раніше відкриті функціями fopen () або fsockopen (). Приклад закриття файлу:
$File = "userdata.txt"; if (file_exists ($file)): $Fh = fopen ($file, "r"); // Виконати операції з файлом fclose ($fh); else: print "File Sfile does not exist!"; endif;
Запис у файл
З відкритими файлами виконуються дві основні операції - читання і запис.
is_writeable ()
Функція is_writeable () дозволяє переконатися в тому, що файл існує і для нього дозволена операція запису. Можливість запису перевіряється як для файлу, так і для каталогу. Синтаксис функції is_writeable ():
bool is_writeable (string файл)
Одна важлива обставина: швидше за все, PHP буде працювати під ідентифікатором користувача, використовуваним web-сервером (як правило, «nobody»). Приклад використання is_writeable () наведено в описі функції fwrite ().
fwrite ()
Функція fwrite () записує вміст строкової змінної в файл, заданий файловим маніпулятором. Синтаксис функції fwrite ():
int fwrite (int маніпулятор, string мінлива [, 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); else: print "Could not open Sfilename for writing"; endif; ?>
Функція fputs () є псевдонімом fwrite () і може використовуватися всюди, де використовується fwrite ().
fputs ()
Функція fputs () є псевдонімом fwrite () і має точно такий же синтаксис. Синтаксис функції fputs ():
int fputs (int маніпулятор, string мінлива [, int довжина])
Читання з файлу
Безсумнівно, читання є найголовнішою операцією, яка виконується з файлами. Нижче описані деякі функції, що підвищують ефективність читання з файлу. Синтаксис цих функцій практично точно копіює синтаксис аналогічних функцій запису.
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е);
Відкриття файлового маніпулятора процесу
popen ()
Поряд зі звичайними файлами можна відкривати файлові маніпулятори для взаємодії з процесами на сервері. Завдання вирішується функцією рореn (), яка має наступний синтаксис:
int popen (string команда, string режим)
Параметр команда визначає виконувану системну команду, а параметр режим описує режим доступу:
<? // Відкрити файл "spices.txt" для запису $ Fh = fopen ("spices.txt", "w"); // Додати кілька рядків тексту fputs ($ fh, "Parsley, sage, rosemary \ n"); fputs ($ fh, "Paprika, salt, pepper \ n"); fputs ($ fh, "Basil, sage, ginger \ n"); // Закрити маніпулятор fclose ($ fh); / / Відкрити процес UNIX grep для пошуку слова Basil у файлі spices.txt $ Fh - popen ("grep Basil <spices.txt", "r"); // Вивести результат роботи grep fpassthru ($ fh); ?>
Результат виглядає так:
Basil, sage, ginger
Функція fpassthru () є аналогом функції passthru (), що розглядається у розділі «Запуск зовнішніх програм.
pclose ()
Після виконання всіх операцій файл або процес необхідно закрити. Функція pclose () закриває з'єднання з процесом, заданим маніпулятором, за аналогією з тим, як функція fclose () закриває файл, відкритий функцією fopen (). Синтаксис функції pclose ():
int pclose (int маніпулятор)
У параметрі маніпулятор передається маніпулятор, отриманий раніше при успішному виклик рореn ().
Відкриття з'єднання через соkет
PHP не обмежується взаємодією з файлами і процесами - ви також можете встановлювати з'єднання через сокети. Сокет (socket) являє собою програмну абстракцію, що дозволяє встановлювати зв'язок з різними службами іншого комп'ютера.
fsockopen ()
Функція fsockopen () встановлює сокет з'єднання з сервером в Інтернеті через протокол TCP або UDP. Синтаксис функції fsockopen ():
int fsockopen (string вузол, int порт [, int код_помилки [, string текст_ помилки [, int тайм-аут]]])
Необов'язкові параметри код_помилки і текст_помилки містять інформацію, яка буде виводитися у разі невдачі при підключенні до сервера. Обидва параметра повинні передаватися по посиланню. Третій необов'язковий параметр, тайм-аут, задає тривалість очікування відповіді від сервера (в секундах). У лістингу 6 продемонстровано застосування функції fsockopen () для отримання інформації про сервер. Однак перед розглядом лістингу 6 необхідно познайомитися ще з однією функцією - socket_set_blocking ().
UDP (User Datagram Protocol) - комунікаційний протокол, не орієнтована на з'єднання.
socket_set_blocking ()
Функція socket_set_b1ocki ng () дозволяє встановити контроль над тайм-аутом для операцій з сервером:
socket_set_blocking (int маніпулятор, boolean режим)
Параметр маніпулятор задає відкритий раніше сокет, а параметр режим вибирає режим, в котрий перемикається сокет (TRUE для блокуючого режиму, FALSE для неблокуючого режиму). Приклад використання функції fsockopen( ) та socket_set_blocking( ) наведено в лістингу 6.
Лістинг 6. Використання функції fsockopen() для отримання інформації про сервер
<? function 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: $host\r\n\r\n"); $x = 1; // Отримати заголовки while($x < 10) : $headers = fgets ($fp, 4096); print $headers; $x++; endwhile; // Закрити маніпулятор fclose($fp); ) getthehost("www. apress.com", "/"); ?>
В результаті виконання лістингу 6 виводиться наступний результат:
НТТР/1.1 200 OK Server: Microsoft-IIS/4.0 Content-location: http://www.apress.com/0efault.htm Date: Sat. 19 Aug 2000 23:03:25 GMT Content-Type: text/html Accept-Ranges: bytes Last-Modified: Wed. 19 Jul 2000 20:25:06 GMT ETag: "f0a61666dbff1bf1:34a5" Content-Length: 1311
pfsockopen( )
Функція pfsockopen( ) представляє собою стійку (persistent) версію fsockopen( ). Це означає, що з’єднання не буде автоматично розірвано по закінченню сценарію в якому була викликана функція. Синтаксис функції pfsockopen( ):
int pfsockopen (string вузол, int порт [, int код_помилкии [, string текст _помилки [, int тайм-аут]]])
В залежності від конкретних цілей вашого додатку може стати зручнішим використання pfsockopen( ) замість fsockopen( ).
Як створити новий файл і записати в нього щось?
Як прочитати вміст текстового файлу цілком?
Як прочитати вміст текстового файлу порядково?
Як додати інформацію в початок файлу?
Як видалити рядок з файлу?
Як надіслати файл користувачеві?
Як отримати масив файлів у каталозі з певним розширенням?
Як вивести випадкову рядок з файлу?
Як записати файл у певному кодуванні?
Як відредагувати певну рядок у файлі?
Як "обнулити" (очистити) вміст файлу?
http://base.vingrad.ru/view/2843-Rabota-s-faylami-v-PHP-FAQ
Как создать новый файл и записать в него что-то?
Как прочитать содержимое текстового файла целиком?
Как прочитать содержимое текстового файла построчно?
Как добавить информацию в начало файла?
Как удалить строчку из файла?
Как послать файл пользователю?
Как получить массив файлов в каталоге с определенным расширением?
Как вывести случайную строку из файла?
Как записать файл в определенной кодировке?
Как отредактировать определенную строчку в файле?
Как "обнулить" (очистить) содержимое файла?