Php як вимовляється. Робота з файлами на PHP: відкриття, запис, читання. Традиційні методи fopen

останнє оновлення: 1.11.2015

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

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

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

Для відкриття файлів у PHP визначено функцію fopen() . Вона має таке визначення: resource fopen (string $ filename, string $ mode). Перший параметр $filename являє собою шлях до файлу, а другий - режим відкриття. Залежно від мети відкриття та типу файлу, цей параметр може приймати наступні значення:

    "r": файл відкривається лише для читання. Якщо файл не існує, повертає false

    "r+": файл відкривається лише для читання з можливістю запису. Якщо файл не існує, повертає false

    "w": файл відкривається для запису. Якщо такий файл вже існує, він перезаписується, якщо ні - він створюється

    "w+": файл відкривається для запису з можливістю читання. Якщо такий файл вже існує, він перезаписується, якщо ні - він створюється

    "a": файл відкривається для запису. Якщо такий файл вже існує, дані записуються в кінець файлу, а старі дані залишаються. Якщо файл не існує, він створюється

    "a+" : файл відкривається для читання та запису. Якщо файл вже існує, дані дозаписуються в кінець файлу. Якщо файлу немає, він створюється

Результатом функції fopen буде дескриптор файлу. Цей дескриптор використовується для операцій із файлом та для його закриття.

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

$fd = fopen("form.php", "r") or die("не вдалося відкрити файл"); fclose($fd);

Конструкція or die("текст помилки") дозволяє припинити роботу скрипту та вивести деяке повідомлення про помилку, якщо функція fopen не змогла відкрити файл.

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

Для читання файлу можна скористатися кількома функціями. Для рядкового читання використовується функція fgets() , яка отримує дескриптор файлу і повертає один рядок. Пройдемо рядково по всьому файлу:

При кожному виклик fgets() PHP буде поміщати покажчик в кінець ліченого рядка. Щоб простежити закінчення файлу, використовується функція feof() , яка повертає true під час завершення файлу. І поки не буде досягнуто кінця файлу, ми можемо застосовувати функцію fgets().

Читання файлу повністю

При цьому нам не потрібно відкривати файл, отримувати дескриптор, а потім закривати файл.

Поблочне зчитування

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

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

Запис файлу

Для запису файлу використовується функція fwrite() , яка записує у файл рядок:

Аналогічно працює інша функція fputs():

Робота з покажчиком файлу

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

Int fseek (resource $handle , int $offset [, int $whence = SEEK_SET ])

Параметр $handle представляє дескриптор файлу. Параметр $offset - усунення в байтах щодо початку файлу, з якого почнеться зчитування/запис. Третій необов'язковий параметр задає спосіб встановлення зміщення. Він може приймати три значення:

    SEEK_SET : значення за замовчуванням, встановлює зміщення в offset байт щодо початку файлу

    SEEK_CUR : встановлює зміщення в offset байт щодо початку поточної позиції у файлі

    SEEK_END : встановлює зміщення в offset байт від кінця файлу

У разі вдалого встановлення покажчика функція fseek() повертає 0, а при невдалій установці повертає -1.

Приклад використання функції:

$fd = fopen("hello.txt", "w+") or die("не вдалося відкрити файл"); $str = "Привіт мир!"; // рядок для запису fwrite($fd, $str); // запишемо рядок на початок fseek ($ fd, 0); // Розмістимо покажчик файлу на початок fwrite($fd, "Хрю"); // запишемо на початок рядок fseek ($ fd, 0, SEEK_END); // Розмістимо покажчик у кінець fwrite($fd, $str); // запишемо наприкінці ще один рядок fclose($fd);

Про використання функцій fopen, fclose, feof, fgets, fgetss та fscanf

Давайте перерахуємо всі можливості

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

Традиційні методи fopen

Методи fopen, можливо, краще за інших знайомі програмістам C і C++ минулих часів, оскільки більшою чи меншою мірою є саме тими інструментами, які протягом довгих років були завжди у вас під рукою, якщо ви працювали з цими мовами програмування. Для будь-якого з цих методів ви виконуєте стандартну процедуру, використовуючи fopen для відкриття файлу, функцію для читання даних, а потім fclose для закриття файлу, як показано в Лістингу 1.

Лістинг 1. Відкриття та читання файлу за допомогою fgets
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) ( $line = fgets($file_handle); echo $line; ) fclose($file_handle);

Хоча ці функції знайомі більшості досвідчених програмістів, дозвольте мені проаналізувати їхню роботу. Насправді ви виконуєте такі кроки:

  1. Відкриваєте файл. $file_handle зберігає посилання сам файл.
  2. Перевіряєте, чи не досягли ви кінця файлу.
  3. Продовжує зчитування файлу, поки не досягнете кінця, друкуючи кожен рядок, який читаєте.
  4. Закриваєте файл.

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

Функція fopen

Функція fopen встановлює зв'язок із файлом. Я говорю "встановлює зв'язок, " оскільки, крім відкриття файлу, fopen може відкрити і URL:

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

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

Примітка:Параметр "r", використаний у fopen, вказує на те, що файл відкритий тільки для читання. Оскільки запис у файл не входить до кола питань, що розглядаються в цій статті, я не перераховуватиму всі можливі значення параметра. Тим не менш, вам необхідно змінити "r" на "rb" якщо ви читаєте з двійкових файлів для міжплатформної сумісності. Нижче наведено приклад даного типу.

Функція feof

Команда feof визначає, чи зроблено читання до кінця файлу, і повертає значення True (Істина) або False (Брехня). Цикл, наведений у продовжується, доки не буде досягнуто кінець файлу "myfile." Зверніть увагу, що feof також повертає False, якщо ви читаєте URL-адресу і відбулося перевищення часу очікування підключення, оскільки немає більше даних для зчитування.

Функція fclose

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

Функція fgets

Повертаючись на кілька рядків тому в Лістингу 1, ви потрапляєте в центр процесу обробки файлів: безпосередньо читання файлу. Функція fgets - це обрана вами зброя для першого прикладу. Вона захоплює рядок даних із файлу і повертає її як рядок. Звідти ви можете виводити дані або обробляти їх в інший спосіб. У прикладі, наведеному в Лістингу 1, друкується весь файл повністю.

Якщо ви вирішите обмежити розмір порції даних, з якою працюєте, можна додати аргументи fgets для обмеження максимальної довжинирядки даних, що захоплюються. Наприклад, використовуйте наступний програмний код для обмеження довжини рядка 80 символів:

$string = fgets($file_handle, 81);

Згадайте "\0", покажчик кінця рядка C і встановіть довжину на один символ більше, ніж вам насправді необхідно. Як бачите, у наведеному вище прикладі використовується 81, тоді як вам потрібно 80 символів. Зробіть звичкою додавання додаткового символу завжди, коли вам знадобиться задати обмеження довжини рядка для цієї функції.

Функція fread

Функція fgets - лише одна з багатьох функцій для читання файлу. Це одна з функцій, що найчастіше використовуються, оскільки рядкова обробка файлу в більшості випадків виявляється найрозумнішою. Насправді подібні можливості пропонують кілька інших функцій. Як би там не було, рядковий аналіз - це не завжди те, що вам потрібне.

І тут ми звертаємося до fread. Функція fread використовується в дещо інших цілях, ніж fgets: вона призначена для читання з двійкових файлів (тобто файлів, що не складаються спочатку з тексту, що легко читається для людини). Оскільки поняття "рядок" не є актуальним для двійкових файлів (логічні структури даних зазвичай не розбиваються на рядки), ви повинні вказувати кількість байтів, яку потрібно зчитувати.

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

У наведеному прикладі зчитується 4096 байтів (4 KB) даних. Зверніть увагу, що, незалежно від вказаного вами значення, fread зчитуватиме не більше 8192 байтів (8 KB).

Припускаючи, що файл не більше 8 КБ, фрагмент програми, наведений нижче, повинен зчитувати весь файл в один рядок.

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

Якщо розмір файлу більший, вам доведеться використовувати цикл для зчитування частини, що залишилася.

Функція fscanf

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

list ($field1, $field2, $field3) = fscanf($fh, %s %s %s);

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

Функція fgetss

Функція fgetss відрізняється від традиційних функцій для роботи з файлами і дає вам найкраще уявлення про можливості PHP. Вона працює на зразок fgets, але відкидає будь-які виявлені нею теги HTMLабо PHP, залишаючи лише "голий" текст. Візьмемо наведений нижче HTML-файл.

Лістинг 2. Приклад файлу HTML
My title

Якщо ви не розумієте, що "відповідь не буде", то не один для того, щоб ти не тримав".



Пропустимо його через функцію fgetss.

Лістинг 3. Використання fgetss
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) ( echo = fgetss($file_handle); ) fclose($file_handle);

Ось що ви отримаєте як вихідні дані:

My title If you understand what "Додаток, що є", не один для того, щоб ти не мав "завдання", що ви нагадуєте про те, що багато з Америки

Функція fpassthru

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

fpassthru($fh);

Ця функція виводить дані на друк, тому вам не потрібно поміщати їх у змінну.

Нелінійна обробка файлу: переміщення файлом

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

fseek ($ fh, 0);

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

fseek ($ fh, 1024);

Починаючи з PHP V4.0, доступні також кілька інших опцій. Наприклад, якщо потрібно перейти вперед на 100 байт від вашої поточної позиції, ви можете використовувати наступний код:

fseek ($ fh, 100, SEEK_CUR);

Аналогічно, перехід назад на 100 байт здійснюється за допомогою:

fseek ($ fh, -100, SEEK_CUR);

Якщо ви хочете перейти назад у положення 100 байт до кінця файлу, використовуйте SEEK_END .

fseek ($ fh, -100, SEEK_END);

Після досягнення нового положення можна скористатися fgets , fscanf або іншою функцією для читання даних.

Примітка:ви не можете використовувати fseek у дескрипторах файлу, що посилаються на URL-адресу.

Захоплення цілого файлу

Тепер ми переходимо до розгляду унікальних можливостей PHP для обробки файлів: обробка великих блоків даних в одному або двох рядках. Наприклад, як можна захопити файл та вивести весь його вміст на вашу Web-сторінку? Що ж, ви бачили приклад використання циклу з fgets. Але як це зробити простіше? Процес майже смішно простий при використанні fgetcontents , яка поміщає весь файл у рядок.

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

Хоча це і не найкращий варіант, ви можете записати цю команду ще коротше:

echo file_get_contents("myfilename");

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

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

Це команда фактично та сама, що й:

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

Мабуть, ви дивитеся на ці приклади і думаєте, "Це таки надто трудомісткий спосіб". PHP-розробники погоджуються з вами. Тому ви можете скоротити наведену вище команду до:

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

Функція readfile передає на виведення весь вміст файлу або Web-сторінки у вихідний буфер за промовчанням. За замовчуванням ця команда виводить повідомлення про помилку під час збою. Щоб уникнути такої поведінки (якщо ви цього хочете), спробуйте команду:

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

Звичайно, якщо вам необхідно обробляти вміст файлів, один рядок, що повертається file_get_contents - це, мабуть, занадто. Ви, можливо, захочете спочатку розбити її на частини за допомогою split() .

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

Але до чого вам усі ці складності, якщо є ідеальна функція, яка зробить за вас цю роботу? Функція PHP file() виконує це завдання одним кроком: вона повертає рядковий масив, елементами якого є рядки файлу.

$array = file("myfile");

Слід зауважити, що між двома наведеними вище прикладами є невелика відмінність. Команда split видаляє знаки переходу на новий рядок, тоді як при використанні команди файлу рядки масиву закінчуються знаками переходу на новий рядок (так само, як і при використанні fgets).

Можливості PHP, проте, далеко перевершують описані вище. Ви можете розбити цілі.ini-файли в стилі PHP лише однією командою parse_ini_file . Команда parse_ini_file застосовна до файлів, подібних до наведених у Лістингу 4.

Лістинг 4. Приклад файлу.ini
; Comment name = "King Arthur" quest = Для того, щоб статевий льодовик favorite color = Blue Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

Наступні команди представляють файл у вигляді масиву, а потім виводять цей масив на друк:

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

В результаті будуть отримані наступні вихідні дані:

Лістинг 5. Вихідні дані
Array ( => King Arthur => Для сексу Халлі Grail => Blue => Mark Twain => Whoopi Goldberg)

Звичайно, ви можете помітити, що дана командаоб'єднала розділи. Це дія за замовчуванням, але ви легко можете зробити необхідне налаштування, скориставшись другим аргументом parse_ini_file: process_sections, який є змінною логічного типу (Boolean). Встановіть значення process_sections як True (істина).

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

І ваші вихідні дані матимуть вигляд:

Лістинг 6. Вихідні дані
Array ( => Array ( => King Arthur => Для сексу Халлі Grail => Blue) => Array ( => Mark Twain => Whoopi Goldberg))

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

Але це лише верхівка айсберга, якщо говорити про обробку файлів у PHP. Більш складні функції, наприклад tidy_parse_file та xml_parse, можуть допомогти вам з обробкою відповідно HTML- та XML-документів. Зверніться до розділу , щоб отримати більше детальну інформаціюпро роботу цих функций. Обидві вони варті уваги, якщо ви працюватимете з файлами зазначених типів, але замість розгляду всіх можливих типів файлів, ви можете уважно ознайомитися зі змістом цієї статті, де є кілька непоганих загальних правилпо роботі з функціями, описаними мною на даний момент.

Хороший стиль програмування

Ніколи не вважайте, що все у вашій програмі працюватиме так, як було задумано. Наприклад: якщо файл, який ви шукаєте, був переміщений? Що, якщо ви не можете прочитати вміст файлу в результаті зміни прав доступу? Можна заздалегідь перевірити наявність файлу та права на його читання, скориставшись методами file_exists та is_readable.

Лістинг 7. Використання file_exists та is_readable
$ filename = " myfile " ; if (file_exists($filename) && is_readable ($filename)) ( $fh = fopen($filename, "r"); # Processing fclose($fh); )

Тим не менш, на практиці цей фрагмент програми буде, мабуть, надмірним для вашого завдання. Обробка значень, що повертаються fopen, простіше та точніше.

if ($fh = fopen($filename, "r")) ( # Processing fclose($fh); )

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

Як і fopen, функції file_get_contents, file і readfile повертають значення False, якщо не вдається відкрити або обробити файл. Функції fgets, fgetss, fread, fscanf та fclose також повертають значення False при виникненні помилки. Звичайно, за винятком fclose, ви, ймовірно, вже обробили повернені ними результати. Що стосується fclose, мало що можна зробити, якщо дескриптор файлу не закривається належним чином, тому перевірка поверненого значення функції fclose, як правило, є зайвою.

Вибір за вами

PHP не відчуває нестачі в ефективних способахчитання та аналізу файлів. Класичні функції, такі як fread , можуть надійно служити вам більшу частину часу, або вас може більше залучити простота readfile , якщо це необхідно для виконання завдання. Вибір насправді залежить від того, що ви намагаєтеся виконати.

Якщо ви обробляєте великі обсяги даних, ймовірно, fscanf виявиться більш корисним і ефективним, ніж, скажімо, використання файлу в поєднанні з наступними командами split і sprintf. Якщо ви просто відображаєте текст великого обсягу з незначними змінами, навпаки, використання функцій file , file_get_contents , або readfile , можливо, буде доцільним. Це рішення, ймовірно, буде вірним при використання PHPдля кешування або навіть створення тимчасового проксі-сервера.

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

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

Загальні зауваження

Основна робота з файлами, які б вони не були, полягає у відкритті, читанні/запису та закритті. Можна використовувати функції блокування/розблокування доступу до файлу на час його обробки, можна встановлювати позицію читання/запису у файлі - все, як і раніше, у минулому.

Важливим моментом у PHP є надлишок функцій роботи з файлами та варіантів їх використання. Насправді досить використовувати прості, але діючі варіанти. Файл – це, перш за все, пам'ять програми. У ньому можна зберігати інформацію. Мета будь-якої програми, призначення будь-якого сайту - представляти, обробляти та забезпечувати збереження інформації.

Істотна обставина

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

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

Прочитати та змінити самого себе

Чи може програма змінити себе, тобто чи може скрипт удосконалюватися? До цього дня це питання цікавить багатьох. Але набагато практичніше звучить завдання: PHP читання PHP файлу. Не завжди розробник може вирішити те чи інше завдання, написавши конкретний код. Іноді необхідно змінити його, коли на сайт зайшов відвідувач і сформулював питання, що не передбачено на етапі розробки.

Як і в інших випадках, перш за все файл потрібно відкрити. При цьому не важливо, чи існує цей файл чи ні. Якщо відомо, що файл існує (функція file_exists() дає позитивну відповідь), використовується функція fopen() з доступом 'r', 'r+', 'a', 'a+'. Якщо файлу ще немає, з доступом 'a', 'a+', 'w', 'w+'. Результатом відкриття файлу буде його дескриптор. Закривається файл функцією fclose().

Зручно використовувати PHP для читання файлу в масив, коли немає необхідності його обробляти в момент читання.

if (file_exists($fName)) (

$aLines = file($fName)

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

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

$fvs = fopen($fName, "r")

while ((false !== ($cLine = fgets($fvs, 2000)))) (

$cLines .= "
". $i. "). $cLine

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

Збереження результатів

Отримана та оновлена ​​інформація записується у файл функцією fputs() строково або функцією file_put_contents() повністю.

$fName = $_SERVER["DOCUMENT_ROOT"] . "/tmp/scData.php"

$fvs = fopen($fName, "a")

flock($fvs, LOCK_EX)

$cLine = "1 line". chr(10)

fputs($fvs, $cLine)

$cLine = "2 line" . chr(10)

fputs($fvs, $cLine)

flock($fvs, LOCK_UN)

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

$file = "scData.php"

$cContents = file_get_contents($file)

// додавання запису

$cContents .= "новий запис\n"

// запис файлу назад

file_put_contents($file, $cContents)

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

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

Характерна риса PHP, MySQl, JavaScript, а особливо браузерів: тихо пускати на самоплив деякі помилки. «Не розпізналося, не зробилося…» – не надто хороша практика переднього краю інформаційних технологійАле це вчить розробників не помилятися і писати чистий, якісний код, що теж непогано.

PHP та робота з реальними документами

PHP читання PHP файлу, безумовно, представляє практичний інтерес, але це сфера програмування. Користувача та відвідувача сайтів цікавить інформація прикладного характеру, яку він звик бачити у вигляді таблиць та документів, зокрема у форматах *.xlsx та *.docx файлів. Це файли у форматі MS Excel та MS Word.

Списки товарів, ціни, характеристики загальноприйнято формувати як таблиць, тому PHP читання Excel файлу має важливе значення.

Для роботи з такими файлами розроблені бібліотеки PHPExcel та PHPWord. Однак вміст файлів *.xlsx і *.docx представлений у стандарті OOXML, тобто реальний доступний розумінню документ представлений архівом zip. Zip архів - це багато файлів, включаючи картинки, об'єкти, формули, вставки з інших програм. Текстові файли представлені описами у вигляді тегів. Прочитати такий файл мало, потрібно його розібрати, щоб отримати вміст та структуру для використання та зміни.

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

Excel-таблиці

include_once ‘PhpOffice/PhpExcel/IOFactory.php’

function scGetExcelFile($xls)(

$objPHPExcel = PHPExcel_IOFactory::load($xls)

$objPHPExcel->setActiveSheetIndex(0)

//цей масив містить масиви рядків

$aSheet = $objPHPExcel->getActiveSheet()

$array = array()

//обробка

foreach($aSheet->getRowIterator() as $row)(

$cellIterator = $row->getCellIterator()

foreach($cellIterator as $cell)(

array_push($item, iconv("utf-8", "cp1251", $cell->getCalculatedValue()))

array_push($array, $item)

Читання та обробка Excel-файлів значно складніше обробки документів Word. Найкращий варіант, якщо необхідно реалізувати серйозний проект для читання та обробки прикладної інформації - спочатку освоїти бібліотеку PHPWord. Це дасть гарний досвід та швидке входження у специфіку питання.

Документи Word

Усього два рядки:

$oWord = new \PhpOffice\PhpWord\PhpWord()

$oDocx = $this->oWord->loadTemplate($cFileName)

Тепер документ $cFileName доступний для обробки. Далі відкривається архів, вибирається та аналізується його вміст, який можна відобразити на сайті, змінити та записати назад.

$zipClass = новий ZipArchive()

$zipClass->open($this->tempFileName)

// читаємо весь вміст документа

for ($i=0; $i<$zipClass->numFiles; $i++) (

$cNameIn = $zipClass->getNameIndex($i)

$cNameInExt = substr($cNameIn, -4)

if (($cNameInExt == ".xml") || ($cNameInExt == "rels")) (

// файли з розширеннями ".xml" та ".xml.rels" зберігаються в таблиці документа

// кожен xml-рядок записується з унікальним номером по порядку

$cBodyIn = $zipClass->getFromName($cNameIn)

$cBodyInLen = strlen($cBodyIn)

// всі інші файли записуються в папку документа у вигляді, як є

$cNameOnly = substr($cNameIn, strrpos($cNameIn, "/") + 1)

$zipClass->getFromName($cNameIn, $cWorkPath); // вміст як файла

Можливості, які відкриваються при допомоги PHP Excel і PHP Word дозволяють маніпулювати реальними документами, робити їх вміст актуальним у кожний момент часу. У сучасному динамічному світі це стає дуже важливим. Центр тяжкості вже давно перейшов із локального використання комп'ютерної технікиу віртуальний інтернет-простір. Тому створення таблиць і документів у локальних продуктах від Microsoft є менш ефективним, ніж робота з такими документами в автоматичному та напівавтоматичному режимі на сайті, який доступний не тільки творцю таблиці або документа, але і його споживачам.

Текстові файли, інше життя

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

Якщо є така даність, як клієнт і сервер (на першому панує JavaScript, на другому - PHP), то навіть механізми cookie та sessions не справляються з необхідністю передачі інформації між скриптами, сторінками, тими чи іншими процесами.

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

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

Якщо подумати над тим, що текстовий файл – це зміст та структура від розробника, PHP файл – це синтаксис інтерпретатора плюс логіка розробника, а «тегові» описи html, css, xml – це більш смислові елементи, але регламентовані статичними стандартами. Можна прийти до думки про те, що ймовірно файлам вже настав час придбати новий зміст, і він сам повинен визначати їх якість і логіку застосування. Саме тому, що програмування ще не готове до наступного етапу свого розвитку, файли нині залишаються просто файлами, які створює розробник та визначає їхнє використання.

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

16.5K

Насправді чим відкрити 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 - рядкове ім'я фала (не дескриптор).


Той самий файл можна прочитати за допомогою функції fpassthru(). Вона зчитує дані від кінцевої позиції покажчика до кінця файла. Її синтаксис:

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(). Вона встановлює час зміни файлу. За відсутності елемента з шуканим ім'ям його буде створено. Її синтаксис.




Top