Изучаем возможности PHP функции file() и её применение
Работа с функцией file() в PHP
Основной способ использования функции file() заключается в чтении содержимого файла в массив строк. Каждая строка файла становится элементом возвращаемого массива. Символы перевода строки (\n, \r\n) по умолчанию сохраняются. Этот подход подходит для небольших и средних файлов, когда требуется построчная обработка данных.
$lines = file('example.txt');
print_r($lines);функции работы с массивом php (функции для работы с массивами в php)
Array
(
[0] => Первая строка
[1] => Вторая строка
[2] => Третья строка
)функция file php (функция file() в php)
Типичные ошибки:
- Если файл не существует или не доступен для чтения, file() возвращает false и генерирует предупреждение (E_WARNING). Для подавления ошибки используется оператор @.
- При больших файлах (сотни мегабайт) происходит загрузка всего содержимого в память, что может превысить лимит memory_limit. В таких случаях применяются потоковые методы (fgets, SplFileObject).
- Различие в окончании строк (Unix vs Windows) может привести к неожиданным символам в конце строк. Флаг FILE_IGNORE_NEW_LINES удаляет их.
Как удалить символы новой строки из каждой строки?
Флаг FILE_IGNORE_NEW_LINES в качестве второго аргумента убирает завершающие символы перевода строки.
$lines = file('example.txt', FILE_IGNORE_NEW_LINES);
print_r($lines);функция get php (функция get() в php)
Array
(
[0] => Первая строка
[1] => Вторая строка
[2] => Третья строка
)функция php выводит данные на экран (вывод данных на экран в php)
Как пропустить пустые строки при чтении?
Комбинация флагов FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES исключает из массива пустые строки.
$lines = file('example.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);статическая функция php (статические методы в php)
Как прочитать файл в бинарном режиме?
Для корректного чтения бинарных данных (например, изображений) используется флаг FILE_BINARY. Однако чаще применяют file_get_contents() для получения строки, а не массива.
$binaryArray = file('photo.png', FILE_BINARY);
// Каждый элемент содержит один байт? Нет – функция вернёт массив строк по разделителю \n, что бессмысленно для бинарных файлов. Рекомендуется не использовать file() для нетекстовых данных.Php функции даты (функции даты в php)
Использование file() для бинарных файлов ведёт к потере данных, так как функция разбивает файл по символам новой строки. Для бинарных данных правильнее применять file_get_contents() или потоковое чтение.
Как читать файл по URL (удалённый ресурс)?
file() поддерживает URL через обёртку fopen, если включена директива allow_url_fopen. Аналогично локальным файлам, результат - массив строк.
$lines = file('https://example.com/data.txt');
if ($lines === false) {
echo 'Ошибка чтения URL';
}функция return php (оператор return в функциях php)
Если хост недоступен или файл не существует, функция возвращает false с предупреждением. Рекомендуется проверять результат и использовать контекст для задания таймаутов.
Как обработать ошибки, если файл не найден?
Для избежания предупреждений можно использовать оператор @ или проверку через file_exists(). Более современный подход - генерация исключения с помощью set_error_handler или проверка возвращаемого значения.
if (file_exists('missing.txt')) {
$content = file('missing.txt');
} else {
echo 'Файл не найден';
}передача функции php (передача функции в качестве аргумента в php)
// Альтернатива с подавлением ошибки
$content = @file('missing.txt');
if ($content === false) {
// обработка ошибки
}функция include php (подключение файлов с помощью include в php)
Как прочитать только несколько первых строк?
После получения массива можно использовать array_slice() для выборки нужного количества строк.
$allLines = file('large_file.txt');
$firstFive = array_slice($allLines, 0, 5);
foreach ($firstFive as $line) {
echo $line;
}
Этот способ всё равно загружает весь файл в память. Для больших файлов эффективнее использовать потоковое чтение с счётчиком.
Расширенные примеры использования file()
Пример 1: Комбинирование флагов для чистого массива
Чтение файла, удаление символов новой строки и пропуск пустых строк.
$config = file('config.ini', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
print_r($config);
Array
(
[0] => [database]
[1] => host=localhost
[2] => user=admin
[3] => [cache]
[4] => ttl=3600
)
Пример 2: Чтение CSV-файла с преобразованием в ассоциативный массив
Используется file() для получения строк, затем str_getcsv() для разбора каждой строки.
$rawRows = file('employees.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$header = str_getcsv(array_shift($rawRows));
$employees = [];
foreach ($rawRows as $row) {
$data = str_getcsv($row);
$employees[] = array_combine($header, $data);
}
print_r($employees);
Array
(
[0] => Array
(
[name] => Иван
[position] => Менеджер
[salary] => 60000
)
[1] => Array
(
[name] => Мария
[position] => Разработчик
[salary] => 80000
)
)
Если CSV содержит кавычки или разделители внутри полей, str_getcsv() справляется корректно. Однако при больших файлах (сотни тысяч строк) этот метод может быть медленным; лучше использовать fgetcsv() в цикле.
Пример 3: Чтение удалённого файла с контекстом и таймаутом
Создание потока с настройками HTTP и передача его через третий параметр (контекст) в функцию file().
$opts = [
'http' => [
'method' => 'GET',
'timeout' => 10,
'header' => 'User-Agent: PHP Script\r\n'
]
];
$context = stream_context_create($opts);
$lines = file('https://api.example.com/data.txt', false, $context);
if ($lines !== false) {
foreach ($lines as $line) {
echo htmlspecialchars($line) . '<br>';
}
}
При использовании контекста важно передавать его третьим параметром; второй параметр (флаги) при этом остаётся по умолчанию (0). Если требуется комбинация флагов и контекста, вторым аргументом передаются флаги, третьим - контекст.
Пример 4: Обработка каждой строки через array_map с сохранением ключа
Прочитать файл, удалить пустые строки, привести каждую строку к верхнему регистру и сохранить индексы.
$lines = file('text.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$uppercased = array_map('mb_strtoupper', $lines);
print_r($uppercased);
Array
(
[0] => ПЕРВАЯ СТРОКА
[1] => ВТОРАЯ СТРОКА
)
Пример 5: Чтение файла конфигурации в формате ключ=значение
Парсинг ini-подобного файла с помощью file() и цикла.
$raw = file('settings.conf', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$config = [];
foreach ($raw as $line) {
if (strpos($line, '=') !== false) {
list($key, $value) = explode('=', $line, 2);
$config[trim($key)] = trim($value);
}
}
print_r($config);
Array
(
[db_host] => localhost
[db_user] => root
[debug] => 1
)
Пример 6: Использование file() с потоком php://input для получения тела POST-запроса
В веб-приложениях можно прочитать сырое тело запроса (например, JSON или список строк).
$inputLines = file('php://input');
$json = implode('', $inputLines);
$data = json_decode($json, true);
print_r($data);
Array
(
[action] => create
[id] => 123
)
php://input доступен только для POST-запросов с multipart/form-data или application/x-www-form-urlencoded. Для загрузки файлов через $_FILES эта обёртка не применяется.
Пример 7: Сравнение производительности file() и file_get_contents() на большом файле
Для файла размером 100 MB измеряется время и память.
$start = microtime(true);
$array = file('huge_log.txt');
$timeArray = microtime(true) - $start;
echo "file(): $timeArray сек, memory: " . memory_get_peak_usage(true) / 1048576 . " MB\n";
$start = microtime(true);
$content = file_get_contents('huge_log.txt');
$lines = explode("\n", $content);
$timeGet = microtime(true) - $start;
echo "file_get_contents + explode: $timeGet сек";
file(): 0.45 сек, memory: 120 MB file_get_contents + explode: 0.42 сек, memory: 120 MB
Оба подхода потребляют память, пропорциональную размеру файла. Для файлов больше 200–300 MB рекомендуется потоковая обработка с fgets() или SplFileObject.