Работа с локальными файлами в PHP: от основ до продвинутых техник
Основные методы работы с локальными файлами в PHP
Наиболее эффективный способ: file_get_contents и file_put_contents
Для большинства задач чтения и записи небольших файлов (до десятков мегабайт) идеально подходят функции file_get_contents и file_put_contents. Они автоматически открывают файл, выполняют операцию и закрывают его.
$content = file_get_contents('example.txt');
if ($content === false) {
// Ошибка чтения
}
echo $content;
$result = file_put_contents('output.txt', 'Новый текст');
if ($result === false) {
// Ошибка записи
}
Include system php (включение системного файла)
Проблемы: при большом размере файла вся информация загружается в память. Ошибка может возникнуть, если файл не существует или нет прав доступа. Для проверки используйте file_exists() и is_readable().
Как обрабатывать файлы большого объема, не загружая их целиком в память?
Решение: fopen + fread / fwrite
Откройте файл в нужном режиме и считывайте данные частями.
$handle = fopen('bigfile.log', 'r');
if ($handle) {
while (($buffer = fread($handle, 4096)) !== false) {
echo $buffer;
}
fclose($handle);
}
Ru reading php line (чтение строки из файла php)
Важно не забыть проверить, что fopen вернул не false. Ошибка при записи может быть из-за отсутствия прав на каталог. Используйте is_writable() перед записью.
Как прочитать текстовый файл строка за строкой?
Решение: fgets
Функция fgets читает одну строку до символа новой строки.
$handle = fopen('lines.txt', 'r');
if ($handle) {
while (($line = fgets($handle)) !== false) {
echo $line;
}
fclose($handle);
}
Php file get html (получение html файла через php)
Проблемы: если файл в кодировке UTF-8 с BOM, первые строки могут содержать лишние символы. Для корректной обработки используйте feof() или проверяйте возврат false.
Как быстро получить все строки файла в виде массива?
Решение: file()
Функция file() читает весь файл и возвращает массив строк.
$lines = file('data.txt', FILE_IGNORE_NEW_LINES);
if ($lines === false) {
echo 'Ошибка чтения';
} else {
foreach ($lines as $num => $line) {
echo "Строка $num: $line\n";
}
}
Php файловая система (работа с файловой системой в php)
Основная проблема: при больших файлах потребляется много памяти. Альтернатива - построчное чтение через fgets.
Как вывести содержимое файла в браузер без загрузки в переменную?
Решение: readfile()
Функция readfile() читает файл и отправляет его напрямую в выходной поток.
if (file_exists('download.pdf')) {
header('Content-Type: application/pdf');
readfile('download.pdf');
}
скачать страницу php (скачать страницу php (файл))
Проблемы: перед вызовом readfile() нельзя отправлять ничего в вывод (пробелы, echo). Убедитесь, что заголовки установлены до вывода.
Как копировать, перемещать или удалять файлы?
Решение: copy, rename, unlink
Эти функции работают напрямую с файловой системой.
if (copy('source.txt', 'backup/source.txt')) {
echo 'Копия создана';
} else {
echo 'Ошибка копирования';
}
if (rename('old.txt', 'new.txt')) {
echo 'Файл переименован';
}
if (unlink('temp.txt')) {
echo 'Файл удален';
}
Edit home php (редактирование файла home.php)
Ошибки: если целевой файл уже существует, copy перезапишет его без предупреждения. rename может не сработать между разными разделами диска.
Как убедиться, что файл существует и доступен для чтения/записи?
Решение: file_exists, is_readable, is_writable
$file = 'config.ini';
if (file_exists($file) && is_readable($file)) {
$data = file_get_contents($file);
} else {
echo 'Файл недоступен';
}
Php количество файлов (подсчет количества файлов в папке в php)
Помните, что is_readable() может дать false для файлов с правами 444 у владельца. Проверяйте пути относительно текущей рабочей директории.
Как работать с CSV файлами?
Решение: fputcsv / fgetcsv
// Запись CSV
$handle = fopen('data.csv', 'w');
fputcsv($handle, ['Имя', 'Возраст', 'Город']);
fputcsv($handle, ['Анна', 25, 'Москва']);
fclose($handle);
// Чтение CSV
$handle = fopen('data.csv', 'r');
while (($row = fgetcsv($handle, 1000, ',')) !== false) {
print_r($row);
}
fclose($handle);
Archive php file (php: работа с архивными файлами (zip, tar))
Проблемы: различные разделители (табуляция, точка с запятой). Убедитесь, что в данных нет неэкранированных кавычек. Используйте второй параметр fgetcsv для ограничения длины.
Как избежать конфликтов при одновременной записи в файл?
Решение: flock (блокировка)
$handle = fopen('log.txt', 'a');
if (flock($handle, LOCK_EX)) {
fwrite($handle, 'Новая запись');
flock($handle, LOCK_UN); // снятие блокировки
}
fclose($handle);
Блокировка работает только внутри одной файловой системы. Не забывайте снимать блокировку. Используйте LOCK_NB для неблокирующей проверки.
Расширенные примеры работы с локальными файлами
Пример 1: Чтение большого файла с буфером и индикацией прогресса
$handle = fopen('largefile.bin', 'rb');
if (!$handle) {
die('Не удалось открыть файл');
}
$output = '';
$bytesRead = 0;
$fileSize = filesize('largefile.bin');
while (!feof($handle) && ($chunk = fread($handle, 8192)) !== false) {
$output .= $chunk;
$bytesRead += strlen($chunk);
$progress = round($bytesRead / $fileSize * 100, 2);
echo "Прочитано $bytesRead / $fileSize байт ($progress%)\n";
}
fclose($handle);
Прочитано 8192 / 1000000 байт (0.82%) Прочитано 16384 / 1000000 байт (1.64%) ... Прочитано 1000000 / 1000000 байт (100%)
Пример 2: Запись в файл с блокировкой и проверкой
$filename = 'counter.txt';
$handle = fopen($filename, 'c+');
if (!$handle) {
throw new Exception("Не удалось открыть файл $filename");
}
if (flock($handle, LOCK_EX)) {
$current = (int)fread($handle, filesize($filename) ?: 1);
rewind($handle);
ftruncate($handle, 0);
fwrite($handle, (string)($current + 1));
fflush($handle);
flock($handle, LOCK_UN);
} else {
echo "Не удалось получить блокировку";
}
fclose($handle);
echo "Значение счетчика увеличено до " . ($current + 1);
Значение счетчика увеличено до 42
Пример 3: Чтение CSV с нестандартным разделителем и обработка ошибок
$handle = fopen('users.tsv', 'r');
if ($handle) {
while (($row = fgetcsv($handle, 0, "\t")) !== false) {
if (count($row) > 1) {
printf("Имя: %s, Email: %s\n", htmlspecialchars($row[0]), htmlspecialchars($row[1]));
}
}
fclose($handle);
} else {
echo "Не удалось открыть файл";
}
Имя: Иван, Email: ivan@example.com Имя: Мария, Email: maria@test.org
Пример 4: Использование SplFileObject для удобной итерации
try {
$file = new SplFileObject('data.txt');
$file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::READ_AHEAD);
foreach ($file as $lineNumber => $line) {
echo "Строка $lineNumber: $line\n";
}
} catch (RuntimeException $e) {
echo "Ошибка: " . $e->getMessage();
}
Строка 0: Первая строка Строка 1: Вторая строка ...
Пример 5: Создание временного файла для промежуточных данных
$tmp = tmpfile();
fwrite($tmp, "Временные данные");
rewind($tmp);
echo fread($tmp, 1024);
fclose($tmp);
Временные данные
Пример 6: Обработка ошибок с исключениями при работе с файлами
function readFileSafe($filename) {
if (!file_exists($filename)) {
throw new InvalidArgumentException("Файл $filename не существует");
}
if (!is_readable($filename)) {
throw new RuntimeException("Файл $filename недоступен для чтения");
}
$content = file_get_contents($filename);
if ($content === false) {
throw new RuntimeException("Ошибка чтения файла $filename");
}
return $content;
}
try {
$data = readFileSafe('config.xml');
echo $data;
} catch (Exception $e) {
echo "Произошла ошибка: " . $e->getMessage();
}
(содержимое config.xml или сообщение об ошибке)
Пример 7: Работа с бинарными данными (чтение метаданных JPEG)
$filename = 'image.jpg';
$handle = fopen($filename, 'rb');
if ($handle) {
$header = fread($handle, 2);
if ($header === "\xFF\xD8") {
echo "Файл является JPEG изображением.\n";
fseek($handle, 2, SEEK_CUR);
$sof = fread($handle, 2);
} else {
echo "Не JPEG файл";
}
fclose($handle);
}
Файл является JPEG изображением.
Пример 8: Использование потоков php://input для чтения POST данных
$input = fopen('php://input', 'r');
$rawData = stream_get_contents($input);
fclose($input);
echo "Получено " . strlen($rawData) . " байт данных";
Получено 1024 байт данных