Работа с файлами faq по php


Содержание

Функции для работы с файловой системой

  • Введение
  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Типы ресурсов
  • Предопределенные константы
  • Файловая система
    • basename — Возвращает последний компонент имени из указанного пути
    • chgrp — Изменяет группу владельцев файла
    • chmod — Изменяет режим доступа к файлу
    • chown — Изменяет владельца файла
    • clearstatcache — Очищает кэш состояния файлов
    • copy — Копирует файл
    • delete — См.описание функции unlink или unset
    • dirname — Возвращает имя родительского каталога из указанного пути
    • disk_free_space — Возвращает размер доступного пространства в каталоге или в файловой системе
    • disk_total_space — Возвращает общий размер каталога или раздела файловой системы
    • diskfreespace — Псевдоним disk_free_space
    • fclose — Закрывает открытый дескриптор файла
    • feof — Проверяет, достигнут ли конец файла
    • fflush — Сбрасывает буфер вывода в файл
    • fgetc — Считывает символ из файла
    • fgetcsv — Читает строку из файла и производит разбор данных CSV
    • fgets — Читает строку из файла
    • fgetss — Прочитать строку из файла и отбросить HTML-теги
    • file_exists — Проверяет наличие указанного файла или каталога
    • file_get_contents — Читает содержимое файла в строку
    • file_put_contents — Пишет строку в файл
    • file — Читает содержимое файла и помещает его в массив
    • fileatime — Возвращает время последнего доступа к файлу
    • filectime — Возвращает время изменения индексного дескриптора файла
    • filegroup — Получает идентификатор группы файла
    • fileinode — Возвращает индексный дескриптор файла
    • filemtime — Возвращает время последнего изменения файла
    • fileowner — Возвращает идентификатор владельца файла
    • fileperms — Возвращает информацию о правах на файл
    • filesize — Возвращает размер файла
    • filetype — Возвращает тип файла
    • flock — Портируемая консультативная блокировка файлов
    • fnmatch — Проверяет совпадение имени файла с шаблоном
    • fopen — Открывает файл или URL
    • fpassthru — Выводит все оставшиеся данные из файлового указателя
    • fputcsv — Форматирует строку в виде CSV и записывает её в файловый указатель
    • fputs — Псевдоним fwrite
    • fread — Бинарно-безопасное чтение файла
    • fscanf — Обрабатывает данные из файла в соответствии с форматом
    • fseek — Устанавливает смещение в файловом указателе
    • fstat — Получает информацию о файле используя открытый файловый указатель
    • ftell — Сообщает текущую позицию чтения/записи файла
    • ftruncate — Урезает файл до указанной длинны
    • fwrite — Бинарно-безопасная запись в файл
    • glob — Находит файловые пути, совпадающие с шаблоном
    • is_dir — Определяет, является ли имя файла директорией
    • is_executable — Определяет, является ли файл исполняемым
    • is_file — Определяет, является ли файл обычным файлом
    • is_link — Определяет, является ли файл символической ссылкой
    • is_readable — Определяет существование файла и доступен ли он для чтения
    • is_uploaded_file — Определяет, был ли файл загружен при помощи HTTP POST
    • is_writable — Определяет, доступен ли файл для записи
    • is_writeable — Псевдоним is_writable
    • lchgrp — Изменяет группу, которой принадлежит символическая ссылка
    • lchown — Изменяет владельца символической ссылки
    • link — Создаёт жёсткую ссылку
    • linkinfo — Возвращает информацию о ссылке
    • lstat — Возвращает информацию о файле или символической ссылке
    • mkdir — Создаёт директорию
    • move_uploaded_file — Перемещает загруженный файл в новое место
    • parse_ini_file — Обрабатывает конфигурационный файл
    • parse_ini_string — Разбирает строку конфигурации
    • pathinfo — Возвращает информацию о пути к файлу
    • pclose — Закрывает файловый указатель процесса
    • popen — Открывает файловый указатель процесса
    • readfile — Выводит файл
    • readlink — Возвращает файл, на который указывает символическая ссылка
    • realpath_cache_get — Получает записи из кэша реального пути
    • realpath_cache_size — Получает размер кэша реального пути
    • realpath — Возвращает канонизированный абсолютный путь к файлу
    • rename — Переименовывает файл или директорию
    • rewind — Сбрасывает курсор у файлового указателя
    • rmdir — Удаляет директорию
    • set_file_buffer — Псевдоним stream_set_write_buffer
    • stat — Возвращает информацию о файле
    • symlink — Создаёт символическую ссылку
    • tempnam — Создаёт файл с уникальным именем
    • tmpfile — Создаёт временный файл
    • touch — Устанавливает время доступа и модификации файла
    • umask — Изменяет текущую umask
    • unlink — Удаляет файл

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

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

Чтение и запись файлов

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

Для открытия файлов в PHP определена функция fopen() . Она имеет следующее определение: resource fopen(string $filename, string $mode) . Первый параметр $filename представляет путь к файлу, а второй — режим открытия. В зависимости от цели открытия и типа файла данный параметр может принимать следующие значения:

‘r’ : файл открывается только для чтения. Если файла не существует, возвращает false

‘r+’ : файл открывается только для чтения с возможностью записи. Если файла не существует, возвращает false

‘w’ : файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет — то он создается

‘w+’ : файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет — то он создается

‘a’ : файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создается

‘a+’ : файл открывается для чтения и записи. Если файл уже существует, то данные дозаписываются в конец файла. Если файла нет, то он создается

Результатом функции fopen будет дескриптор файла. Этот дескриптор используется для операций с файлом и для его закрытия.

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

Конструкция or die(«текст ошибки») позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen не смогла открыть файл.

Чтение файла

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

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

Чтение файла полностью

Если нам надо прочитать файл полностью, то мы можем облегчить себе жизнь, применив функцию file_get_contents() :

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

Поблочное считывание

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

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

Запись файла

Для записи файла применяется функция fwrite() , которая записывает в файл строку:

Аналогично работает другая функция fputs() :

Работа с указателем файла

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

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

SEEK_SET : значение по умолчанию, устанавливает смещение в offset байт относительно начала файла

SEEK_CUR : устанавливает смещение в offset байт относительно начала текущей позиции в файле

SEEK_END : устанавливает смещение в offset байт от конца файла

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

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

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

Функции чтения и записи файлов

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

Любой сеанс манипулирования файлом может состоять из описанных ниже шагов:

Открыть файл для чтения-записи.

Выполнить операцию чтения в файле.

Провести необходимые операции с содержимым файла.

Записать результаты в файл (если нужно).

Для выполнения каждого из этих шагов предусмотрена соответствующая функция работы с файловой системой языка PHP.

Операция открытия файла

Для открытия файлов используется функция fopen(). Результат выполнения функции fopen() необходимо присваивать переменной. Следует учитывать, что функция fopen() в результате успешного выполнения возвращает не целое число, а строку, в которой приведены данные «Resource id #n», где n — номер открытого в настоящее время потока. Не следует пытаться проконтролировать успешное выполнение операции открытия файла с помощью вызовов функции is_int() или is_numeric(). Вместо этого следует использовать функцию die().

Если операция открытия файла прошла успешно, интерпретатор PHP возвращает идентификатор ресурса, который требуется для осуществления дальнейших операций, таких как fread или fwrite. В противном случае будет получено значение false.

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

Режим только чтения («r»).

Режим чтения и записи, применяемый, если файл уже существует («r+»). Запись осуществляется в начало файла; а если файл считывается как строка, после чего эта строка редактируется и снова выводится в файл, то фактически происходит запись обновленного файла с сохранением его первоначального содержимого.

Режим только записи («w»), в котором перед выполнением каких-либо операций записи создается файл с указанным именем, если этот файл еще не существует, и стирается содержимое указанного файла, если он существует! Данный режим не может использоваться для чтения файла; он предназначен только для записи.

Режим записи и чтения, применяемый, даже если файл еще не существует («w+»), предусматривает создание файла с указанным именем (при условии, что он не существует) и удаление до начала выполнения операций записи содержимого указанного файла!

Режим только записи, применяемый для дополнения файла, независимо от того, существует ли файл или нет («a»).

Режим записи и чтения, применяемый для дополнения файла, независимо от того, существует ли файл или нет («а+»). Если файл считывается как строка, после чего эта строка редактируется и снова выводится в файл, то фактически происходит запись обновленного файла с сохранением первоначального содержимого файла.

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

Для работы с файлами предусмотрена возможность открывать несколько типов соединений и использовать средства доступа, включая HTTP, HTTPS, FTP, FTPS, стандартный ввод-вывод, и др.

При использовании функции fopen() для работы по протоколу HTTP предпринимается попытка открыть соединение по протоколу HTTP 1.0 для обработки файла такого типа, который обычно обрабатывается веб-сервером (таким как файл HTML, PHP, ASP и т.д.). По существу, интерпретатор PHP вынуждает веб-сервер действовать так, как будто переданный ему запрос поступил из обычного веб-браузера, применяемого для просмотра Интернета, а не был получен с помощью операции открытия файла:

Следует помнить, что с формальной точки зрения URL без заключительного символа косой черты рассматривается как имеющий неправильную структуру, но в большинстве веб-серверов при получении параметра адреса, не соответствующего этому требованию, автоматически осуществляется замена URL такой же строкой с заключительным символом косой черты и предпринимается попытка перенаправить запрос по полученному адресу.

При использовании функции fopen() для работы по протоколу FTP предпринимается попытка установить соединение FTP с удаленным сервером от имени FTP-клиента. Этот вариант применения функции fopen() является более сложным, поскольку в данном случае, кроме имени хоста и пути к файлу, приходится также указывать имя пользователя и пароль FTP, как показано ниже:

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

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

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

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

Операции чтения файла

Функция fread() принимает в качестве параметров идентификатор указателя файла и размер файла в байтах. Если указанный размер файла не является достаточным для чтения всего файла, то в работе программы возникают загадочные нарушения (исключением является такая ситуация, когда меньший размер файла задается намеренно; такой способ доступа может применяться при чтении огромных файлов в виде отдельных фрагментов). Поэтому, если нет оснований для применения другого подхода (например, обусловленного необходимостью чтения колоссального, неуправляемого файла), то лучше всего предоставить возможность заполнить значение параметра размера файла самому интерпретатору PHP, используя функцию filesize() с указанием в качестве параметра имени файла (или переменной с именем файла), как в следующем примере:

Илон Маск рекомендует:  Шаблон сайта слайдер HTML, CSS, JavaScripts, 5 страниц

При использовании указанной конструкции часто возникает ошибка, состоящая в том, что применяется вызов filesize($fd), а не filesize($filename).

Функция fread() исключительно полезна, поскольку позволяет преобразовать любой файл в строку, с которой в дальнейшем могут осуществляться манипуляции с помощью широкого перечня полезных строковых функций PHP. К тому же любую строку можно преобразовать в массив с использованием таких функций, как file() или explode(), что позволяет получить доступ к большому арсеналу функций манипулирования массивами языка PHP.

Начиная с версии PHP 4.3.0 пользователям предоставлен доступ к новой функции — file_get_contents(). Эта функция возвращает все содержимое файла в виде строки и обладает возможностями функции fopen(). Применение функции file_get_contents() равносильно применению функций fopen() и fread().


Если требуется и выполнять чтение, и применять к файлу операции построчной обработки, то вместо функции fread() можно использовать функцию fgets(). Начиная с версии PHP 4.2.0 по умолчанию предусмотрено, что функция возвращает по 1024 байта в расчете на каждую строку, если в качестве второго параметра функции fgets() не задана длина строки.

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

Операции записи файла

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

Функция fputs() полностью идентична функции fwrite(), но fputs() имеет имя в стиле функций языка C.

Следует помнить, что открытие файла в режиме w или w+ приводит к полному и окончательному уничтожению всего содержимого файла. Указанные режимы предназначены только для перезаписи файлов, очищенных от прежнего содержимого. Если же требуется обеспечить запись в начале или в конце файла, то следует использовать соответственно режим r+ или a+.

Операции закрытия файла

Операция закрытия файла является несложной:

В отличие от функции fopen() результат выполнения функции fclose() не требуется присваивать переменной. На первый взгляд может показаться, что применение в сценарии операций закрытия файла является для программиста пустой тратой времени, но количество применимых дескрипторов файлов в системе ограничено, поэтому существует вероятность того, что доступные дескрипторы файлов будут исчерпаны, если ненужные файлы останутся открытыми. С другой стороны, интерпретатор PHP закрывает все открытые файлы после завершения сценария.

Ниже показан полный пример чтения и записи файла из текущей файловой системы:

Код PHP ‘; fclose($fd); echo ‘Запись в файл

‘; $fd = fopen($filename, «w+») or die(«Файл нельзя открыть»); fwrite ($fd, ‘Hello, world!’); fclose($fd);

Чтение из файла

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

Функция feof

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

Функция file_exists

функция file_exists — это простая функция, к использованию которой приходится прибегать очень часто, если для доступа к данным применяются функции файловой системы. Эта функция просто проверяет наличие в локальной файловой системе файла с указанным именем, как показано ниже:

Функция возвращает значение true, если файл существует, а если файл не найден, возвращает значение false. Результаты проверки сохраняются в кэше, который может быть очищен с помощью функции clearstatcache().

Работа с файлами и директориями в PHP

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

Получить имя файла из URL

Имя файла без расширения

Получить расширение файла

Размер файла

Чтобы получить размер файла применяется функция filesize($filename) , которая возвращает размер файла указанного в $filename в байтах.

Размер директории

Функция рекурсивно проходит по всем директориям и возвращает размер всех файлов в байтах.

Конвертация байтов в килобайты и мегабайты

Чтобы конвертировать байты в килобайты и мегабайты можно применить следующую функцию:

Получить список файлов директории в виде массива

То же самое делает функция scandir() , разница в том что у нее в массиве будут « . », « .. » и есть возможность сортировки.

Безопасное сохранение файла

Чтобы не затереть существующий файл на сервере можно применить данную функцию.

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

ГЛАВА 7 Файловый ввод/вывод и файловая система

Данная глава посвящена одному из важнейших аспектов PHP — средствам файлового ввода/вывода. Как нетрудно предположить, входные и выходные потоки данных интенсивно используются при разработке web-приложений. Не ограничиваясь простым чтением/записью файлов, PHP предоставляет в распоряжение программиста средства просмотра и модификации серверной информации, а также запуска внешних программ. Этим средствам и посвящена настоящая глава.

Проверка существования и размера файла

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

file_exists( ) и is_file( ).

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

bool file_exists(string файл)

Пример проверки существования файла:

if (! file_exists ($filename)) :

print «File $filename does not exist!»;

Функция is_file( ) проверяет существование заданного файла и возможность выполнения с ним операций чтения/записи. В сущности, is_file( ) представляет собой более надежную версию file_exists( ), которая проверяет не только факт существования файла, но и то, поддерживает ли он чтение и запись данных:

bool is_file(string файл)

Следующий пример показывает, как убедиться в существовании файла и возможности выполнения операций с ним:

print «The file $file is valid and exists!»;

print «The file $file does not exist or it is not a valid file!»;

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

Функция filesize( ) возвращает размер (в байтах) файла с заданным именем или FALSE в случае ошибки. Синтаксис функции filesize( ):

int filesize(string имя_файла)

Предположим, вы хотите определить размер файла pastry.txt. Для получения нужной информации можно воспользоваться функцией filesize( ):

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

Выводится следующий результат:

Pastry.txt is 179 bytes.

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

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

Прежде чем выполнять операции ввода/вывода с файлом, необходимо открыть его функцией fopen( ).

Функция fopen( ) открывает файл (если он существует) и возвращает целое число — так называемый файловый манипулятор (file handle). Синтаксис функции fopen( ):

int fopen (string файл, string режим [, int включение_пути])

Открываемый файл может находиться в локальной файловой системе, существовать в виде стандартного потока ввода/вывода или представлять файл в удаленной системе, принимаемой средствами HTTP или FTP.

Параметр файл может задаваться в нескольких формах, перечисленных ниже:

Если параметр содержит имя локального файла, функция fopen( ) открывает этот файл и возвращает манипулятор.

Если параметр задан в виде php://stdin, php://stdout или php://stderr, открывается соответствующий стандартный поток ввода/вывода.

Если параметр начинается с префикса http://, функция открывает подключение HTTP к серверу и возвращает манипулятор для указанного файла.

Если параметр начинается с префикса ftp://, функция открывает подключение FTP к серверу и возвращает манипулятор для указанного файла. В этом случае следует обратить особое внимание на два обстоятельства: если сервер не поддерживает пассивный режим FTP, вызов fopen( ) завершается неудачей. Более того, FTP-файлы открываются либо для чтения, либо для записи.

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

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

Таблица 7.1. Режимы открытия файла

Режим Описание
Только чтение. Указатель текущей позиции устанавливается в начало файла
r+ Чтение и запись. Указатель текущей позиции устанавливается в начало файла
w Только запись. Указатель текущей позиции устанавливается в начало файла, а все содержимое файла уничтожается. Если файл не существует, функция пытается создать его
w+ Чтение и запись. Указатель текущей позиции устанавливается в начало файла, а все содержимое файла уничтожается. Если файл не существует, функция пытается создать его
a Только запись. Указатель текущей позиции устанавливается в конец файла. Если файл не существует, функция пытается создать его
a+ Чтение и запись. Указатель текущей позиции устанавливается в конец файла. Если файл не существует, функция пытается создать его

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

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


$file = «userdata.txt»; // Некоторый файл

$fh = fopen($file, «a+») or die(«File ($file) does not exist!»);

Следующий фрагмент открывает подключение к сайту PHP (http://www.php.net):

$site = «http://www.php.net»: // Сервер, доступный через HTTP

$sh = fopen($site., «r»); //Связать манипулятор с индексной страницей Php.net

После завершения работы файл всегда следует закрывать функцией fclose( ).

Функция fclose( ) закрывает файл с заданным манипулятором. При успешном закрытии возвращается TRUE, при неудаче — FALSE. Синтаксис функции fclose( ):

int fclose(int манипулятор)

Функция fclose( ) успешно закрывает только те файлы, которые были ранее открыты функциями fopen( ) или fsockopen( ). Пример закрытия файла:

$fh = fopen($file, «r»);

// Выполнить операции с файлом

print «File Sfile does not exist!»;

Запись в файл

С открытыми файлами выполняются две основные операции — чтение и запись.

Функция is_writeable( ) позволяет убедиться в том, что файл существует и для него разрешена операция записи. Возможность записи проверяется как для файла, так и для каталога. Синтаксис функции is_writeable( ):

bool is_writeable (string файл)

Одно важное обстоятельство: скорее всего, PHP будет работать под идентификатором пользователя, используемым web-сервером (как правило, «nobody»). Пример использования is_writeable( ) приведен в описании функции fwrite( ).

Функция fwrite( ) записывает содержимое строковой переменной в файл, заданный файловым манипулятором. Синтаксис функции fwrite( ):

int fwrite(int манипулятор, string переменная [, int длина])

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

Функция fputs( ) является псевдонимом fwrite( ) и может использоваться всюду, где используется fwrite( ).

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

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

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

Чтение из файла

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

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

boo! is_readable (string файл]

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

// Открыть файл и установить указатель текущей позиции в конец файла

$fh = fopen($filename, «r»);

print «$filename is not readable!»;

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

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

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

$fh = fopen(‘pastry.txt’, «r») or die(«Can’t open file!»);

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

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

Листинг 7.1. Текстовый файл pastry.txt

Recipe: Pastry Dough

1 1/4 cups all-purpose flour

3/4 stick (6 tablespoons) unsalted butter, chopped

2 tablespoons vegetable shortening 1/4 teaspoon salt

3 tablespoons water

Функция fgetc( ) возвращает строку, содержащую один символ из файла в текущей позиции указателя, или FALSE при достижении конца файла. Синтаксис функции fgetc( ):

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

Манипулятор должен ссылаться на открытый файл, доступный для чтения (см. описание функции is_readable( ) ранее в этой главе). В следующем примере продемонстрированы посимвольное чтение и вывод файла с использованием функции fgetc( ):

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

print $char; endwhile;

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

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

Чтение прекращается при выполнении одного из следующих условий:

  • из файла прочитано длина — 1 байт;
  • из файла прочитан символ новой строки (включается в возвращаемую строку);
  • из файла прочитан признак конца файла (EOF).

Если вы хотите организовать построчное чтение файла, передайте во втором параметре значение, заведомо превышающее количество байт в строке. Пример построчного чтения и вывода файла:

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

$line = fgets($fh, 4096);

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

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

Прежде чем переходить к примерам, ознакомьтесь с содержимым листинга 7.2 — этот файл используется в листингах 7.3 и 7.4.

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

Breaking News — Science

Alien lifeform discovered

Early this morning, a strange new form of fungus was found growing in the closet of W. J. Gilmore’s old apartment refrigerator. It is not known if powerful radiation emanating from the tenant’s computer monitor aided in this evolution.

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

Под работой с файлами в PHP подразумевается чтение из файла и запись в файл различной информации. Совершенно очевидно, что работать с файлами приходится много, поэтому любой PHP-программист обязан уметь считывать из файла и записывать в файл.

Последовательность работы с файлами в PHP такая:

  1. Открыть файл.
  2. Выполнить необходимые действия.
  3. Закрыть файл.

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

Начнём с первого пункта — открытие файла. Файл открывается с помощью функции fopen(). Первый параметр — это путь к файлу, а второй параметр — модификатор. Давайте сразу разберём возможные модификаторы:

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

Также различают два режима работы с файлами: бинарный (обозначается b) и текстовый (обозначается t). Если Вы работаете с обычным текстовым файлом, то выбирайте текстовый режим, а если, например, с изображением, то бинарный.


Это все основные модификаторы, которых Вам вполне хватит. Теперь давайте узнаем, как закрыть файл. Закрывается файл с помощью функции fclose().

Теперь перейдём к чтению файла с помощью функции fread(). И давайте, наконец-то, приведу пример:

В данном примере мы сначала открываем файл для чтения в текстовом режиме (модификатор rt). Функция fopen() возвращает так называемый дескриптор, с помощью которого можно общаться с файлом, и записываем его в переменную handle. Затем мы в цикле while() до тех пор, пока не достигнут конец файл, считываем содержимое каждый раз по 4096 символов, которые записываем в переменную contents. После завершения процесса считывания — закрываем файл, вновь с помощью дескриптора файла.

Теперь перейдём к записи с помощью функции fwrite():

После запуска этого скрипта, в файле a.txt добавится строка «This is text«.

Особо внимательные читатели обратили внимание на указатели, о которых я писал чуть выше. Указатель — это текущая позиция воображаемого «курсора» в файле. Именно с него и начинается работа с файлом. Изменить положение указателя можно с помощью функции fseek():

Таким образом, мы сначала считываем 3 символа (в результате, текущее положение указателя сдвигается на 3 позиции). Затем мы устанавливаем указатель на начало файла. И вновь считываем 3 символа. Как Вы и догадались, мы два раза считали одно и тоже. То есть первый раз 3 символа, потом вернулись назад, и вновь считали 3 символа. Также если у функции fseek() заменить SEEK_SET на SEEK_CUR, то тогда второй параметр будет не устанавливать позицию указателя, а сдвигать относительно текущего местоположения. Советую даже попрактиковаться с указателями, потому что для понимания это не так просто. Также рекомендую попытаться записать что-нибудь в файл при позиции указателя, например, в самом начале файла. И обязательно объясните полученный результат.

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

В данном скрипте мы сначала записали строку «This is text 2» в файл, а потом считываем полученное содержимое и выводим его. Как видите, трудно придумать более простой способ чтения из файла и запись в файл.

Вот и все основные моменты работы с файлами в PHP.

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

Автор: Мухаметшин Д.Ф

Правильно работать с файлами должен уметь каждый программист. Данная статья ориентирована на начинающих PHP программистов, однако «сборник рецептов» будет полезен и продвинутым пользователям.
Работа с файлами разделяется на 3 этапа:

Открытие файла.
Манипуляции с данными.
Закрытие файла.

I. Открытие файла
Для того чтобы открыть файл в среде PHP используется функция fopen(). Обязательными параметрами этой функции является имя файла и режим файла.

Согласно документации PHP выделяют следующие виды режимов файлов:
r – открытие файла только для чтения.
r+ — открытие файла одновременно на чтение и запись.
w – создание нового пустого файла. Если на момент вызова уже существует такой файл, то он уничтожается.
w+ — аналогичен r+, только если на момент вызова фай такой существует, его содержимое удаляется.
a – открывает существующий файл в режиме записи, при этом указатель сдвигается на последний байт файла (на конец файла).
a+ — открывает файл в режиме чтения и записи при этом указатель сдвигается на последний байт файла (на конец файла). Содержимое файла не удаляется.

Примечание: в конце любой из строк может существовать еще один необязательный параметр: b или t. Если указан b, то файл открывается в режиме бинарного чтения/записи. Если же t, то для файла устанавливается режим трансляции перевода строки, т.е. он воспринимается как текстовый.

Для демонстрации рассмотрим следующий сценарий:

II. Манипуляции с данными файла
Записывать данные в файл при помощи PHP можно при помощи функции fwrite(). Это функция принимает 2 обязательных параметра и 1 необязательный. В качестве обязательных параметров выступает дескриптор файла и режим файла:

Для построчного считывания файла используют функцию fgets(). Функция принимает 2 обязательных параметра:

Примечание: В данном примере значение 999 определяет количество символов, которые будут считываться до тех пор, пока указатель не достигнет конца файла (EOF).
Для того, чтобы считать файл как единое целое, нужно использовать функцию readfile(), принимающая 1 обязательный параметр. Функция открывает файл, отображает его содержимое в окне браузера, а затем закрывает файл:

Также можно использовать функцию fpassthru() которая принимает 1 обязательный параметр. Перед использованием этой функции необходимо открыть файл в режиме чтения. По окончанию считывания файла функция автоматически закрывает файл(при этом дескриптор файла становиться недействительным).

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

Примечание: Работа с массивами подробно описывается здесь, авторы: Мухаметшин Д.Ф., Симдянов И.В.
В конце статьи, вы найдете хороший «сборник рецептов» по массивам, который дает решение многих проблем, с которыми ежедневно встречается веб-программист.
Давайте представим ситуацию, когда файл необходимо считать по символам. Для этого мы можем воспользоваться функцией fgetc(). Функция принимает единственный параметр. Функция полезна если нам необходимо найти какой-либо символ или количество одинаковых символов.

III. Закрытие файла
Закрытие файла происходить с помощью функции fclose(), которая принимает 1 обязательный параметр.

Сборник рецептов
1) Нам необходимо проверить существует ли тот или иной файл. Для этого мы воспользуемся функцией file_exists().

Примечание: Функция file_exists не производит проверку файлов на удаленном веб-сервере. Для правильной работы функции, файл со скриптом должен находиться на том сервере, где и проверяемый файл.

2) Определяем размер файла с помощью функции filesize()

3) Создание временного файла с помощью функции tmpfile()

4) Вам необходимо определить количество строк в файле. Для этого используем функцию count()

5) Нам необходимо использовать механизм блокировки файла

6) Нам необходимо удалить определенную строку из файла

7) Определение типа файла. Используем функцию filetype(), которая принимает единственный параметр

После вызова строка может содержат одно из следующих значений:
file – обычный файл
dir – каталог
ink – символическая ссылка
fifo – fifo-канал
block – блочно — ориентированное устройство
char – символьно — ориентированное устройство
unknown – неизвестный тип файла

8) Если вы хотите просмотреть все параметры файла, то следует воспользоваться функцией stat()

9) Нам необходимо очистить файл, используем функцию ftruncate()

10) Нам необходимо узнать дату последнего изменения файла, используем функцию filectime(). Функция возвращает значение времени в форме Unix timestamp.

Как правильно читать файлы с помощью PHP

Об использовании функций fopen, fclose, feof, fgets, fgetss, и fscanf

Давайте перечислим все возможности

Одним из преимуществ работы с современными языками программирования, такими как PHP, является количество доступных возможностей. PHP легко мог бы присвоить девиз языка Perl, «Существует несколько способов сделать что-либо», особенно, когда речь идет об обработке файлов. Но при изобилии доступных средств, возникает вопрос, какое из них лучше для выполнения работы. Конечно, в действительности, ответ на этот вопрос зависит от того, какие цели вы ставите при обработке файла, поэтому изучение всех возможностей языка стоит потраченного времени.

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

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

Листинг 1. Открытие и чтение файла с помощью fgets

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

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

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

Функция fopen

Функция fopen устанавливает связь с файлом. Я говорю «устанавливает связь, » поскольку, кроме открытия файла, fopen может открыть и URL:

Это строка программы создает связь с вышеуказанной страницей и позволяет вам начать ее чтение как локального файла.

Примечание: Параметр «r» , использованный в fopen , указывает на то, что файл открыт только для чтения. Поскольку запись в файл не входит в круг вопросов, рассматриваемых в данной статье, я не стану перечислять все возможные значения параметра. Тем не менее, вам необходимо изменить «r» на «rb» если вы производите чтение из двоичных файлов для межплатформенной совместимости. Ниже будет приведен пример данного типа.

Функция feof

Команда feof определяет, произведено ли чтение до конца файла, и возвращает значение True (Истина) или False (Ложь). Цикл, приведенный в Листинге 1 продолжается, пока не будет достигнут конец файла «myfile.» Обратите внимание, что feof также возвращает False, если вы читаете URL и произошло превышение времени ожидания подключения, поскольку не имеется более данных для считывания.

Функция fclose

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

Функция fgets

Возвращаясь на несколько строк назад в Листинге 1, вы попадаете в самый центр процесса обработки файлов: непосредственно чтение файла. Функция fgets — это выбранное вами «оружие» для первого примера. Она захватывает строчку данных из файла и возвращает ее как строку. Оттуда вы можете выводить данные или обрабатывать их иным образом. В примере, приведенном в Листинге 1, распечатывается весь файл целиком.

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

Вспомните «\0», указатель конца строки в C и установите длину на один символ больше, чем вам в действительности необходимо. Как видите, в приведенном выше примере используется 81, тогда как вам нужно 80 символов. Сделайте вашей привычкой добавление дополнительного символа всегда, когда вам понадобится задать ограничение длины строки для данной функции.

Функция fread

Функция fgets — лишь одна из многих имеющихся функций для чтения файла. Это одна из наиболее часто использующихся функций, поскольку построчная обработка файла в большинстве случаев оказывается самой разумной. На самом деле, сходные возможности предлагают несколько других функций. Как бы то ни было, построчный анализ — это не всегда то, что вам нужно.

И здесь мы обращаемся к fread . Функция fread используется в несколько иных целях, чем fgets : она предназначена для чтения из двоичных файлов (то есть файлов, не состоящих изначально из текста, удобочитаемого для человека). Поскольку понятие «строк» не актуально для двоичных файлов (логические структуры данных обычно не разбиваются на строки), вы должны указывать количество байтов, которое нужно считывать.

В приведенном выше примере считывается 4096 байтов (4 KB) данных. Обратите внимание, что, независимо от указанного вами значения, fread будет считывать не более 8192 байтов (8 KB).

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

Если размер файла больше, вам придется использовать цикл для считывания оставшейся его части.

Функция fscanf

Возвращаясь к обработке строк, отметим, что fscanf также является преемницей традиционной файловой библиотечной функции C. Если вы не знакомы с ней, fscanf считывает поля данных в переменные из файла.

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

Функция fgetss

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

Листинг 2. Пример файла HTML

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

Листинг 3. Использование fgetss

Вот что вы получите в качестве выходных данных:


Функция fpassthru

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

Эта функция выводит данные на печать, поэтому вам не нужно помещать их в переменную.

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

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

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

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

Аналогично, переход назад на 100 байт осуществляется посредством:

Если вы хотите перейти назад в положение 100 байт до конца файла, используйте вместо этого SEEK_END .

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

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

Захват целого файла

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

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

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

Это команда фактически та же, что и:

Должно быть, вы смотрите на эти примеры и думаете, «Это все-таки слишком трудоемкий способ». PHP-разработчики согласны с вами. Поэтому вы можете сократить приведенную выше команду до:

Функция readfile передает на вывод все содержимое файла или Web-страницы в выходной буфер по умолчанию. По умолчанию эта команда выводит сообщение об ошибке при сбое. Во избежание такого поведения (если вы этого хотите), попробуйте команду:

Конечно, если вам необходимо обрабатывать содержимое файлов, то одна строка, возвращаемая file_get_contents — это, пожалуй, слишком. Вы, возможно, захотите сначала разбить ее на части с помощью функции split() .

Но к чему вам все эти сложности, если есть идеально подходящая функция, которая сделает за вас эту работу? Функция PHP file() выполняет эту задачу в один шаг: она возвращает строковый массив, элементами которого являются строки файла.

Следует заметить, что между двумя приведенными выше примерами есть небольшое отличие. Команда split удаляет знаки перехода на новую строку, тогда как при использовании команды file строки массива оканчиваются знаками перехода на новую строку (также, как и при использовании fgets ).

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

Листинг 4. Пример файла .ini

Следующие команды представляют файл в виде массива, а затем выводят этот массив на печать:

В результате будут получены следующие выходные данные:

Листинг 5. Выходные данные

Конечно, вы можете заметить, что данная команда объединила разделы. Это действие по умолчанию, но вы легко можете произвести необходимую настройку, воспользовавшись вторым аргументом parse_ini_file : process_sections , который является переменной логического типа (Boolean). Установите значение process_sections как True (истина).

И ваши выходные данные будут иметь вид:

Листинг 6. Выходные данные

PHP помещает данные в легко разбиваемый для анализа многомерный массив.

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

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

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

Листинг 7. Использование file_exists и is_readable

Тем не менее, на практике этот фрагмент программы будет, пожалуй, чрезмерным для вашей задачи. Обработка значений, возвращаемых fopen , проще и точнее.

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

Как и fopen , функции file_get_contents , file и readfile возвращают значение False, если не удается открыть или обработать файл. Функции fgets , fgetss , fread , fscanf и fclose также возвращают значение False при возникновении ошибки. Конечно, за исключением fclose , вы, вероятно уже обработали возвращенные ими результаты. Что касается fclose , мало что можно сделать, если дескриптор файла не закрывается должным образом, поэтому проверка возвращенного значения функции fclose , как правило, является излишней.

Выбор за вами

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

Если вы обрабатываете большие объемы данных, вероятно, fscanf окажется более полезной и эффективной, чем, скажем, использование file в сочетании с последующими командами split и sprintf . Если же вы просто отображаете текст большого объема с незначительными изменениями, напротив, использование функций file , file_get_contents , или readfile , возможно, будет более целесообразным. Это решение, вероятно, будет верным при использовании PHP для кэширования или даже создания временного прокси сервера.

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

Ресурсы для скачивания

Похожие темы

  • Оригинал статьи: The right way to read files with PHP.
  • PHP.net — полный справочник по PHP на все случаи жизни.
  • Прочитайте «PHP через примеры, Часть 1» и откройте для себя упрощенный метод PHP для построения сложных и мощных программ для Web.
  • Узнайте о функции xml_parse , которая не рассматривается в данной статье.
  • Узнайте о функции tidy_parse_file , которая не рассматривается в данной статье.
  • PHP.net — отличный ресурс для PHP-разработчиков.
  • Ознакомьтесь с «Рекомендуемым списком книг по PHP.»
  • Просмотрите все связанные с PHP материалы на developerWorks.
  • Усовершенствуйте ваши навыки программирования на PHP, ознакомившись с ресурсами проекта PHP на сайте IBM developerWorks.
  • Посетите Раздел Open Source на developerWorks для получения разнообразной информации о средствах и методах разработки ПО, инструментальных средств и обновлений проектов, что поможет вам в разработке технологий с открытым исходным кодом и использовании их с программными продуктами IBM.
  • Рационализируйте свой следующий проект по разработке ПО с открытым исходным кодом с помощью пробного ПО IBM, доступного на DVD или для загрузки.
  • Посетите Safari Books Online, где представлено множество ресурсов по технологиям с открытым исходным кодом.

Комментарии

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

Действия с файлами в PHP открытие, создание, закрытие, редактирование

В этой большой статье я собрал с разных сайтов материал, который максимально полно опишет все важные функции по работе с файлами: открытие, создание, закрытие, редактирование, переименование, атрибуты (тип, размер, существует ли), позиция курсора, копирование, удаление, copy, rename, unlink

Открыть/создать файл, для каких-либо действий:

fopen(«files/a.txt», «r»); где r –модификатор.

Модификаторы:
a — открывает файл только для записи, причём указатель помещается в конец файла.
a+ — то же самое, что и модификатор a, но также файл открывается ещё и для чтения.
r — открывает файл только для чтения, а указатель устанавливается в начало файла.
r+ — то же самое, что и модификатор r, но также файл открывается ещё и для записи.
w – если файл существует – обнуляет его содержимое и позволяет произвести запись данных. Если же файл не существует, то создает файл с этим именем.
w+ – аналогично параметру w с той лишь разничей, что позволяет произвести паралельное чтение из файла.
x – пытается создать файл для записи, но если файл уже существует, то возвращает ошибку.
x+ – пытается создать файл для чтения и записи, но если он уже существует, то возвращает ошибку.
Два режима работы с файлами: бинарный (обозначается b) и текстовый (обозначается t). Если Вы работаете с обычным текстовым файлом, то выбирайте текстовый режим, а если, например, с изображением, то бинарный.
Пример: $handle = fopen(«files/a.txt», «rt»); — открываем для чтения в режиме текста
Пример: $h = fopen(«my_file.1.txt»,»w»); — создает файл , если он еще не создан
Пример: — открывает файл, если он существует, иначе выдает ошибку

Чтение/вывод содержимого файлв
После того, как соединение с файлом открыто fopen, можно произвести чтение из этого файла.

Функция fgets — считывание данных из файла без учета размера файла . Если параметр длинна не указан, то файл будет считан целиком.
Синтаксис: fgets (имя файла, размер файла(необязательно) )
Пример:

Функция fread — считывание данных из файла с учетом размера файла .
Синтаксис: fread (имя файла, размер файла)
Параметр длинна позволяет указать количество информации (в байтах), которое будет считано из файла. Длину файла можно узнать при помощи функции filesize().
Пример:

Функция file_get_contents — позволяет произвести чтение файла в строку и имеет следующий синтаксис:
Синтаксис: file_get_contents (имя файла)
Пример:

Функция fgetss — чтение из файла, параллельно удаляя все встретившиеся HTML теги .
Синтаксис: fgetss(указатель на файл, размер файла, допустимые теги])
Пример: Есть file1.txt с содержимым:

Заголовок H1

А теперь произведем чтение из файла, параллельно удалив все HTML теги, кроме

:

Если не произошло окончание файла !feof ($h), то считывается данные из файла, с паралельным удалением всех встречающихся HTML тегов, за исключением

Функция readfile() — выводит содержимое файла с возможностью вывода номера строки :
Синтаксис: readfile (имя файла)
Пример:

Функция file — позволяет считать данные из файла, записав их в массив :
Синтаксис: file (имя файла)
Пример: $a)
echo $i,»: «,htmlspecialchars($a), «
«; ?>
В данном примере мы использовали функцию htmlspecialchars() для перевода всех символов HTML форматирования в их специальную кодировку для вывода их на экран.
Пример: Подсчет количества строк в файле

Запись в файл
Запись в файлы осуществляется функциями fwrite() и fputs(), которые абсолютно идентичны.
Синтаксис: fwrite(куда записать, что записать, количество символов);
Третий необязательный параметр задает количество символов в строке, которые должны быть записаны. Если третий параметр не указан, записывается вся строка.
Пример:

file_put_contents (имя файла, что записать) — запись в файл. Функция идентична последовательным успешным вызовам функций fopen(), fwrite() и fclose().
Пример:

Установка курсора при чтении/записи файла
feof() — при чтении файла, проверка, не достиг ли указатель конца файла .
Пример:
fseek() — Устанавливает смещение в файловом указателе
Синтаксис: fseek(имя файла, смещение измеряемое в байтах)
Пример:
ftell() — Сообщает текущую позицию чтения/записи файла
Пример:

Блокировка файла
flock(имя файла, код режима) — блокирует файл для его использования только одному приложению.
Код режима:
1 — Блокировка чтения
2 — Блокировка записи
3 — Снятие существующей блокировки
Пример:

Атрибуты файлов
file_exists(имя_файла) — проверяет, существует ли файл и возвращает true, если файл существует и false в противном случае.
fileatime(имя_файла) — возвращает время последнего обращения к файлу.
filemtime(имя_файла) — возвращает время последней модификации содержимого файла.
filesize(имя_файла) — возвращает размер файла в байтах.
pathinfo — возвращает информацию о пути к файлу, расширению.
Пример: $myfile_name = ‘/www/htdocs/index.html’;
echo pathinfo($myfile_name, PATHINFO_BASENAME).»
«; //index.html
echo pathinfo($myfile_name, PATHINFO_EXTENSION).»
«;//html
echo pathinfo($myfile_name, PATHINFO_DIRNAME); //www/htdocs
filetype(имя_файла) — возвращает тип файла ().Возможными значениями являются fifo, char, dir, block, link, file, socket и unknown.

Закрыть файл. Делается это с помощью функции fclose().

Работа с файлами / faq по php

При отдаче файла через header(«Location: somefile»), web сервер отдает еще Content-type этого файла, который узнается по расширению файла. Информация о соответствии content-а расширению берется web сервером из конфигурационного файла mime.types. Броузеры в зависимости от получаемого Content-type знают что дальше делать с этим файлом. При этом расширение файла броузеру ни о чем не говорит, и если web сервер отдаст, к примеру, файл best_music.mp3 с Content-type: application/msword, то, если в системе клиента установлен MS Word, этот файл будет открыт им.
Для решения проблемы описанной в вопросе существуют два способа:

1. Отредактировать файл mime.types поставив желаемым расширениям файлов (которые надо скачивать, а не открывать) в соответствие тип application/octet-stream.
Hедостатки:
— этот путь годится, если Вы яляетесь администратором сервера;
— изменения коснутся всех файлов, тип которых Вы переопределили, даже тех, которые HАДО открывать в броузере.

2. Отдавать файл клиенту, не посредством header(«Location: somefile»), а организовав собственную процедуру отдачи файла. При этом появляется возможность динамически менять Content-type, предоставив пользователю выбор, открыть ли файл в броузере или просто скачать, записав на диск.
Hедостатки:
— бОльшая нагрузка на сервер;
— бОльшие требования к объему RAM на сервере.

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

= $cd . «/» . $fn ;
if (! file_exists ( $filename ))
<
header ( «HTTP/1.0 404 Not Found» );
exit;
>
$fsize = filesize ( $filename );
$ftime = date ( «D, d M Y H:i:s T» , filemtime ( $filename ));
$fd = @ fopen ( $filename , «rb» );
if (! $fd ) <
header ( «HTTP/1.0 403 Forbidden» );
exit;
>
// Если запрашивающий агент поддерживает докачку
if ( $HTTP_SERVER_VARS [ «HTTP_RANGE» ]) <
$range = $HTTP_SERVER_VARS [ «HTTP_RANGE» ];
$range = str_replace ( «bytes=» , «» , $range );
$range = str_replace ( «-» , «» , $range );
if ( $range ) < fseek ( $fd , $range );>
>
$content = fread ( $fd , filesize ( $filename ));
fclose ( $fd );
if ( $range ) <
header ( «HTTP/1.1 206 Partial Content» );
>
else <
header ( «HTTP/1.1 200 OK» );
>
header ( «Content-Disposition: attachment; filename=$fn» );
header ( «Last-Modified: $ftime» );
header ( «Accept-Ranges: bytes» );
header ( «Content-Length: » .( $fsize — $range ));
header ( «Content-Range: bytes $range-» .( $fsize — 1 ). «/» . $fsize );
header ( «Content-type: application/octet-stream» );
print $content ;
exit;

function XMail ( $from , $to , $subj , $text , $filename )
<
$f = fopen ( $filename , «rb» );
$un = strtoupper ( uniqid ( time ()));
$head = «From: $from \n » ;
$head .= «To: $to \n » ;
$head .= «Subject: $subj \n » ;
$head .= «X-Mailer: PHPMail Tool\n» ;
$head .= «Reply-To: $from \n » ;
$head .= «Mime-Version: 1.0\n» ;
$head .= «Content-Type:multipart/mixed;» ;
$head .= «boundary=\»———-» . $un . «\»\n\n» ;
$zag = «————» . $un . «\nContent-Type:text/html;\n» ;
$zag .= «Content-Transfer-Encoding: 8bit \n\n $text \n\n » ;
$zag .= «————» . $un . «\n» ;
$zag .= «Content-Type: application/octet-stream;» ;
$zag .= «name=\»» . basename ( $filename ). «\»\n» ;
$zag .= «Content-Transfer-Encoding:base64\n» ;
$zag .= «Content-Disposition:attachment;» ;
$zag .= «filename=\»» . basename ( $filename ). «\»\n\n» ;
$zag .= chunk_split ( base64_encode ( fread ( $f , filesize ( $filename )))). «\n» ;

if (!@ mail ( «$to» , «$subj» , $zag , $head ))
return 0 ;
else
return 1 ;
>
?>

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL