October 12, 2023

Работа с большим файлом .csv на ходящемся на сервере

На сервере PHP есть довольно большой файл .csv (таблица) размером в 500 и более мегабайт. Нужен код PHP для считывания этого файла .csv и отправки клиенту javascript данных из файла примерно по 10 - 50 строк.

Работа с таким большим файлом .csv может быть вызовом из-за ограниченных ресурсов сервера и времени выполнения. Однако, можно использовать стратегию построчного чтения файла и пошаговой отправки данных на клиентскую сторону. Вот как это можно сделать:

Серверная сторона (PHP):

<?php

// Открываем файл для чтения

$filename = 'путь_к_файлу.csv';

$file = fopen($filename, 'r');

// Пропустим первую строку (если она заголовок)

fgets($file);

// Определим количество строк для отправки на клиентскую сторону за один запрос

$linesPerRequest = 10;

// Считываем и отправляем строки на клиент по $linesPerRequest за раз

while (($line = fgetcsv($file)) !== false) {

$data = [];

for ($i = 0; $i < $linesPerRequest && $line !== false; $i++) {

$data[] = $line;

$line = fgetcsv($file);

}

echo json_encode($data); // Отправляем данные на клиент

ob_flush();

flush();

sleep(1); // Небольшая пауза между запросами

} // Закрываем файл

fclose($file);

?>

Клиент js использует технологию async await fetch

Клиентская сторона (JavaScript):

async function fetchData() {

const batchSize = 10;

let allData = [];

let start = 0;

while (true) {

const response = await fetch('путь_к_php_скрипту.php');

const data = await response.json();

if (data.length === 0) { break; }

allData = allData.concat(data);

if (allData.length >= start + batchSize) {

// Обработка полученных данных (allData.slice(start, start + batchSize))

// Например, добавление в таблицу, вывод на страницу и т.д.

start += batchSize;

}

}

}

fetchData();

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