Чтение из файла в PHP. Как получить информацию построчно и целиком?

чтение из файла в php. как получить информацию построчно и целиком?

Чтение всего содержимого файла

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

Если необходимо прочитать всё содержимое файла для дальнейшей обработки, используйте функцию file_get_contents(). Достаточно передать ей путь до файла в перовом параметре. Функция вернет результат в виде строки, которую можно поместить в переменную.

//Читаем всё содержимое файла в строку
$content = file_get_contents('some-file-name.txt');
echo $content;

Также существует возможность получить всё содержимое файла в виде массива, где каждый элемент соответствует одной строке. За данный функционал в PHP отвечает функция file(). Как и в случае с file_get_contents(), ей достаточно передать всего один параметр — путь до файла.

//Получаем содержимое файла в виде массива
$content = file('some-file-name.txt');

//Перебираем все элементы массива в цикле
foreach ($content as $string) {
    echo $string;
}

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

Построчное и посимвольное чтение

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

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

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

//Поочередно получаем строки и выводим в браузер
$descriptor = fopen('some-file-name.txt', 'r');
if ($descriptor) {
    while (($string = fgets($descriptor)) !== false) {
        echo $string;
    }
    fclose($descriptor);

} else {
    echo 'Невозможно открыть указанный файл';
}

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

//Выводим каждый символ из файла с новой строки
$descriptor = fopen('some-file-name.txt', 'r');
if ($descriptor) {
    while (($char = fgetc($descriptor)) !== false) {
        echo $char. '\n';
    }
    fclose($descriptor);

} else {
    echo 'Невозможно открыть указанный файл';
}

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

//Открываем файл и читаем его целиком, функция
//filesize() возвращает размер файла в байтах
$descriptor = fopen('some-file-name.txt', 'r');
if ($descriptor) {
    echo fread($descriptor, filesize('some-file-name.txt'));
    fclose($descriptor);

} else {
    echo 'Невозможно открыть указанный файл';
}

Последние публикации