Fread php прочитать весь файл

Обновлено: 04.07.2024

В этой главе мы научим вас, как открывать, читать и закрывать файл на сервере.

PHP открытый файл-fopen ()

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

Мы будем использовать текстовый файл, "словарь. txt", во время уроков:

AJAX = Асинхронный JavaScript и XML
CSS = каскадные таблицы стилей
HTML = Язык разметки Hyper-текста
PHP = PHP-препроцессор
SQL = Язык структурированных запросов
SVG = Масштабируемая векторная графика
XML = Расширяемый язык разметки

Пример

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fread($myfile,filesize("webdictionary.txt"));
fclose($myfile);
?>

Совет: fread() и fclose() функции будут описаны ниже.

Файл может быть открыт в одном из следующих режимов:

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

PHP читать файл-fread ()

fread() функция читает из открытого файла.

Первый параметр fread() содержит имя файла для чтения и второй параметр указывает максимальное число байтов для чтения.

Следующий код PHP читает файл "Dictionary.txt" до конца:

PHP закрыть файл-fclose ()

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

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

fclose() требуется имя файла (или переменной, которая содержит filename) мы хотим закрыть:

<?php
$myfile = fopen("webdictionary.txt", "r");
// some code to be executed.
fclose($myfile);
?>

PHP прочитал одну строку-fgets ()

fgets() функция используется для считывания одной строки из файла.

В приведенном ниже примере выводится первая строка файла "Dictionary. txt":

Пример

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fgets($myfile);
fclose($myfile);
?>

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

PHP проверить конец файла-feof ()

feof() функция проверяет, было ли достигнуто "конец файла".

feof() функция полезна для циклов по данным неизвестной длины.

В приведенном ниже примере читает файл "словарь.txt" строка за строкой, пока не будет достигнут конец файла:

Пример

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// Output one line until end-of-file
while(!feof($myfile)) echo fgets($myfile) . "<br>";
>
fclose($myfile);
?>

PHP читать один символ-fgetc ()

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

В приведенном ниже примере читается символ файла "Dictionary.txt", пока не будет достигнут конец файла:

Пример

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// Output one character until end-of-file
while(!feof($myfile)) echo fgetc($myfile);
>
fclose($myfile);
?>

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

Полная ссылка на файловую систему PHP

Для полной ссылки на функции файловой системы, перейдите на наш полный Ссылка на файловую систему PHP.

Favorite

Добавить в избранное

Как скачать и сохранить удаленное изображение с помощью PHP

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

Создать текстовый файл

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

Пример 1. Прочтите конкретное содержимое текстового файла.

В следующем примере показано, как конкретное содержимое файла можно прочитать с помощью функции fread(). Функция fopen() используется в скрипте, чтобы открыть файл employee.txt для чтения. Затем функция fread() используется для чтения первых 30 байтов текстового файла, который будет напечатан позже.

Следующий вывод появится после запуска сценария с сервера. В выходных данных показаны первые 30 байтов файла employee.txt.

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

В следующем примере показано, как полное содержимое текстового файла можно прочитать с помощью функции fread(). Как и в предыдущем примере, функция fopen() используется для открытия файла employee.txt для чтения. Файл() используется в скрипте для определения общего размера открываемого текстового файла. Функция fread() считывает полное содержимое файла, когда значение общего размера файла передается в качестве второго аргумента этой функции.

Читать Как я могу увидеть изменения каталога в Python?

Следующий вывод появится после запуска сценария с сервера. В выходных данных отображается полное содержимое файла employee.txt.

Пример 3: прочитать содержимое двоичного файла

В следующем примере показано, как можно прочитать файл изображения с помощью функции fread(). Здесь функция fopen() используется для открытия двоичного файла с именем flower.jpg для чтения. Функция fread() используется с функцией Size() для чтения полного содержимого двоичного файла. Функция base64_encode() используется в скрипте для преобразования содержимого двоичного файла в удобочитаемый формат. Затем тег <img> используется для печати изображения.

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

Пример 4: прочитать файл по внешней ссылке

Существующие локальные текстовые и двоичные файлы используются в трех предыдущих примерах. В следующем примере показано, как можно прочитать файл по внешней ссылке с помощью функции fread(). Внешний текстовый файл открывается для чтения с помощью функции fopen(). Первая функция fread() используется для чтения 1024 байтов из внешнего текстового файла. Затем с помощью функции fopen() открывается внешняя ссылка на двоичный файл для чтения. Вторая функция fread() используется для чтения 10000 байтов из внешнего двоичного файла. Двоичный контент преобразуется в удобочитаемый формат, как в предыдущем примере, и распечатывает изображение.

Читать Уменьшают ли разветвители Ethernet скорость?

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

Заключение

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

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

Fragmented terrain

Последняя проблема и будет рассмотрена в этом уроке.

Мерила Успеха

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

Обычно измеряют загрузку CPU и использование оперативной памяти. Часто бывает, что экономия одного, ведёт к увеличенным затратам другого и наоборот.

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

Измерять использование CPU внутри PHP плохая идея. Лучше использовать какую-либо утилиту, как top из Ubuntu или macOS. Если вы у вас Windows, то можно использовать Linux Subsystem, чтобы иметь доступ к top.

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

Будем замерять память так:

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

Какие есть варианты?

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

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

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

В обоих случаях нужно считать большие объемы информации. В первом, нам известен формат данных, во втором, формат значения не имеет. Рассмотрим оба варианта.

Чтение Файла Строка За Строкой

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

Тут мы считываем файл с работами Шекспира. Размер файла около 5.5MB и пиковое использование памяти 12.8MB.

А теперь, давайте воспользуемся генератором:

Файл тот же, а пиковое использование памяти упало до 393KB! Но пока мы не выполняем со считываемыми данными никаких операций, это не имеет практической пользы. Для примера, мы можем разбивать документ на части, если встретим две пустые строки:

Хотя мы разбили документ на 1,216 кусков, мы использовали лишь 459KB памяти. Всё это, благодаря особенности генераторов — объем памяти для их работы равен размеру самой большой итерируемой части. В данном случае, самая большая часть состоит из 101,985 символов.

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

Пайпинг между файлами

В ситуациях, когда обработка данных не требуется, мы можем пробрасывать данные из одного файла в другой. Это называется пайпингом( pipe — труба, возможно потому что мы не видим что происходит внутри трубы, но видим что входит и выходит и неё). Это можно сделать с помощью потоковых методов. Но сперва, давайте напишем классический скрипт, который тупо передает данные из одного файла в другой:

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

Давайте попробуем стримить(или пайпить) файлы, один в другой:

Код довольно странный. Мы открываем оба файла, первый на чтение, второй на запись. Затем мы копируем первый во второй, после чего закрываем оба файла. Возможно будет сюрпризом, но мы потратили всего 393KB.

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

Пайпинг этого текста не особо полезен для нас. Давайте придумаем реальный пример. Предположим, что мы хотим получить картинку из нашего CDN и передать её в файл или в stdout . Мы могли бы сделать это так:

Для того чтобы осуществить задуманное этим способом потребовалось 581KB. Теперь попробуем сделать то же самое с помощью потоков.

Потратили немного меньше памяти(400KB) при одинаковом результате. А если б нам не нужно было сохранять картинку в памяти, мы могли бы сразу застримить её в stdout :

Другие потоки

Существуют и другие потоки, в/из которых можно стримить:

  • php://stdin — только чтение
  • php://stderr — только запись
  • php://input — только чтение(дает доступ к голому телу запроса)
  • php://output — только запись(позволяет писать в буфер вывода)
  • php://memory and php://temp — чтение и запись. Тут можно хранить временные данные, отличие в том что php://temp будет хранить данные в файловой системе при их разрастании, а php://memory будет писать всё в оперативную память до последнего.

Фильтры

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

Хороший код, но он потребляет почти 11MB. С фильтрами, получится лучше:

Здесь мы используем php://filter/zlib.deflate который считывает и сжимает входящие данные. Мы можем пайпить сжатые данные в файл, или куда-нибудь еще. Этот код использовал лишь 896KB.

Я знаю что это не совсем тот же формат, что и zip архив. Но задумайтесь, если у нас есть возможность выбрать иной формат сжатия, затратив в 12 раз меньше памяти, стоит ли это делать?

Чтобы распаковать данные, применим другой zip фильтр.

Вот парочка статей, для тех кому хотелось бы поглубже погрузиться в тему потоков: “Understanding Streams in PHP” и“Using PHP Streams Effectively”.

Кастомизация потоков

fopen и file_get_contents имеют ряд предустановленных опций, но мы можем менять их как душе угодно. Чтобы сделать это, нужно создать новый контекст потока:

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

Создание своих протоколов и фильтров

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

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

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

И его также легко зарегистрировать:

Свойство filtername в новом классе фильтра должно быть равно highlight-names . Также можно использовать инлайновый фильтр php://filter/highligh-names/resource=story.txt . Создавать фильтры гораздо легче чем протоколы. Но протоколы, имеют более гибконастраеваемые возможности и функциональность. К примеру, дной из причин для которой фильтры не годятся, а требуются протоколы — это операции с директориями, где фильтр будет нужен для обработки каждой порции данных.

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

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

Надеюсь, что этот урок подарил вам несколько новых идей(или освежил их в памяти) и теперь вы сможете работать с большими файлами гораздо эффективнее. Познакомившись с генераторами и потоками( и перестав использовать функции по типу file_get_contents ) можно избавить наши приложения от целого класса ошибок. That seems like a good thing to aim for!

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

Функция PHP fopen()

Функция fopen() в PHP — это встроенная функция, которая используется для открытия файла или URL-адреса. В случае сбоя, она возвращает FALSE и выдаёт ошибку. Если вам нужно скрыть вывод ошибки добавьте символ '@' перед именем функции.

Синтаксис

Параметры

  • filename : Обязательный параметр, определяющий файл.
  • mode : Обязательный параметр, определяющий тип доступа к файлу или потоку.
    Он может иметь следующие возможные значения:
  • «r»: Открывает файл только для чтения; помещает указатель в начало файла.
  • «r+»: Окрывает файл для чтения и записи; помещяет указатель в начало файла.
  • «w»: Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует - пробует его создать.
  • «w+»: Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует - пробует его создать.
  • «a»: Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.
  • «a+»: Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует - пытается его создать.
  • «x»: Создаёт и открывает только для записи. Он создает новый файл и возвращает FALSE и ошибку, если файл уже существует.
  • «x+»: Создаёт и открывает для чтения и записи. Создает новый файл и возвращает FALSE и ошибку, если файл уже существует.
  • «c»: Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличие от 'w'), и вызов к этой функции не вызывает ошибку (также как и в случае с 'x').
  • «c+»: Открывает файл для чтения и записи; в остальном имеет то же поведение, что и 'c'.
  • «e»: Установить флаг close-on-exec (закрыть при запуске) на открытый файловый дескриптор. Доступно только в PHP скомпилированном на системах поддерживающих POSIX.1-2008.

В этом уроке мы будем использовать текстовый файл mane.txt:

В следующем примере, ипользуя функцию fopen() , откроем файл "mane.txt" в режиме чтения:

Пример

Чтение файла — fread()

Функция fread() считывает информацию из открытого файла.

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

Следующий код PHP читает файл "mane.txt" до конца:

Закрытие файла — fclose()

Функция fclose() используется, чтобы закрыть открытый файл.

Синтаксис

Функция закрывает файл, на который указывает handle.

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

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

<?php
$myfile = fopen("mane.txt", "r");
// какой-то код для выполнения.
fclose($myfile);
?>

Примечание: Хорошая практика программирования — закрывать все файлы после того, как вы закончили с ними работать. Дело в том, что открытый файл на вашем сервере продолжает занимать ресурсы!

Однострочное чтение — fgets()

Функция fgets() используется для чтения одной строки из файла.

В приведенном ниже примере выводится первая строка файла mane.txt:

Пример

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

Проверка окончания файла — feof()

Функция feof() определяет, достигнут ли конец файла. Если в указанном дескрипторе, определяется окончание файла, возвращает True . В противном случае, False .

Читайте также: