Php чтение файла с конца. Работа с файловой системой. Открыть текстовый файл

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

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

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

Для открытия текстового файла используем функцию 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); ?>

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

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

    Последнее обновление: 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);

    PHP

    file_exists("test.txt")//Существует ли файл? filesize("test.txt");//Узнаем размер файла //Возвращается временная метка: fileatime("test.txt");//Дата последнего обращения к файлу //date("d M Y", $atime); filemtime("test.txt");//Дата изменения файла //date("d M Y", $mtime); filectime("test.txt");//Дата создания файла(Windows) //date("d M Y", $ctime);

    Файлы: режимы работы

    PHP

    resource fopen (string filename, string mode) // resource - возвращает указатель на файл в случае успешной работы, или FALSE в случае ошибки
    Режим работы Описание
    r открыть файл только для чтения;
    r+ открыть файл для чтения и записи;
    w открыть файл только для записи. Если он существует, то текущее содержимое файла уничтожается. Текущая позиция устанавливается в начало;
    w+ открыть файл для чтения и для записи. Если он существует, то текущее содержимое файла уничтожается. Текущая позиция устанавливается в начало;
    а открыть файл для записи. Текущая позиция устанавливается в конец файла;
    а+ открыть файл для чтения и записи. Текущая позиция устанавливается в конец файла;
    b обрабатывать бинарный файл. Этот флаг необходим при работе с бинарными файлами в ОС Windows.

    Открытие и закрытие файлов в PHP

    PHP

    $fi = fopen("test.html", "w+") or die("Ошибка"); //Примеры $fi = fopen("http://www.you/test.html","r"); $fi = fopen("http://ftp.you/test.html", "r"); //Закрываем fclose($fi)

    Чтение файлов в PHP

    PHP

    //Читаем файл fread(int fi, int length) $str = fread($fi, 5); // Читаем первые 5 символов echo $str; // так как курсор передвинулся $str = fread($fi, 12); // Читаем следующие 12 символов echo $str; fgets(int fi[, int length]) // Прочитать строку из файла fgetss(int fi, int length [, string allowable]) // Прочитать строку из файла и отбросить HTML-теги // string allowable - теги, которые необходимо оставить fgetc(int fi) //Считывает символ из файла

    Изначально Запись будет происходить в начало файла, путем перезаписывания существующих данных, если они есть. Поэтому, если вам нужно записать что-то в конец файла, нужно установить соответствующий режим чтения , например, a+ .

    Манипуляции с курсором в файлах PHP

    PHP

    int fseek(int fi, int offset [, int whence]) //Установка курсора // int fi - указатель на файл //offset - количество символов, на которые нужно передвинуться. //whence: //SEEK_SET - движение начинается с начала файла; //SEEK_CUR - движение идет от текущей позиции; //SEEK_END - движение идет от конца файла. fseek($fi, -10, SEEK_END); //Читаем последние 10 знаков $s = fread($fi, 10); $pos = ftell($fi); //Узнаем текущую позицию rewind($f)//сброс курсора bool feof($f) //конец файла

    Прямая работа с файлами (данными) в PHP

    PHP

    array file(string filename) // Получаем содержимое файла в виде массива //Еще один вариант прямой работы с данными file_get_contents(string filename) //Чтение (получаем весь файл одной строкой) //Запись в файл (изначально перезаписывается) file_put_contents(string filename, mixed data[,int flag]); //FILE_APPEND // Запись в конец файла: file_put_contents("test.txt", "данные", FILE_APPEND); //Если записать массив, $array = array("I", "live"); file_put_contents("test.txt",$array); //то получим "Ilive"

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

    PHP

    copy(string source, string destination); // Копирование файла rename(str oldname, str newname); // Переименование файла unlink(string filename); // Удаление файла

    Загрузка файлов на сервер PHP

    //Настрoйки PHP.ini file_uploads (on|off) // разрешаем.запрещаем загрузку файлов upload_tmp_dir // временная папка для загружаемых файлов. по умолчания временная папка upload_max_filesize (default = 2 Mb) // макс. размер загружаемого файла post_max_size // общий размер посылаемый формы (должен быть больше upload_max_filesize) //Простая загрузка

    HTML

    Работаем с файлами на сервере

    PHP

    //Принимаем данные $tmp = $_FILES["userfile"]["tmp_name"]; $name = $_FILES["userfile"]["name"]; //Перемещаем файл move_uploaded_file($tmp, name); move_uploaded_file($tmp, "upload/".name); // перенаправляем файл в папку upload // относительно текущего файла //Что в массиве $_FILES $_FILES["userfile"]["name"] // имя файла, например, test.html $_FILES["userfile"]["tmp_name"] // временное имя файла (путь) $_FILES["userfile"]["size"] // размер файла $_FILES["userfile"]["type"] // тип файла $_FILES["userfile"]["error"] // 0 - ошибок нет, число - есть

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

     
    Статьи по теме:
    Куриная печень в сливках Куриная печень в сливках
    Куриная печень - продукт не только вкусный, но и полезный. Надоели привычные паштеты и подливы? Приготовьте что-нибудь новенькое. Обязательно обратите внимание на такой деликатес, как в сливках. Приготовить это кушанье можно и по случаю праздничного засто
    Ленивая овсянка: быстрый и полезный завтрак на все случаи жизни
    Как часто мы что-то готовим на завтрак впопыхах, бегая между кухней, детской комнатой и туалетным столиком. При этом яичница подгорает, бутерброды падают маслом вниз, а задуманными всмятку яйцами впору стены разбивать. Другое дело - ленивая овсянка в банк
    Торт «Медовик» пошаговый рецепт с фотографиями
    Торт «Медовик» завоевал популярность и приобрел множество фанатов еще давным-давно. И все потому, что этот классический медовый торт можно без труда приготовить в домашних условиях, а получится он не менее вкусным, чем у профессиональных кондитеров. Рецеп
    Таро Звезда — значение в прямом и перевернутом положении
    На карте Звезда нарисована девушка с двумя кувшинами. На небе видны звезды. Одна из них большая желтого цвета. Девушка на коленях стоит перед водоемом. Вода из кувшинов льется на землю. 17 аркан Звезда по праву считается картой магов. Это связь всех мисти