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().

$cLines = “

$fvs = fopen($fName, ‘r’)

$i = 0

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

$i++

$cLines .= ‘<br/>’ . $i . ‘). ‘. $cLine

}

fclose($fvs)

Обидва варіанти працюють бездоганно. Однак, виконуючи 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)

fflush($fvs)

flock($fvs, LOCK_UN)

fclose($fvs)

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

$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-таблиці

Для того щоб прочитати Excel-таблицю, достатньо знати її ім’я файлу і шлях до нього ($xls). В результаті виконання наступного коду буде сформований масив значень вихідної 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()

$item = array()

foreach($cellIterator as $cell){

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

}

array_push($array, $item)

}

return $array

}

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

Документи Word

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

$oWord = new PhpOfficePhpWordPhpWord()

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

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

$zipClass = new 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)

} else {

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

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

НАПИСАТИ ВІДПОВІДЬ

Please enter your comment!
Please enter your name here