Инструменты PHP для открытия файлов: обзор и примеры
Основы открытия файлов в PHP
Наиболее универсальным решением для открытия файла является функция fopen. Она возвращает дескриптор, который затем применяется для чтения, записи и других операций. После завершения работы дескриптор необходимо закрывать вызовом fclose, чтобы освободить системные ресурсы. Этот способ подходит для любых объёмов данных благодаря построчной или буферизованной обработке.
<?php
$filename = 'data.txt';
$handle = fopen($filename, 'r'); // открытие только для чтения
if ($handle) {
while (($line = fgets($handle)) !== false) {
echo $line;
}
fclose($handle);
} else {
echo 'Не удалось открыть файл.';
}
?>
Типичная ошибка: Warning: fopen(data.txt): failed to open stream: No such file or directory при отсутствии файла. Решение: перед вызовом fopen проверить существование файла функцией file_exists() или is_readable(). Также стоит проверять значение дескриптора (как в примере выше).
Как открыть файл для записи, полностью заменяя его содержимое?
<?php
$handle = fopen('output.txt', 'w');
fwrite($handle, 'Новая строка');
fclose($handle);
?>
Режим 'w' создаёт файл, если его нет, и усекает до нуля длины, если файл существует. Используется для полной перезаписи.
Ошибка: случайное уничтожение предыдущих данных. Решение: проверять наличие файла и, возможно, создавать резервную копию перед открытием в режиме 'w'.
Как добавить данные в конец файла без перезаписи?
<?php
$handle = fopen('log.txt', 'a');
fwrite($handle, date('Y-m-d H:i:s') . ' - событие' . PHP_EOL);
fclose($handle);
?>
Режим 'a' (append) устанавливает указатель в конец файла. При этом файл создаётся, если его не существует. Идеально для журналирования.
Если файл уже существует и был открыт в другом режиме, данные могут повредиться. Всегда используется 'a' для дописывания.
Как прочитать всё содержимое файла в одну строку без циклов?
<?php
$content = file_get_contents('data.txt');
echo $content;
?>
Функция file_get_contents возвращает строку или false при ошибке. Удобна для небольших файлов (до нескольких мегабайт), не требует явного открытия/закрытия.
Для очень больших файлов может возникнуть нехватка памяти. Решение: использовать fopen с построчным чтением.
Как прочитать файл, получив массив строк?
<?php
$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
echo $line . '<br>';
}
?>
Функция file() возвращает массив, где каждый элемент – строка файла. Флаги позволяют отбросить символы перевода строки и пропустить пустые строки.
При больших файлах массив может занять много памяти. Альтернатива: построчное чтение через fgets.
Как вывести содержимое файла напрямую в браузер без промежуточной переменной?
<?php
if (readfile('image.jpg') === false) {
echo 'Ошибка при чтении файла.';
}
?>
Функция readfile() читает файл и отправляет его в выходной буфер. Применяется для отправки бинарных файлов (изображения, архивы) пользователю.
Если нужно обработать содержимое перед выводом, readfile не подходит. Используйте fopen + fread или file_get_contents.
Дополнительные сценарии работы с открытием файлов, расширяющие стандартное использование.
Пример 1: Чтение большого файла через генератор
<?php
function readLargeFile($filename) {
$handle = fopen($filename, 'r');
if (!$handle) {
yield '';
return;
}
while (($line = fgets($handle)) !== false) {
yield $line;
}
fclose($handle);
}
foreach (readLargeFile('huge.txt') as $line) {
echo $line;
}
?>
Пояснение: генератор (yield) позволяет обрабатывать файл построчно без полной загрузки в память. Это критически важно для многогигабайтных файлов.
Строка 1 из huge.txt Строка 2 из huge.txt ...
Пример 2: Открытие удалённого файла через HTTP с контекстом
<?php
$options = [
'http' => [
'method' => 'GET',
'header' => "User-Agent: Mozilla/5.0\r\n",
'timeout' => 10
]
];
$context = stream_context_create($options);
$content = file_get_contents('http://example.com/data.txt', false, $context);
if ($content !== false) {
echo $content;
} else {
echo 'Ошибка загрузки.';
}
?>
Пояснение: stream_context_create настраивает HTTP-заголовки, таймаут и метод запроса. Позволяет открывать файлы по URL с нужными параметрами.
Содержимое удалённого файла data.txt
Пример 3: Эксклюзивная блокировка при параллельной записи
<?php
$handle = fopen('shared.txt', 'a');
if (flock($handle, LOCK_EX)) {
fwrite($handle, 'Данные' . PHP_EOL);
flock($handle, LOCK_UN);
} else {
echo 'Не удалось заблокировать файл.';
}
fclose($handle);
?>
Пояснение: flock с флагом LOCK_EX обеспечивает исключительную блокировку. Без этого при одновременной записи из нескольких процессов возможна потеря данных.
(файл shared.txt дополняется без повреждения)
Пример 4: Чтение CSV файла с помощью fgetcsv
<?php
$handle = fopen('data.csv', 'r');
while (($row = fgetcsv($handle, 1000, ',')) !== false) {
print_r($row);
}
fclose($handle);
?>
Пояснение: fgetcsv разбирает строку CSV и возвращает массив полей. Параметр 1000 – максимальная длина строки, ',' – разделитель.
Array
(
[0] => Имя
[1] => Возраст
)
Array
(
[0] => Иван
[1] => 25
)
Пример 5: Создание файла с эксклюзивным доступом (режим 'x')
<?php
$handle = fopen('newfile.txt', 'x');
if ($handle) {
fwrite($handle, 'Уникальное содержимое');
fclose($handle);
} else {
echo 'Файл уже существует или ошибка создания.';
}
?>
Пояснение: режим 'x' создаёт файл только если его нет. При наличии файла fopen вернёт false. Полезно для атомарного создания уникальных файлов.
(новый файл newfile.txt создан)