Работа с файловой системой. Работа с файлами на 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 = 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)

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

$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 чтение строки из файла приводит к созданию объекта, хотя бы в том состоянии, в котором он был сохранен. Это не совсем привычные идеи, но ведь в современном мире все так быстро меняется.

Я понимаю ваше нетерпение. Мы все что-то пишем-пишем, а пока еще никакой визуализации.

Если вы — начинающий программист, то наверняка привыкли работать так: строчку добавил — проверил выполнение, еще строчку добавил — опять проверил, как программа работает.

А мы тут пишем, но не проверяем. Все верно, не проверяем. Более того, я вам обещаю, что в тех листингах, что мы уже написали, достаточно много ошибок. В основном, конечно, синтаксических. Где-то забыли точку с запятой поставить, где-то $this-> к переменной забыли приписать. Да мало ли что еще...

Но это так и надо. Я не кривлю душой, я действительно все пишу прямо в текстах курса, без какой-либо проверки их в работе.

Так вот, друзья мои. Привыкайте писать именно так! Рождайте в голове задумки и выкладывайте их в виде программного кода. Проверить и отладить вы их всегда успеете. А как показывает практика, в процессе написания нового модуля очень даже часто возникает "задним числом" какая-то новая идея, заставляющая нас возвращаться назад и что-то переделывать. И что, снова тестировать и выискивать глюки? Да ничего подобного — так можно всю жизнь писать один проект.

Но я вам обещаю. Еще несколько занятий, и мы перейдем к классу class_out , перейдем к визуализации данных и добавления их через web-форму, с использованием написанных функций. Готовьте дизайн для вашего нового сайта!

А сегодня мы займемся файловыми процедурами. Нам же надо уметь сохранять тексты и другие файлы. Вот и поучимся.

В PHP существует достаточно много разных механизмов для работы с файлами различных типов. Мы разделим все файлы на два основных типа: текстовые файлы и файлы данных (картинки, музыка, исполняемый код и все остальные типы файлов).

Отличие между текстовыми файлами и остальными состоит в том, что текстовые файлы можно разделить на строки (окончанием строки служит символ EOL — "\n" — Enter). И по этим строкам файл можно читать, писать и все остальное.

Для начала вспомним, что во всех системах файл необходимо открыть, прежде чем что-то с ним сделать.

Открыть файл нам поможет функция PHP fopen() .

Оформляется открытие файла так:

$r=fopen("path_to_file","mode");

где:
$r — указатель на открытый файл. Он нам нужен, чтобы обращаться к нужному файлу, когда их открыто более одного.
path_to_file — абсолютный путь к файлу на диске сервера.
mode — режим, в котором открывается файл.

В PHP можно открыть файл в следующих режимах:

"r " — только для чтения.

"r+ " — для чтения и записи

"w " — только для записи

"a- " — только для записи. То есть файл открывается для записи, но при этом курсор устанавливается в конец файла. Можно сказать, что это открытие файла для дозаписи .

"a+ " — тоже, что и a- , но еще доступно и чтение.

В каждом режиме, где присутствует возможность записи , PHP создаст вам новый файл, если такового не существует в момент открытия. При условии, конечно, что у вас есть на это права в системе.

"w " — писать (w rite)

А к остальным режим нужно обращаться только в том случае, когда не получается реализовать задачу этими двумя, которых почти всегда достаточно.

После того, как файл был открыт, с ним можно проводить операции по записи и чтению данных.

Помните, я как-то писал, что все структуры, имеющие открывающие и закрывающие формы, надо сразу закрывать, как только их открыли, а уж потом писать тело структуры? Вот к файлам это так же относится.

Прежде чем перейти к чтению и записи содержимого файла, давайте его закроем:

fclose($r);

Не сложно. $r — это указатель на открытый файл (вспомните функцию открытия файла).


    После выполнения скрипта PHP сам закроет все файлы, которые вы забыли закрыть. Но если вам важно сохранить в файлах именно то, что надо — сделайте это сами.

Теперь приступим к тирании содержимого файла.

Для начала, я хочу вам показать, как читается и записывается обычный файл с данными (я пронумерую строки для простоты комментирования).

$file_name="/home/roma/address.txt"; // 1 $r=fopen($filename,"r"); // 2 $text=fread($r,filesize($file_name)); // 3 fclose($r); // 4 $text=ereg_replace("213-","670-",$text); // 5 $w=fopen($file_name,"w"); // 6 fwrite($w,$text); // 7 fclose($w); // 8

По строчкам:

1. Определили в переменную путь к файлу. Представим, что в этом файле содержится копия вашей записной книжки.

2. Открываем этот файл для чтения.

3. Читаем в переменную $text содержимое всего файла. Функция filesize() , как раз, сообщает нам размер файла, который мы собрались читать. Зная, что файл не очень большой, мы решаем прочесть в переменную все его содержимое разом.

4. Закрываем файл.

5. А почему мы все это делаем? А потому, что у массы наших друзей сменились первые три цифры телефона: наконец сменили старую АТС на новую цифровую. Функция PHP preg_replace поможет нам заменить все 213- на 670- по всему содержимому переменной $text . А измененный вариант мы записываем обратно в $text .

6. Открываем все тот же файл, но теперь для записи.

7. Записываем в файл содержимое переменной $text .

8. Закрываем файл.

Вот так. Тоже все не сложно.


    Только я прошу не забывать, что работа с файлами чревата множеством самых разных ошибок. Поэтому, как минимум, все открытия файлов должны обязательно сопровождаться проверкой на результат попытки открытия или создания файла. На его существование, если вы его собрались читать и так далее. Я сегодня не стану останавливаться на ошибках — будем рассматривать идеальный безошибочный вариант, но в дальнейшем (в нашей программе) вы обязательно увидите все необходимые проверки.
А теперь напишем ту же самую процедуру, но будем работать с файлом, зная, что это текстовый файл, разбитый на строки. При этом, необходимо предположить, что длина одной строки не более nnn символов (байт). Я думаю, что у нас не более 1024 символов в одной текстовой строке(1K).

$file_name="/home/roma/address.txt"; // 1 $file_new_name="/home/roma/address_new.txt"; // 2 $r=fopen($filename,"r"); // 3 $w=fopen($file_new_name,"w"); // 4 while($str=fgets($r,1024)) // 5 { $str=ereg_replace("213-","670-",$str); // 6 fputs($w,$str); // 7 } fclose($r); // 8 fclose($w); // 9

1. Определяем путь к файлу для чтения

2. Определяем путь к файлу для записи

3. Открываем файл для чтения

4. Открываем другой файл для записи

5. Начинам читать по одной строке в переменную $str из файла $r до тех пор, пока не достигнем конца файла (EOF — End Of File). Причем, строка читается либо до знака конца строки (EOL — End Of Line), либо до 1024-го символа. Это свойство функции чтения строки fgets() .

6. Проводим замену 213 на 670.

7. Записываем строку $str в файл $w .

8, 9. После окончания цикла закрываем оба файла.

Немного длиннее получилось, но насколько правильнее!

Есть разные причины, по которым этот метод можно считать более правильным, чем предыдущий, но я сообщу вам самые веские.

Представьте, что у вас случайно файл оказался размером во много мегабайт: скрипт попросту не выполнится, так как для каждого скрипта отводится ограниченное пространство в оперативной памяти (по умолчанию это 5Mb, если не ошибаюсь).

Или подобную функцию вызвали сразу сто посетителей страницы (например, у вас сто модемных пользователей не спеша тянут с сайта mp3-музыку): у вас просто случится переполнение оперативной памяти сервера, и вы получите по мозгам от вашего администратора.

А еще мы во втором примере прочитали один файл, а записали результат обработки в другой: может случиться так, что произойдет ошибка во время записи данных в файл. В этом случае у нас останется исходная копия данных и нам не придется рвать на голове волосы, разыскивая данные на кассетах с бэкапом.

И это все касается не только обработки текстовых файлов, но файлов данных. Особенно — файлов данных, так как текстовые файлы обычно имеют не такой уж большой размер, как картинки или те же mp3-файлы.

Кстати, в PHP есть замечательная функция readfile() , которая просто читает файл и отдает его в стандартный output (в нашем случае это может быть посетитель сайта) небольшими порциями, не перегружая оперативную память, с требуемой скоростью. Мы ей тоже воспользуемся где-нибудь, я надеюсь.

Завтра напишем функцию добавление новой работы в папку нашего веб-обзорщика.

У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!

Работа с файлами

Работа с файлами - важный инструмент PHP.

Включение внешних файлов

В каждый PHP-документ можно включить файл с помощью инструкции include() . Её аргумент: путь к файлу. Этой инструкцией удобно пользоваться при наличии одинаковых кусков кода во многих PHP-программах. Содержимое включаемого файла обрабатывается как простой HTML-текст. Для того, чтобы содержимое этого файла обрабатывалось как PHP-программа, нужно обрамлять его открывающим и закрывающим тегами PHP.

Пример 1

Использование include() ...Основная часть..."; ?>

Echo "

...Общее приветствие...

"

РЕЗУЛЬТАТ ПРИМЕРА 1:

...Общее приветствие...

...Основная часть...

В данном случае результат будет тем же, если включаемый файл top.php содержит только строку HTML-текста:

...Общее приветствие...

Включаемые файлы могут возвращать значения подобно функциям. Использование оператора return прерывает выполнение этого файла так же, как и функции.

Пример 2

Использование инструкции include(), возвращающей значение Включаемый файл вернул $res"; ?>

Включаемый файл top.php с PHP-программой:

РЕЗУЛЬТАТ ПРИМЕРА 2:

Включаемый файл вернул 56

Инструкцию include() можно использовать внутри цикла. В цикле include() выполняется при каждой итерации. Это можно использовать для включения нескольких файлов. Например:

For ($i=1; $i<=5; $i++) include("incfile{$i}.htm");

Определение имени включаемого файла и его загрузка производятся повторно при каждом вызове include() . Это означает, что если содержание включаемого файла с момента предыдущего вызова изменилось, то загрузится новое содержание.

Оператор include() также можно включать в тело условного оператора.

Несмотря на сходство по внешнему виду с функцией, include() функцией не является, а представляет собой специальную конструкцию языка.

Для указания что файл нужно подключать только один раз используется оператор include_once()

Анализ файлов

PHP содержит множество функций, дающих информацию о файлах. Наиболее употребимыми являются:

  • file_exists() - определяет существование файла. Например: if (!file_exists("aaa.php")) echo "Внимание! Файл aaa.php не найден!";
  • is_file() - определяет, является ли исследуемый объект файлом. Например: if (is_file("bbb.txt")) echo "Можете не сомневаться, bbb.txt - это файл";
  • is_dir() - определяет, является ли исследуемый объект каталогом. Например: if (is_dir("/tmp")) echo "Действительно, /tmp - это каталог";
  • is_readable() - определяет, доступен ли файл для чтения. Например: if (is_readable("db.dbf")) echo "db.dbf можно читать";
  • is_writable() - определяет, доступен ли файл для записи. Например: if (is_writable("db.dbf")) echo "В db.dbf писать можно";
  • filesize() - определяет размер файла в байтах.
  • filemtime() - определяет дату и время последнего изменения файла.
  • fileatime() - определяет дату и время последнего обращения к файлу.

Пример 3

Информация о файле "; echo "$f - ".(is_dir($f) ? "" : "не ")."каталог
"; echo "$f ".(is_readable($f) ? "" : "не ")."доступен для чтения
"; echo "$f ".(is_writable($f) ? "" : "не ")."доступен для записи
"; echo "размер $f в байтах - ".(filesize($f))."
"; echo "последнее изменение $f - ".(date("d M Y H:i", filemtime($f)))."
"; echo "последнее обращение к $f - ".(date("d M Y H:i", fileatime($f)))."
"; } ?>

РЕЗУЛЬТАТ ПРИМЕРА 3:

Top.php - файл top.php - не каталог top.php доступен для чтения top.php доступен для записи размер top.php в байтах - 732 последнее изменение top.php - 04 Oct 2005 20:21 последнее обращение к top.php - 20 Oct 2005 14:01

Внимание! С удаленными файлами эти функции не работают. Их можно применять только к локальной файловой системе.

Управление файлами

PHP содержит множество функций управления файлами. Наиболее употребимыми являются:

  • touch() - создает пустой файл с заданным именем. Если такой файл уже существует, то функция изменит дату модификации. Например: touch("ex1.txt");
  • copy() - копирует файл. Для копирования файлов в php применяется функция copy ($source, $result). Ей нужно передать лишь два параметра - источник $source и имя файла-копии - $result. Стоит отметить, что следует указывать полные адреса к файлам. Пример применения функции copy:

  • unlink() - удаляет заданный файл. Например:
  • fopen() - открывает локальный или удаленный файл и возвращает указатель на него. Указатель используется во всех операциях с содержимым файла. Аргументы: имя файла и режим открытия.
    r чтение. Указатель файла устанавливается на его начало
    r+ чтение и запись. Указатель файла устанавливается на его начало
    w запись. Указатель файла устанавливается на его начало. Все старое содержимое файла теряется. Если файл с указанным именем не существует, функция пытается его создать
    w+ чтение и запись. Указатель файла устанавливается на его начало. Все старое содержимое файла теряется. Если файл с указанным именем не существует, функция пытается его создать
    a запись. Указатель файла устанавливается на его конец. Если файл с указанным именем не существует, функция пытается его создать
    a+ чтение и запись. Указатель файла устанавливается на его конец. Если файл с указанным именем не существует, функция пытается его создать

    Например:

    $fp = fopen("http://www.php.net/", "r"); // для чтения $fp = fopen("ex1.txt", "w"); // для записи $fp = fopen("ex2.txt", "a"); // для добавления в конец

    Если открыть файл не удалось, то можно прервать выполнение программы. Например:

    $fp = fopen("ex1.txt", "w") or die ("Не удалось открыть файл");

  • fclose() - закрывает файл. Аргумент: указатель файла, полученный ранее от функции fopen() . Например: fclose($fp);
  • feof() - проверка конца файла. Аргумент: указатель файла.
  • fgetc() - чтение очередного символа из файла. Аргумент: указатель файла.
  • fgets() - чтение очередной строки файла. Аргументы: указатель файла и длина считываемой строки. Операция прекращается либо после считывания указанного количества символов, либо после обнаружения конца строки или файла.

    Пример 4

    Чтение строк из файла "; ?>
  • fread() - общая функция чтения из файла. Аргументы: указатель файла и количество считываемых символов.
  • fseek() - отступ от начала файла. Аргументы: указатель файла и смещение.

    Пример 5

    Вывод на экран второй половины файла
  • fputs() - запись строки в файл. Аргументы: указатель файла и строка.
  • fwrite() - полный аналог функции fputs() .

    Пример 6

    Запись и добавление в файл
  • flock() - блокирует файл, т.е. не позволяет другим пользователям читать этот файл или писать в него, пока тот, кто наложил блокировку не закончит работу с данным файлом. Аргументы: указатель файла и номер режима блокировки.

    Пример 7

    Блокировка файла

    Блокировка с помощью flock() не является абсолютной. С ней будут считаться только те программы, которые тоже используют эту функцию.

В PHP версии >= 4.3.0 появились новые удобные функции работы с файлами:

  • file_get_contents() - прочитать весь файл или URL
  • file_put_contents() - записать файл

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

В PHP есть несколько функций для работы с каталогами:

  • mkdir() - создание каталога. Аргументы: путевое имя каталога и режим доступа. Режим доступа - восьмеричное число из трех цифр с ведущим нулем. Первая цифра - право доступа для владельца, вторая - для группы, третья - для всех остальных. В системе Windows режим доступа игнорируется. В системе UNIX определены следующие права доступа:

    Например, право полного доступа для владельца, чтения и запуска для группы и запуска для всех остальных:

    Mkdir("testdir", 0751);

  • rmdir() - удаление каталога. Аргумент: путевое имя каталога. Удалить можно лишь пустой каталог при наличии права на это. При успешном выполнении функция возвращает true .
  • opendir() - открытие каталога. Аргумент: путевое имя каталога. В случае возникновения ошибки функция возвращает false . Ошибка при открытии может быть вызвана тем, что каталог не существует или программа не имеет права его читать.
  • readdir() - чтение каталога. Аргумент: путевое имя каталога. Возвращает строку, содержащую имя найденного файла или подкаталога. По достижении конца каталога функция возвращает false .

    Пример 8

    Чтение каталога "; ?>

    Проверочное выражение цикла сработает не так, как хотелось бы, если в каталоге есть файл с именем "0". В таком случае имя "0" будет преобразовано в 0, что вызовет завершение цикла. Избежать подобного можно, если принять дополнительные меры безопасности, изменив проверочное выражение:

    Gettype($f = readdir($dh)) != "boolean"

    Помимо использования функция fgetc() fgets() fgetss(), Вы можете использовать
    $file = file($filename). Она читает $filename в массив($file).

    Пример:

    $file=file($filename); for ($i=0; $i<=count($file); $i++) { echo $file[$i], "
    "; }

Передача файла с сервера. Скачать файл. DownLoad.

Ручной Download, или как скриптом открыть пользователю окошко сохранения файла. Чтобы в браузере открылся диалог "Сохранить файл" с названием файла file.dat, скрипт должен послать такие заголовки:

Header("Content-Disposition: attachment; filename=file.dat"); header("Content-Type: application/x-force-download; name=\"file.dat\"");

Готовый пример отправки файла с диска:

Не мешало бы также ссылаться на скрипт как http://.../download.php?file.dat, иначе браузеры, основанные на Mozilla, могут попытаться записать файл как file.dat.php. или указать атрибут download: Скачать Примечание: Не используйте заголовок header("Cache-Control: no-cache") в таких скриптах, большинство версий Internet Explorer не смогут скачать файл.

Следующий пример скрипта демонстрирует как организовать поддержку докачки :

Предполагается, что $cd - путь к файлу, $fn - имя файла Как передать файл на сервер?

Функции для работы с каталогами

  • chdir() - Сменить каталог
  • boolean chdir (string str)

    Изменяет текущий каталог PHP на указанный в качестве параметра str. Возвращает TRUE в случае успешного завершения, FALSE в случае возникновения ошибки

  • chroot() - Сменить корневой каталог
  • boolean chroot (string str)

    Изменяет корневой каталог текущего процесса на переданный в качестве параметра str. Возвращает TRUE в случае успешного завершения, FALSE в случае возникновения ошибки..

    Замечание: Для Windows-платформ эта функция не реализована.

  • closedir() - Освободить дескриптор каталога
  • void closedir (resourse catalog)

    Закрывает поток, связанный с каталогом и переданный в качестве параметра catalog. Перед использованием данной функции, поток должен быть открыт с помощью функции opendir().

    dir - Класс directory

class dir { dir (string str) string path resource handle string read (void) void rewind (void) void close (void) }

Псевдо-объектно-ориентированный механизм для чтения каталога, переданного в параметре каталог. С момента открытия каталога становятся доступными два свойства класса. Свойство "handle" может быть использовано с другими функциями для работы с каталогами, например, с функциями readdir() , rewinddir() и closedir() . Свойство "path" содержит путь к открытому каталогу. Доступны три метода: read, rewind and close.

Пожалуйста, обратите внимание на способ, которым осуществляется проверка значения, возвращаемого методами класса dir() в примере, приведенном ниже. В этом примере проводится проверка значения на идентичность (выражения идентичны, когда они равны и являются одного типа - за более подробной информацией обратитесь к главе Операторы сравнения) значению FALSE, поскольку в ином случае, любой элемент каталога, чье имя может быть выражено как FALSE, остановит цикл.

Пример кода:

handle."
\n"; echo "Путь: ".$d->path."
\n"; while (false !== ($entry = $d->read())) { echo $entry."
\n"; } $d->close(); ?>

Замечание: Порядок, в котором метод "read" возвращает элементы каталога, зависит от операционной системы.

Замечание: Также, PHP автоматически определяет внутренний класс Directory, что означает, что вы не сможете определять собственные классы с таким же именем.


  • getcwd() - Получить имя текущего рабочего каталога
  • string getcwd (void)

    Возвращает имя текущего рабочего каталога.


  • opendir() - Открыть каталог
  • resourse opendir (string path)

    Возвращает дескриптор каталога для последующего использования с функциями closedir(), readdir() и rewinddir().

    Если путь не существует или каталог, расположенный по указанному пути, не может быть открыт вследствие правовых ограничений или ошибок файловой системы, функция opendir() возвращает значение FALSE и генерирует сообщение PHP об ошибке уровня E_WARNING. Вы можете запретить вывод сообщения об ошибке, предварив имя функции opendir() символом "@".

    Пример кода

    Начиная с версии PHP 4.3.0, параметр путь может также являться любым URL"ом, обращение к которому приводит к получению списка его файлов и каталогов. Однако, данный способ работает только при использовании url-упаковщика file://. В версии PHP 5.0.0 была добавлена поддержка url-упаковщика ftp://.


  • readdir - Получить элемент каталога по его дескриптору
  • string readdir (resource catalog)

    Возвращает имя следующего по порядку элемента каталога. Имена элементов возвращаются в порядке, зависящем от файловой системы.

    Обратите внимание на способ проверки значения, возвращаемого функцией readdir() в приведенном ниже примере. В этом примере осуществляется проверка значения на идентичность (выражения идентичны, когда они равны и являются значениями одного типа - за более подробной информацией обратитесь к главе Операторы сравнения) значению FALSE, поскольку в ином случае, любой элемент каталога, чье имя может быть выражено как FALSE, остановит цикл (например, элемент с именем "0").

    Пример кода

    Обратите внимание, что функция readdir() также возвращает элементы с именами, и, если вы не хотите получать эти значения, просто отбрасывайте их:

    Пример кода


  • rewinddir() - Сбросить дескриптор каталога
  • void rewinddir (resource catalog)

    Сбрасывает поток каталога, переданный в параметре catalog таким образом, чтобы тот указывал на начало каталога


  • scandir() - Получить список файлов и каталогов, расположенных по указанному пути
  • array scandir (string catalog [, int order])

    Возвращает массив, содержащий имена файлов и каталогов, расположенных по пути, переданном в параметре catalog. Если каталог не является таковым, функция возвращает логическое значение FALSE и генерирует сообщение об ошибке уровня E_WARNING.

    По умолчанию, сортировка производится в алфавитном порядке по возрастанию. Если указан необязательный параметр order (равен 1), сортировка производится в алфавитном порядке по убыванию. Пример кода

    Результатом будет нечто вроде:

    Array ( => . => .. => bar.php => foo.txt => somedir) Array ( => somedir => foo.txt => bar.php => .. => .)

    Пример кода

    РЕЗУЛЬТАТ ПРИМЕРА:

    Array ( => . => .. => bar.php => foo.txt => somedir) Array ( => somedir => foo.txt => bar.php => .. => .)

    (PHP 4 >= 4.3.0, PHP 5, PHP 7)

    file_get_contents — Читает содержимое файла в строку

    Описание

    String file_get_contents (string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]])

    Данная функция похожа на функцию file() с той только разницей, что file_get_contents() возвращает содержимое файла в строке, начиная с указанного смещения offset и до maxlen байт. В случае неудачи, file_get_contents() вернёт FALSE .

    Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком, поскольку для улучшения производительности функция использует технику отображения файла в память (memory mapping), если она поддерживается вашей операционной системой.

    Замечание :

    Если вы открываете URI содержащий спецсимволы, такие как пробел, вам нужно закодировать URI при помощи urlencode() .

    Список параметров

    Имя читаемого файла.

    Use_include_path

    Замечание :

    Начиная с версии PHP 5 можно использовать константу FILE_USE_INCLUDE_PATH для поиска файла в include path .

    context

    Корректный ресурс контекста, созданный с помощью функции stream_context_create() . Если в использовании особого контекста нет необходимости, можно пропустить этот параметр передав в него значение NULL .

    Смещение, с которого начнется чтение оригинального потока.

    Поиск смещения (offset) не поддерживается при работе с удаленными файлами. Попытка поиска смещения на нелокальных файлах может работать при небольших смещениях, но этот результат является непредсказуемым, так как он работает на буферизованном потоке.

    Максимальный размер читаемых данных. По умолчанию чтение осуществляется пока не будет достигнут конец файла. Учтите, что этот параметр применяется и к потоку с фильтрами.

    Возвращаемые значения

    Функция возвращает прочтенные данные или FALSE в случае возникновения ошибки.

    Внимание

    Эта функция может возвращать как boolean FALSE , так и не-boolean значение, которое приводится к FALSE . За более подробной информацией обратитесь к разделу Булев тип . Используйте оператор === для проверки значения, возвращаемого этой функцией.

    Ошибки

    Будет сгенерирована ошибка уровня E_WARNING , если параметр filename не удается найти, параметр maxlength меньше нуля или поиск по смещению offset в потоке завершается неудачно.

    Примеры

    Пример #1 Получить и вывести исходный код домашней страницы вебсайта

    $homepage = file_get_contents ("http://www.example.com/" );
    echo $homepage ;
    ?>

    Пример #2 Поиск файлов в include_path

    // <= PHP 5
    $file = file_get_contents ("./people.txt" , true );
    // > PHP 5
    $file = file_get_contents ("./people.txt" , FILE_USE_INCLUDE_PATH );
    ?>

    Пример #3 Чтение секции файла

    // Читаем 14 символов, начиная с 21 символа
    $section = file_get_contents ("./people.txt" , NULL , NULL , 20 , 14 );
    var_dump ($section );
    ?>

    Результатом выполнения данного примера будет что-то подобное:

    string(14) "lle Bjori Ro"

    Пример #4 Использование потоковых контекстов

    // Создаем поток
    $opts = array(
    "http" =>array(
    "method" => "GET" ,
    "header" => "Accept-language: en\r\n" .
    "Cookie: foo=bar\r\n"
    );

    $context = stream_context_create ($opts );

    // Открываем файл с помощью установленных выше HTTP-заголовков
    $file = file_get_contents ("http://www.example.com/" , false , $context );
    ?>

    Close_notify . PHP сообщит об этом как "SSL: Fatal Protocol Error" в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP версий 4.3.7 и старше умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обертки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

    В предыдущем уроке мы научились использовать РНР для доступа к файловой системе сервера. В этом уроке используем эту информацию для чтения из простого текстового файла.

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

    Открыть текстовый файл

    Для открытия текстового файла используем функцию fopen . Вот её синтаксис:

    Fopen(filename, mode )

    Filename Имя открываемого файла. mode Mode/Режим может быть "r" (reading/чтение), "w" (writing/запись) или "a" (appending/присоединение). В этом уроке мы будем только читать из файла и, соответственно, используем "r". В следующем уроке мы научимся записывать и присоединять текст.

    Примеры этого урока используют файл unitednations.txt . Это простой список программ и фондов ООН и их доменов. Можете загрузить этот файл или создать свой и использовать его в примерах.

    Сначала попробуем открыть unitednations.txt:

    // Открыть текстовый файл // Закрыть текстовый файл fclose($f); ?>

    Пример 1: Чтение строки из текстового файла

    В файле систематизированно записаны: название программы, запятая, домен. Как вы, вероятно, могли предположить, в файле с разделением запятыми можно записать куда больше информации.

    Для получения информации из каждой строки используем массив. См. в Уроке 8 о массивах.

    Чтение из текстовых файлов $f = fopen("unitednations.txt", "r"); // Читать построчно до конца файла while (!feof($f)) { // Создать массив с запятой-разделителем $arrM = explode(",",fgets($f)); // Записать ссылки (получить данные из массива) echo "

  • " . $arrM. "
  • "; } fclose($f); ?>

    Весьма удобно, правда? В принципе вы можете расширить этот файл сотнями ссылок или расширить директорию, включив также адреса.

    В следующем уроке мы мы посмотрим, как записать в текстовый файл.