Як правильно читати файли за допомогою PHP PHP: читання PHP-файлу. Робота з файлами в PHP: читання, запис та рекомендації

Перш ніж намагатися працювати з файлом, бажано переконатися, що він існує. Для вирішення цього завдання зазвичай використовуються дві функції:

file_exists() та is_file().

Функція f ilе_ехists () перевіряє, чи існує заданий файл. Якщо файл існує, функція повертає TRUE, інакше повертається FALSE. Синтаксис функції file_exists():

bool file_exists(string файл)

Приклад перевірки існування файлу:

if (! file_exists ($filename)) :

print "File $filename не існує!";

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!";

print "Це файл $file не існує або він не є дійсним файлом!";

Переконавшись у тому, що файл існує і з ним можна виконувати різні операції читання/запису, можна переходити до наступного кроку - відкриття файлу.

Функція filesize() повертає розмір (в байтах) файлу із заданим ім'ям або FALSE у разі помилки. Синтаксис функції filesize():

int filesize(string ім'я_файлу)

Припустимо, що ви хочете визначити розмір файлу pastry.txt. Для отримання потрібної інформації можна скористатися функцією filesize():

$fs = filesize("pastry.txt"); print "Pastry.txt is $fs bytes.";

Виводиться наступний результат:

Pastry.txt є 179 bytes.

Перш ніж виконувати операції з файлом, необхідно відкрити його та зв'язати з файловим маніпулятором, а після завершення роботи з файлом його слід закрити. Ці теми розглядаються у наступному розділі.

Відкриття та закриття файлів

Перш ніж виконувати операції введення/виведення з файлом, необхідно відкрити його функцією 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-файли відкриваються або для читання або для запису.

При роботі в пасивному режимі сервер ЯР очікує на підключення з боку клієнтів. Працюючи в активному режимі сервер сам встановлює з'єднання з клієнтом. За промовчанням зазвичай використовується активний режим.

Параметр режим визначає можливість читання та запису у файл. У табл. 7.1 наведено деякі значення, що визначають режим відкриття файлу.

Таблиця 7.1. Режими відкриття файлу

Режим Опис
Лише читання. Вказівник поточної позиції встановлюється на початок файлу
r+ Читання та запис. Вказівник поточної позиції встановлюється на початок файлу
w Лише запис. Вказівник поточної позиції встановлюється на початок файлу, а весь вміст файлу знищується. Якщо файл не існує, функція намагається створити його
w+ Читання та запис. Вказівник поточної позиції встановлюється на початок файлу, а весь вміст файлу знищується. Якщо файл не існує, функція намагається створити його
a Лише запис. Вказівник поточної позиції встановлюється на кінець файлу. Якщо файл не існує, функція намагається створити його
a+ Читання та запис. Вказівник поточної позиції встановлюється на кінець файлу. Якщо файл не існує, функція намагається створити його

Якщо необов'язковий третій параметр включення_шляху дорівнює 1, то шлях до файлу визначається по відношенню до каталогу файлів, що включаються, вказаному у файлі php.ini (див. розділ 1).

Нижче наведено приклад відкриття файлу функцією fopen(). Виклик die(), що використовується у поєднанні з fopen(), забезпечує висновок повідомлення про помилку в тому випадку, якщо відкрити файл не вдасться:

$file = "userdata.txt"; // Деякий файл

$fh = fopen($file, "a+") або die("File ($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");

// Виконати операції із файлом

print "File Sfile не існує!";

Запис у файл

З відкритими файлами виконуються дві основні операції - читання та запис.

Функція is_writeable() дозволяє переконатися в тому, що файл існує і для нього дозволено операцію запису. Можливість запису перевіряється як файлу, так каталога. Синтаксис функції is_writeable():

bool is_writeable (string файл)

Одна важлива обставина: швидше за все, PHP працюватиме під ідентифікатором користувача, який використовується web-сервером (як правило, "nobody"). Приклад використання is_writeable() наведено в описі функції 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 "Коли не Open Sfilename for writing";

Функція fputs() є псевдонімом fwrite() і може бути використана всюди, де використовується fwrite().

Функція fputs() є псевдонімом fwrite() і має такий самий синтаксис. Синтаксис функції fputs():

int fputs(int маніпулятор, string змінна [, int довжина])

Особисто я волію використовувати fputs(). Слід пам'ятати, що це лише питання стилю, ніяк не пов'язане з будь-якими відмінностями між двома функціями.

Читання з файлу

Безперечно, читання є найголовнішою операцією, що виконується з файлами. Нижче наведено деякі функції, які підвищують ефективність читання з файлу. Синтаксис цих функцій практично копіює синтаксис аналогічних функцій запису.

Функція i s_readable() дозволяє переконатися, що файл існує і йому дозволена операція читання. Можливість читання перевіряється як файлу, так каталога. Синтаксис функції is_readable():

boo! is_readable (string файл)

Швидше за все, PHP працюватиме під ідентифікатором користувача, використовуваним web-сервером (зазвичай, «nobody»), тому щоб функція is_readable() повертала TRUE, читання з файлу має бути дозволено всім бажаючим. Наступний приклад показує, як переконатися, що файл існує і доступний для читання:

if (is_readable($filename)) :

// Відкрити файл і встановити покажчик поточної позиції на кінець файлу

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

print "$filename is not readable!";

Функція fread() читає із файлу, заданого файловим маніпулятором, задану кількість байт. Синтаксис функції fwrite():

int fread(int маніпулятор, int довжина)

Маніпулятор повинен посилатися на відкритий файл, доступний читання (див. опис функції is_readable()). Читання припиняється після прочитання заданої кількості байт або при досягненні кінця файлу. Розглянемо текстовий файл pastry.txt, наведений у лістингу 7.1. Читання та виведення цього файлу в браузері здійснюється наступним фрагментом:

$fh = fopen("pastry.txt", "r") або die("Can"t open file!");

$ file = fread ($ fh, filesize ($ fh));

Використовуючи функцію fllesize() для визначення розміру pastry.txt у байтах, ви гарантуєте, що функція fread() прочитає весь вміст файлу.

Лістинг 7.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() повертає рядок, що містить один символ із файлу в поточній позиції покажчика, або FALSE при досягненні кінця файлу. Синтаксис функції fgetc():

string fgetc (int маніпулятор)

Маніпулятор повинен посилатися на відкритий файл, доступний для читання (див. опис функції is_readable() раніше у цьому розділі). У наступному прикладі продемонстровано посимвольне читання та виведення файлу з використанням функції fgetc():

$fh = fopen("pastry.txt", "r"); while (! feof($fh)) :

$char = fgetc($fh):

print $char; endwhile;

Функція fgets() повертає рядок, прочитаний від поточної позиції покажчика у файлі, який визначається файловим маніпулятором. Файловий покажчик має посилатися на відкритий файл, доступний читання (див. опис функції is_readable() раніше у розділі). Синтаксис функції fgets():

string fgets (int маніпулятор, int довжина)

Читання припиняється при виконанні однієї з наступних умов:

  • з файлу прочитано довжину - 1 байт;
  • з файлу прочитано символ нового рядка (включається у рядок, що повертається);
  • з файлу прочитано ознаку кінця файлу (EOF).

Якщо ви бажаєте організувати строкове читання файлу, передайте у другому параметрі значення, що явно перевищує кількість байт у рядку. Приклад рядкового читання та виведення файлу:

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

while (! feof ($ fh));

$ line = fgets ($ fh, 4096);

print $line. "
";

Функція fgetss() повністю аналогічна fgets() за одним винятком - вона намагається видаляти з прочитаного тексту всі теги HTML та PHP:

string fgetss (Int маніпулятор, int довжина [, string дозволені_теги])

Перш ніж перейти до прикладів, ознайомтеся зі змістом лістингу 7.2 - цей файл використовується в лістингах 7.3 та 7.4.

Лістинг 7.2. Файл science.html

Breaking News - Science

Alien lifeform discovered


August 20. 2000

Досить це продовження, на нову форму fungus був піднесений зростаючий в closet of W. J. Gilmore"s old apartment refrigerator. It is not known if powerful radiation emanating from the tenant"s computer monitor aided in this evolution.

Лістинг 7.З. Видалення тегів з HTML-файлу перед відображенням у браузері

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

while (! feof($fh)) :

print fgetss ($ fh, 2048);

Результат наведено нижче. Як бачите, з файлу science.html були видалені всі теги HTML, що призвело до втрати форматування:

У деяких ситуаціях з файлу видаляються всі теги, крім деяких - наприклад, тегів розриву рядків
. Лістинг 7.4 показує, як це робиться.

Лістинг 7.4. Вибіркове видалення тегів із файлу HTML

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

$allowable = "
";

while (! feof($fh)) :

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

Результат:

Breaking News - Science Alien lifeform discovered August 20. 2000 Початок цього варення, на нову форму fungus був піднесений зростаючий в closet of W. J. Gilmore"s old apartment refrigerator. monitor aided in this evolution.

Як бачите, функція fgetss() спрощує перетворення файлів, особливо за наявності великої кількості файлів HTML, відформатованих подібним чином.

Читання файлу в масив

Функція file() завантажує весь вміст файлу в індексований масив. Кожен елемент масиву відповідає одному рядку файлу. Синтаксис функції file ():

array file (string файл [, int включення_шляху])

Якщо необов'язковий третій параметр включення_шляху дорівнює 1, то шлях до файлу визначається по відношенню до каталогу файлів, що включаються, вказаному у файлі php.ini (див. розділ 1). У лістингу 7.5 функція file() використовується для завантаження файлу pastry.txt (див. листинг 7.1).

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

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

print " Line $line_num:", htmlspecialchars($line), "
\n"

Кожен рядок масиву виводиться разом із номером:

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е." розташований в Nettuno, Italy, offececlectic blend of style. history, and fine seafood cuisine. З walls of medieval borgo surrounding the city, one can dine while watching the passersby shop in village boutiques. Комфортний помешкання з тільки čerstvим seafare make La Torre є одним з Італії з finest restaurants.

При виконанні наступного фрагмента весь вміст latorre.txt надсилається у стандартний вихідний потік:

$restaurant_file = "latorre.txt";

// Направити весь файл до стандартного вихідного потоку

readfile($restaurant_filе);

Відкриття файлового маніпулятора процесу

Поряд із звичайними файлами можна відкривати файлові маніпулятори для взаємодії з процесами на сервері. Завдання вирішується функцією роре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");

// Закрити маніпулятор

// Відкрити процес UNIX grep для пошуку слова Basil у файлі spices.txt

$fh - popen("grep Basil"< spices.txt", "r");

// Вивести результат роботи grep

Результат виглядає так:

Basil, sage, ginger

Функція fpassthru() є аналогом функції passthru(), що розглядається у розділі "Запуск зовнішніх програм" цього розділу.

Після виконання всіх операцій, файл або процес необхідно закрити. Функція pclose() закриває з'єднання з процесом, заданим маніпулятором, за аналогією до того, як функція fclose() закриває файл, відкритий функцією fopen(). Синтаксис функції pclose():

int pclose (int маніпулятор)

У параметрі маніпуляторпередається маніпулятор, отриманий раніше за успішного виклику рореn().

Відкриття з'єднання через сокет

PHP не обмежується взаємодією з файлами та процесами - ви також можете встановлювати з'єднання через сокети. Сокет(Socket) являє собою програмну абстракцію, що дозволяє встановлювати зв'язок з різними службами іншого комп'ютера.

Функція fsockopen() встановлює з'єднання з сервером в Інтернеті.

через протокол TCP чи UDP. Синтаксис функції fsockopen():

int fsockopen (string вузол, int порт [, int код_помилки [, string текст_помилки [, int тайм-аут]]]))

Необов'язкові параметри код_помилки та текст_помилки містять інформацію, яка буде виводитися у разі невдачі при підключенні до сервера. Обидва параметри мають передаватися за посиланням. Третій необов'язковий параметр, тайм-аут, визначає тривалість очікування відповіді від сервера (в секундах). У лістингу 7.6 показано застосування функції fsockopen() для отримання інформації про сервер. Однак перед розглядом лістингу 7.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() наведено у лістингу 7.6.

Лістинг 7.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);

// Закрити маніпулятор

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

В результаті виконання лістингу 7.6 виводиться наступний результат:

НТТР/1.1 200 OK Server: Microsoft-IIS/4.0 Content-location:

2000 20:25:06 GMT ETag: "f0a61666dbff1bf1:34a5" Content-Length: 1311

Функція pfsockopen() є стійкою (persistent) версією fsockopen(). Це означає, що з'єднання не буде розірвано автоматично після завершення сценарію, в якому була викликана функція. Синтаксис функції pfsockopen():

int pfsockopen (string вузол, int порт [, int код_помилки [, string текст _помилки [, int тайм-аут]]]))

Залежно від конкретних цілей вашої програми може бути зручніше використовувати pfsockopen() замість fsockopen().

Запуск зовнішніх програм

Сценарії PHP також можуть виконувати програми на сервері. Така можливість особливо часто використовується при адмініструванні системи через веб-браузер, а також для зручнішого отримання інформації про систему.

Функція ехес() запускає задану програму та повертає останній рядок її вихідних даних. Синтаксис функції ехес():

string exec (string команда [, string масив [, int повернення]])

Зверніть увагу: функція ехес() лише виконує команду, не виводячи результатів її роботи. Усі вихідні дані команди можна зберегти у необов'язковому параметрі масив. Крім того, якщо при заданому параметрі масив також задається змінне повернення, останній надається код повернення виконаної команди.

Лістинг 7.7 показує, як використовувати функцію ехес() для виконання системної функції UNIX ping.

Лістинг 7.7. Перевірка зв'язку з сервером із застосуванням функції ехес()

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

// У Windows - exec("ping-n 5 www.php.net. $ ping);

for ($i=0; $i< count($ping);$i++) :

print "
$ping[$i]";

Результат:

PING www.php.net (208.247.106.187): 56 data bytes

64 bytes від 208.247.106.187: icmp_seq=0 ttl=243 time=66.602 ms

64 bytes від 208.247.106.187: icmp_seq=1 ttl=243 time=55.723 ms

64 bytes від 208.247.106.187: icmp_seq=2 ttl=243 time=70.779 ms

64 bytes від 208.247.106.187: icmp_seq=3 ttl=243 time=55.339 ms

64 bytes від 208.247.106.187: icmp_seq=4 ttl=243 time=69.865 ms

www.php.net ping statistics -

5 пакетів transmitted. 5 пакетів отриманий. 0% packet loss

round-trip min/avg/max/stddev - 55.339/63.662/70.779/6.783 ms

Зворотні апострофи

Існує і інший спосіб виконання системних команд, що не вимагає виклику функцій, - команда, що виконується, полягає в зворотні апострофи (``), а результати її роботи відображаються в браузері. Приклад:

print "

$output
";

Цей фрагмент виводить у браузер вміст каталогу, де знаходиться сценарій.

Внутрішній параметр ping -з 5 (-п 5 у Windows) задає кількість опитувань сервера.

Якщо потрібно просто повернути неформатовані результати виконання команди, скористайтеся функцією passthru(), описаною нижче.

Функція passthru() працює майже так само, як ехес(), за одним винятком - вона автоматично виводить результати виконання команди. Синтаксис функції passthru():

void passthru(string команда [, int повернення])

Якщо під час виклику passthru() передається необов'язковий параметр повернення, цій змінній надається код повернення виконаної команди.

escapeshellcmd()

Функція escapeshellcmd() екранує всі потенційно небезпечні символи, які можуть бути введені користувачем (наприклад, на формі HTML) для виконання команд exec(), passthru(), system() або рореn(). Синтаксис:

string escapeshellcmd (string команда)

До введення користувача завжди слід ставитися з певною часткою обережності, але навіть у цьому випадку користувачі можуть вводити команди, які будуть виконуватися функціями запуску системних команд. Розглянемо наступний фрагмент:

$user_input = `rm -rf*`; // Видалити батьківський каталог та всі його підкаталоги

ехес($user_input); // Виконати $user_input !!!

Якщо не вжити жодних запобіжних заходів, така команда призведе до катастрофи. Втім, можна скористатися функціями escapeshellcmd() для екранування введення користувача:

$user_input = `rm - rf*`; // Видалити батьківський каталог та всі його підкаталоги

ехес(escapeshellcmd($user_input)); // Екранувати небезпечні символи

Функція escapeshellcmd() екранує символ *, запобігаючи катастрофічним наслідкам виконання команди.

Безпека є одним із найважливіших аспектів програмування в середовищі Web, тому я присвятив цілий розділ цієї теми та її відношенню до програмування PHP. За додатковою інформацією звертайтесь до розділу 16.

Робота з файловою системою

У PHP існують функції для перегляду та виконання різних операцій із файлами на сервері. Інформація про атрибути серверних файлів (місцезнаходження, власник та привілеї) часто буває корисною.

Функція basename() виділяє ім'я файлу з переданого повного імені. Синтаксис функції basename():

string basename(string повне_ім'я)

Виділення базового імені файлу з повного імені відбувається так:

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

Фактично, ця функція видаляє з повного імені шлях і залишає тільки ім'я файлу.

Функція getlastmod() повертає дату та час останньої модифікації сторінки, з якої функція викликається. Синтаксис функції getlastmod():

int getlastmod(void)

Значення, що повертається, відповідає формату дати/часу UNIX, і для його форматування можна скористатися функцією date(). Наступний фрагмент виводить дату останньої модифікації сторінки:

echo "Last modified: ".date("H:i:s a". getlastmod());

Функція stat() повертає індексований масив з детальною інформацією про файл із заданим ім'ям:

array stat(string ім'я_файлу)

В елементах масиву повертається така інформація:

0 Будівництво

2 Режим захисту індексного вузла

3 Кількість посилань

4 Ідентифікатор користувача власника

5 Ідентифікатор групи власника

6 Тип пристрою індексного вузла

7 Розмір у байтах

8 Час останнього звернення

9 Час останньої модифікації

10 Час останньої зміни

11 Розмір блоку під час введення/виведення у файловій системі

12 Кількість виділених блоків

Таким чином, якщо ви хочете дізнатися час останнього звернення до файлу, зверніться до елемента 8 масиву, що повертається. Розглянемо приклад:

$ file - "datafile.txt";

list($dev, $inode, $inodep, $nlink, $uid, $gid, $inodev, $size, $atime, $mtime, $ctime,

$ bsize) = stat ($ file);

print "$file є $size bytes.
";

print "Last access time: $atime
";

print "Last modification time: $mtime
";

Результат:

popen.php is 289 bytes.

Last access time: August 15 2000 12:00:00

Last modification time: August 15 2000 10:07:18

У цьому прикладі я скористався конструкцією list () для присвоєння імен кожному значенню, що повертається. Звичайно, з таким самим успіхом можна повернути масив, у циклі перебрати елементи та вивести всю необхідну інформацію. Як бачите, функція stat() дозволяє отримати різні корисні відомості про файл.

Відображення та зміна характеристик файлів

Кожен файл у системах сімейства UNIX має три важливі характеристики:

  • приналежність до групи;
  • власник;
  • дозволу (permissions).

Всі ці параметри можна змінити за допомогою відповідних функцій PHP. Функції, описані в цьому розділі, не працюють у системах Windows.

Якщо у вас немає досвіду роботи в операційних системах UNIX, інформацію про характеристики файлової системи UNIX можна отримати за адресою http://sunsite.auc.dk/linux-newbie/FAQ2.htm. Теми власності групі, володіння та дозволів розглядаються в розділі 3.2.6.

Функція chgrp() намагається змінити групу, до якої належить заданий файл. Синтаксис функції chgrp():

int chgrp (string ім'я_файлу, mixed група)

Функція filegroup() повертає ідентифікатор групи власника файлу із заданим ім'ям або FALSE у разі помилки. Синтаксис функції filegroup():

int filegroup (string ім'я_файлу)

Функція chmod() змінює роздільну здатність файлу із заданим ім'ям. Синтаксис функції chmod():

int chmod (string ім'я_файлу, int дозволу)

Дозволи задаються у вісімковій системі. Специфіку завдання параметра функції chmod () продемонстровано в наступному прикладі:

chmod("data_file.txt", g+r); // He працює

chmod("data_file.txt", 766); // Не працює

chmod("data_file.txt", 0766); // Працює

Функція fileperms() повертає дозволу файлу із заданим ім'ям або FALSE у разі помилки. Синтаксис функції fileperms():

int fileperms (string ім'я_файлу)

Функція chown() намагається змінити власника файлу. Право зміни власника файлу надається лише привілейованому користувачеві. Синтаксис функції chown():

int chown (string ім'я_файлу, mixed користувач)

Функція fileowner() повертає ідентифікатор користувача для власника файлу із заданим ім'ям. Синтаксис функції fileowner():

int fileowner (string ім'я_файлу)

Копіювання та перейменування файлів

До інших корисних системних функцій, які можуть виконуватися в сценаріях PHP, відносяться копіювання та перейменування файлів на сервері. Ці операції виконуються двома функціями: сміття() та rename().

Скопіювати файл у сценарії PHP нітрохи не складніше, ніж за допомогою команди UNIX порівн. Завдання вирішується функцією PHP сміття(). Синтаксис функції сміття():

int copy (string джерело, string приймач)

Функція сміття() намагається скопіювати файл джерело у файл приймач; у разі успіху повертається TRUE, а за невдачі - FALSE. Якщо файл приймач не існує, функція сміття() створює його. Наступний приклад показує, як створити резервну копію файлу за допомогою функції сміття():

$ data_file = "datal.txt";

copy($data_file. $data_file".bak") або die("Could not copy $data_file");

Функція rename() перейменовує файл. У разі успіху повертається TRUE, а за невдачі - FALSE. Синтаксис функції rename():

bool rename (string старе_ім'я, string нове_ім'я)

Приклад перейменування файлу функцією rename():

$ data_file = "datal.txt";

rename($data file, $datafile".old") або die ("Could not rename $data file");

Видалення файлів

Функція unlink() видаляє файл із заданим ім'ям. Синтаксис:

int unlink (string файл)

Якщо ви працюєте з PHP у Windows, під час використання цієї функції іноді виникають проблеми. У цьому випадку можна скористатися описаною вище функцією system() і видалити файл командою DOS del:

система ("del filename.txt");

Робота з каталогами

Функції PHP дають змогу переглядати вміст каталогів та переміщатися по них. У лістингу 7.8 зображено типову структуру каталогів у системі UNIX.

Лістинг 7.8. Типова структура каталогів

Функція dirname() доповнює basename() - вона витягує шлях із повного імені файлу. Синтаксис функції dirname():

string dirname (string шлях)

Приклад використання 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 (string ім'я_файлу)

У наступному прикладі використовується структура каталогів з лістингу 7.8:

$isdir = is_dir("index.html"); // Повертає FALSE

$isdir = is_dir("book"); // Повертає TRUE

Функція mkdir() робить те саме, що і однойменна команда UNIX, - вона створює новий каталог. Синтаксис функції mkdir():

int mkdir (string шлях, int режим)

Параметр шлях визначає шлях для створення нового каталогу. Не забудьте завершити параметр на ім'я нового каталогу! Параметр режим визначає роздільну здатність, призначену створеному каталогу.

Подібно до того, як функція fopen() відкриває маніпулятор для роботи із заданим файлом, функція opendir() відкриває маніпулятор для роботи з каталогом. Синтаксис функції opendir():

int opendir (string шлях)

Функція closedir() закриває маніпулятор каталогу, переданий як параметр. Синтаксис функції closedir():

void closedir(int маніпулятор_каталогу)

Функція readdir() повертає черговий елемент заданого каталогу. Синтаксис:

string readdir(int маніпулятор_каталогу)

За допомогою цієї функції можна легко вивести список усіх файлів та підкаталогів, що знаходяться у поточному каталозі:

$dh = opendir(".);

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

print "$file
"; endwhile;

Функція chdir() працює так само, як команда UNIX cd - вона здійснює перехід у каталог, заданий параметром. Синтаксис функції chdir():

int chdir (string каталог)

У наступному прикладі ми переходимо в підкаталог book/ та виводимо його вміст:

$newdir = "book";

chdir($newdir) або die("Could not change to directory ($newdir)"); $dh = opendir(".");

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

print "$file
";

Функція rewlnddir() переводить покажчик поточної позиції на початок каталогу, відкритого функцією opendir(). Синтаксис функції rewinddir():

void rewinddir (int наніпулятор_каталогу)

Проект 1: простий лічильник звернень

Сценарій, поданий у цьому розділі, підраховує кількість звернень до сторінки, на якій він знаходиться. Перш ніж переходити до програмного коду в лістингу 7.9, перегляньте алгоритм, написаний на псевдокод:

  1. Присвоїти змінній $access ім'я файлу, в якому зберігатиметься значення лічильника.
  2. Використовувати функцію filе() для читання вмісту $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, будує карту сайту - ієрархічне зображення всіх папок та файлів на сервері, починаючи із заданого каталогу. При обчисленні відступів елементів, з яких складається карта сайту, використовуються функції, визначені в цій та попередніх розділах. Перш ніж переходити до програми, перегляньте алгоритм, написаний на псевдокод:

  1. Оголосити службові змінні для зберігання батьківського каталогу, імені графічного файлу із зображенням папки, назви сторінки та прапора серверної ОС (Windows або інша система).
  2. Оголосити функцію display_directory(), яка читає вміст каталогу та форматує його для виведення у браузері.
  3. Побудувати шлях до каталогу об'єднанням імені, що передається в змінній $dir1, з $dir.
  4. Відкрити каталог та прочитати його вміст. Відформатувати імена каталогу та файлів та вивести їх у браузері.
  5. Якщо поточний файл є каталогом, рекурсивно викликати функцію display_di rectory() і надіслати їй ім'я нового каталогу для виведення. Обчислити відступ, який використовується під час форматування виводу.

Якщо файл не є каталогом, він форматується для відображення у вигляді гіперпосилання (а також обчислюється відступ, який використовується під час форматування).

Лістинг 7.10. Програма sitemap.php

// Файл: sitemap.php

// Призначення: побудова карти сайту

// Каталог, з якого починається побудова карти

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

// Файл із графічним зображенням папки.

// Шлях повинен задаватися Відносно кореневого каталогу сервера Apache

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

// Текст у заголовку вікна $page_name = "PHPRecipes SiteMap";

// У якій системі використовуватиметься сценарій - Linux чи Windows?

// (0 - Windows; 1 - Linux)

$usingjinux = 0;

// Функція: display_directory

// Призначення: читання вмісту каталогу, який визначається параметром

// $dir1, з наступним форматуванням ієрархії каталогів та файлів.

// Функція може бути викликана рекурсивно.

function display_directory ($dir1, $folder_location, $using_linux, $init_depth) (

// Оновити шлях

Sdh = opendir ($ dir);

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

// Елементи каталогів "." та ".." не виводяться.

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

if ($using_linux == 0) :

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

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

// Побудувати шлях за правилами операційної системи. if ($using_linux == 0) :

$tab_depth = $current_deptn - $init_depth;

$file = $dir. "\", $ file; else:

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

// Змінна $file містить каталог? if (is dir($file)) :

// Обчислити відступ

while ($х< ($tab_depth * 2)) :

$х++; endwhile;

print "

".basename($file)."
";

// Збільшити лічильник

// Рекурсивний виклик функції display_directory()

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

// He каталог

// Побудувати шлях за правилами використовуваної

/ / Операційної системи.

if ($using_linux == 0) :

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

// Обчислити відступ

while ($x< (($tab_depth * 2) + 5)) :

print " ".basename($file)."
";

print " ".basename($file)."
";

endif; // Is_dir (file) endif: // If! "." or ".."

// Закрити каталог closedir($dh);

<? print "$page_name"; ?>

// Обчислити початковий відступ

if ($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, призначених для роботи з файлами. Зокрема, ми розглянули такі питання:

  • перевірку існування файлів;
  • відкриття та закриття файлів та потоків введення/виводу;
  • запис у файл та читання з нього;
  • перенаправлення файлу у вихідний потік;
  • запуск зовнішніх програм;
  • операції із файловою системою.

Матеріал цього розділу підготував ґрунт для наступного розділу, «Рядки та регулярні вирази», оскільки при розробці web-додатків обробка рядків та операції введення/виводу дуже тісно пов'язані.

Правильно працювати з файлами має вміти кожен програміст. Ця стаття орієнтована на програмістів-початківців PHP, однак «збірник рецептів» буде корисним і просунутим користувачам.

Робота з файлами поділяється на 3 етапи:

  1. Відкривання файлу.
  2. Маніпуляція з даними.
  3. Закриття файлу.

I. Відкриття файлу

Для того, щоб відкрити файл у середовищі 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: [email protected]", "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 обов'язкові параметри:


if ($fp)
{
while (!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 "Помилка при відкритті файлу";
?>

Дуже часто зустрічаються ситуації, коли необхідно вміст сайту рахувати до масиву. Ця можливість передбачає використання функції file(). При викликі цієї функції, кожен рядок файлу зберігатиметься в окремому елементі вказаного масиву.

Примітка: Не слід застосовувати функцію file()до двійкових файлів (binary-safe), т.к. вона не є безпечною в плані зчитування двійкових файлів, якщо при цьому десь зустрітися символ кінця файлу (EOF), то вона не гарантує вам читання всього двійкового файлу.

$file_array = file("counter.txt"); // Зчитування файлу в масив $file_array
// Робота з даними масиву
?>

Примітка: Робота з масивами докладно описується автори: Мухаметшин Д.Ф., Симдянов І.В.

Наприкінці статті, ви знайдете хорошу «збірку рецептів» з масивів, яка дає вирішення багатьох проблем, з якими щодня зустрічається веб-програміст.

Давайте уявимо ситуацію, коли файл необхідно рахувати за символами. Для цього ми можемо скористатися функцією fgetc(). Функція приймає єдиний параметр. Функція корисна, якщо нам необхідно знайти будь-який символ або кількість однакових символів.

$fp = fopen("counter.txt", "r"); // Відкриваємо файл у режимі читання
if ($fp)
{
while(!feof($fp))
{
$ char = fgetc ($ fp);
if ($char == "с") $i = $i + 1; // Знаходимо символ «с»
}
echo "Кількість букв "c" у файлі: ". $i;
}
else echo "Помилка при відкритті файлу";
?>

III. Закриття файлу

Закриття файлу відбувається за допомогою функції fclose()яка приймає 1 обов'язковий параметр.

$fp = fopen("counter.txt", "r");
if ($fp)
{
echo "Файл відкритий";
fclose($fp); // Закриття файлу
}
?>

Збірник рецептів

1) Нам необхідно перевірити чи існує той чи інший файл. Для цього ми скористаємось функцією file_exists().

myfile("counter.txt"); // Використовуємо функцію myfile, передавши як аргумент ім'я файлу

function myfile($name) //Створюємо функцію для перевірки існування файлу
{
if (file_exists($name)) echo "Файл існує";

}
?>

Примітка: Функція file_existsне перевіряє файли на віддаленому веб-сервері. Для правильної роботи функції файл зі скриптом повинен знаходитися на тому сервері, де і файл, що перевіряється.

2) Визначаємо розмір файлу за допомогою функції filesize()

myfile("counter.txt");

function 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) Вам необхідно визначити кількість рядків у файлі. Для цього використовуємо функцію count()

$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_stroka = 5; //Видалимо 5 рядок з файлу
$file = file("counter.txt"); // Зчитуємо весь файл до масиву

for($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) Визначення типу файлу. Використовуємо функцію

Насправді чим відкрити php файл, не є великою проблемою. Буває важче відкрити пляшку пива, коли перебуваєш посеред лісу. Але так думають лише затяті програмісти. А для новачків розповімо про всі можливості php для роботи з файлами:

Файли php

Файли з розширенням php містять код написаний, однойменною мовою програмування. На відміну від інших мов, php є серверною мовою програмування. Тобто він виконується за сервера. Тому для налагодження його коду на клієнтській машині має бути встановлений локальний сервер.

Для роботи з файлами php використовуються спеціальні програми – програмні редактори. Найбільш поширеними є:

  • Dreamweaver.
  • PHPEdit.
  • Eclipse PHP Development.


При створенні сайтів на основі php може знадобитися багаторазове використання програмного коду. У таких ситуаціях зручно підключати готові рішення, що знаходяться в іншому файлі. Для цього використовується конструкція include. Її синтаксис:

include ім'я_файлу

Приклад підключення:

Файл, що підключається:


Підключення файлу також можливе за допомогою конструкції require. На відміну від include, вона підключає файл ще до виконання програмного коду. За допомогою require у коді можливе лише одне звернення до цього файлу. При повторному зверненні система видасть повідомлення про глобальну помилку та зупинить виконання програми.

Конструкція включає підключає джерело лише під час виконання програми. Вона підтримує множинне читання файлу php. У разі виникнення помилки буде виведено лише попереджувальне повідомлення, а виконання коду продовжиться з наступного рядка.



Відкриття та закриття файлів

У php всі операції з файлами здійснюються у кілька етапів:

  • Відкриття файлу;
  • Редагування вмісту;
  • Закриття файлу.

Для відкриття файлу використовується функція fopen(). Її синтаксис:

int fopen(string filename, string mode [, int use_include_path])

Прийняті аргументи:

  • string filename – ім'я файлу чи абсолютний шлях до нього. Якщо шлях до файлу не буде вказано, то буде здійснено його пошук у поточному каталозі. За відсутності файлу система виведе повідомлення про помилку. Приклад:


  • string mode – вказує режим відкриття файлу. Значення, що приймаються аргументом:
  • r – файл відкритий лише читання, файловий покажчик встановлюється на початку;
  • r+ – файл відкритий для читання та запису;
  • w – створюється новий файл лише запису. Якщо файл з такою назвою вже існує, у ньому відбувається автоматичне видалення всіх даних;
  • w+ — створюється новий файл для запису та читання. При існуванні такого файлу відбувається повний перезапис даних на нові;
  • a – файл відкритий для запису. Покажчик встановлюється наприкінці. Тобто запис у файл PHP почнеться не з початку, а з кінця;
  • a+ – відкриття файлу в режимі читання та запису. Запис розпочнеться з кінця;
  • b – режим роботи з файлом, що містить у собі двійкові дані (у двійковій системі обчислення). Цей режим доступний лише в операційній системі Windows.

Функція fclose () використовується для закриття доступу до файлу. Синтаксис:

int fclose (int file) де int file – дескриптор сайту, який потрібно закрити.

Після кожного читання чи запису файл потрібно закривати цією функцією. Інакше залишається відкритим потік, створений для файлу. А це веде до надмірної витрати серверних потужностей.

Приклад:

Читання та запис файлів

Для простого відображення всього вмісту файлу ідеально підходить функція readfile(). Її синтаксис:

readfile (string filename), де string filename - рядкове ім'я фала (не дескриптор).


int fpassthru (int file)

Для роботи з функцією потрібно відкриття та закриття файлу. Приклад:

Результат аналогічний попередньому.

Функції до роботи з файлами в php дозволяють зчитувати вміст рядково і посимвольно:

  • string fgets (int file, int length)- Функція зчитує рядок довжиною length. Приклад:


  • string fread (int file, int length)- По дії ідентична попередньої.

Для запису текстових даних файл існує дві ідентичні функції:

  • int fputs (int file, string string [, int length ])
  • int fwrite (int file, string string [, int length ])

Функції записують у файл int file рядок string string вказаної довжини int length ( необов'язковий аргумент). Приклад:


Створення та видалення файлів

Для створення файлу php можна використовувати функцію fopen() у режимі доступу «w» або «w+». Або функцію touch(). Вона встановлює час зміни файлу. За відсутності елемента з шуканим ім'ям його буде створено. Її синтаксис:

int touch (string filename [, int time [, int atime]])

Для створення копії файлу використовується функція copy(). Як аргументи вона приймає ім'я оригіналу та файлу, куди потрібно скопіювати вміст. Якщо вона не існує, то буде створена. Синтаксис функції:

int copy (string file1, string file2)


Видалити файл можна за допомогою функції unlink(). Її синтаксис.

Під роботою з файлами в PHPмається на увазі читання з файлуі запис у файлрізної інформації. Цілком очевидно, що працювати з файлами доводиться багато, тому будь-який PHP-програмістзобов'язаний вміти зчитувати з файлуі записувати у файл.

Послідовність роботи з файлами в PHPтака:

  1. Відкрийте файл.
  2. Виконати необхідні дії.
  3. Закрити файл.

Як бачите, послідовність роботи з файлами нагадує роботу із файлами через звичайний провідник. Тільки тут вся робота виконується автоматично самим PHP-скриптом.

Почнемо з першого пункту – відкриття файлу. Файл відкривається за допомогою функції fopen(). Перший параметр – це шлях до файлу, а другий параметр – модифікатор. Давайте відразу розберемо можливі модифікатори:

  1. a- Відкриває файл тільки для запису, причому вказівник поміщається в кінець файлу.
  2. a+ a, але файл відкривається ще й для читання.
  3. r- відкриває файл лише читання, а покажчик встановлюється на початок файла.
  4. r+- те саме, що і модифікатор r, але файл відкривається ще й для запису.
  5. w- Відкриває файл тільки для запису, покажчик встановлює на початок файлу і стирає весь вміст файлу.
  6. w+- те саме, що і модифікатор wтільки файл відкривається також і для читання.

Також розрізняють два режими роботи з файлами: бінарний(позначається b) та текстовий(позначається t). Якщо Ви працюєте зі звичайним текстовим файлом, вибирайте текстовий режим, а якщо, наприклад, із зображенням, то бінарний.

Це все основні модифікатори, яких вам цілком вистачить. Тепер давайте дізнаємось, як закрити файл. Закривається файл за допомогою функції fclose().

Тепер перейдемо до читання файлу за допомогою функції fread(). І давайте, нарешті, наведу приклад:

$contents = "";
while (!feof($handle))
$contents. = fread($handle, 4096);
fclose($handle);
?>

У цьому прикладі ми спочатку відкриваємо файл для читання у текстовому режимі (модифікатор rt). Функція fopen()повертає так званий дескриптор, за допомогою якого можна спілкуватися з файлом, та записуємо його у змінну handle. Потім ми в циклі while()до того часу, поки не досягнуто кінець файл, зчитуємо вміст щоразу по 4096 символів, які записуємо у змінну contents. Після завершення процесу зчитування – закриваємо файл, знову за допомогою дескриптора файлу.

Тепер перейдемо до запису за допомогою функції fwrite():

$handle = fopen("files/a.txt", "at");
$string = "This is text";
fwrite($handle, $string);
fclose($handle);
?>

Після запуску цього скрипта у файлі a.txtдодасться рядок " This is text".

Особливо уважні читачі звернули увагу на покажчики, про які писав трохи вище. Покажчик- Це поточна позиція уявного "курсора" у файлі. Саме з нього починається робота з файлом. Змінити положення вказівника можна за допомогою функції fseek():

$handle = fopen("files/a.txt", "rt");
echo $contents."
";
fseek($handle, 0, SEEK_SET);
$contents = fread($handle, 3);
echo $contents."
";
?>

Таким чином, ми спочатку зчитуємо 3 символу (в результаті, поточне положення покажчика зсувається на 3 позиції). Потім ми встановлюємо покажчик початку файлу. І знову зчитуємо 3 символ. Як Ви й здогадалися, ми двічі вважали те саме. Тобто вперше 3 символу, потім повернулися назад, і знову вважали 3 символ. Також якщо у функції fseek()замінити SEEK_SETна SEEK_CURтоді другий параметр буде не встановлювати позицію покажчика, а зрушувати щодо поточного розташування. Раджу навіть попрактикуватись із покажчиками, бо для розуміння це не так просто. Також рекомендую спробувати записати щось у файл при позиції покажчика, наприклад, на самому початку файлу. І обов'язково поясніть отриманий результат.

І, насамкінець, хочеться навести ще пару функцій, які дозволяють працювати з файлами на найпростішому рівні: file_put_contens()і file_get_contents(). Функція file_put_contents()записує у файл, а функція file_get_contents()зчитує вміст із файлу. Ці функції дуже прості у застосуванні, але можливостей там уже менше (хоча, як правило, вони й не потрібні):

file_put_contents("files/a.txt", "This is text 2");
echo file_get_contents("files/a.txt");
?>

У цьому скрипті ми спочатку записали рядок " This is text 2у файл, а потім зчитуємо отриманий вміст і виводимо його. Як бачите, важко придумати більш простий спосіб читання з файлуі запис у файл.

Ось і всі основні моменти роботи з файлами в PHP.

А зараз буде досить великий, але не складний урок роботи з файлами в php. Для початку, навіщо потрібні файли? Адже можна все зберігати в базі даних MySQL чи PostgreSQL чи будь-який інший. Але іноді бувають такі завдання, коли використання БД, з усіма обробками та турботою про безпеку з'єднання, не доцільно. Наприклад, потрібно зробити звичайний лічильник, а до цього в проекті у нас БД не використовувалася. Так що нам, заради одного маленького лічильника заводити базу даних і зберігати в ній всього кілька рядків? Тут набагато простіше користуватися файлами. До того ж іноді на хостингу взагалі немає підтримки баз даних, тоді файли взагалі залишаються єдиним виходом.

Ну, припустимо, я вас переконав, що файли необхідні:) Тепер давайте розбиратися, як же з ними працювати. Як створювати, відкривати, записувати, перезаписувати, читати тощо. Про все по порядку.

Створюємо файл

У PHP для відкриття файлів використовується функція fopen. Тим не менш, вона також може створювати файли. Якщо передати fopen ім'я файлу, якого немає, вона створить його.

Сама функція fopen приймає два параметри, обидва вони є обов'язковими. По-перше, ми маємо вказати ім'я файлу, який хочемо відкрити. По-друге, передати параметр, який пояснює функції, що ми плануємо робити із цим файлом (наприклад, читання з файлу, запис тощо).

Якщо потрібно створити файл, то вказуємо його ім'я та передаємо параметр, що ми хочемо записати до нього дані. Зверніть увагу: Ми повинні обов'язково сказати PHP, що ми пишемо у файл, інакше вона не буде створювати новий файл.

Приклад:

$ourFileName = "testFile.txt";

$ourFileHandle = fopen($ourFileName, "w") або die("can"t open file");

fclose($ourFileHandle);

Перший рядок $ourFileName = testFile.txt створює рядкову змінну, в якій ми зберігатимемо ім'я файлу.

Другий рядок $ourFileHandle = fopen($ourFileName, 'w') or die("can't open file") відповідно створює або відкриває вже існуючий файл на запис. Або повертає повідомлення, що не може відкрити файл.

Третій рядок fclose($ourFileHandle) закриває файл. Насправді, все просто.

Параметри відкриття файлу у php

Перший параметр 'r' (read) - відкриває файл тільки читання, записувати в нього буде не можна.

Другий параметр w (write) - відкриває для запису. При цьому запис буде йти з початку файлу. Якщо там уже є якась інформація — то її буде перезаписано.

Третій параметр 'a' (append) - відкриває файл на запис, але при цьому дописуватиме в кінець файлу, на відміну від w.

Розширені параметри:

Параметр 'r+' — відкриває і читання і запис. Вказівник буде на початку файлу.

Параметр 'w+' — відкриває і читання і запис, АЛЕ видаляє всю інформацію, що у файле!!!

параметр 'a+' — відкриває на читання та запис, але покажчик буде наприкінці файлу.

Природно, що функції можна передати лише з цих параметрів, а чи не кілька. Їх потрібно підставляти замість 'X':

fopen($ourFileName, "X")

Запис у файл

Ну, ось ми відкрили файл, підібрали потрібний нам параметр, що далі? Потрібно в нього щось записати. Як це зробити? За допомогою функції fwrite, яка приймає як параметр покажчик на файл і рядок тексту, який хочемо записати. Приклад:

$myFile = "testFile.txt";

$fh = fopen($myFile, "w") або die("can"t open file");

$stringData = "Перший рядокn";

fwrite($fh, $stringData);

$stringData = "Другий рядокn";

fwrite($fh, $stringData);

Створили файл testFile.txt, покажчик на нього зберігається у змінній $fn. Записали у нього рядок «Перший рядок» (наприкінці застосували символ кінця рядка n), та був і «Другий рядок». Після цього закрили файл.

УВАГА! Ніколи не забувайте закривати ваші файли! Інакше у разі аварійного завершення виконання скрипту – дані у файлах не збережуться! Завжди після роботи використовуйте fclose!

Читання з файлу

Записати записали, тепер давайте прочитаємо! Це також не так складно. Використовуємо функцію fread. На вхід їй подаємо покажчик на файл та кількість байт, яку хочемо прочитати. Наприклад, один символ дорівнює одному байту (залежить від кодування), ми хочемо прочитати 5 символів: $ theData = fread ($ fh, 5).

Але якщо потрібно отримати всю інформацію, яка є у файлі, то нам знадобиться функція filesize, яка повертає кількість байт у файлі, отже, якщо результат функції filesize передати у fread, то ми отримаємо повністю всю інформацію з файлу:

$myFile = "testFile.txt";

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

$theData = fread($fh, filesize($myFile));

Сподіваюся, зрозуміло пояснив.

$myFile = "testFile.txt";

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

$ theData = fgets ($ fh);

В результаті отримаємо перший рядок із файлу testFile.txt. Відповідно, щоб пройтися по всіх рядках потрібно використовувати цикл foreach:

$lines = file("testFile.txt");

foreach($lines as $single_line)

echo $single_line . "
n";

Тепер ви навчилися відкривати файли на читання, запис або те й інше. Записувати в них дані або дописувати зверху, за допомогою Append, а також читати з них інформацію.