Работа с локальными файлами в PHP: от основ до продвинутых техник

Раздел: Разработка на 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 для неблокирующей проверки.

- Php локальный файл (работа с локальными файлами в php)
- Php tmp files (временные файлы php)
- Php управление файлами (управление файлами в php)

Расширенные примеры работы с локальными файлами

Пример 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 байт данных

Работа с локальными файлами в PHP - comments

En
Php локальный файл (php)