Насколько быстро PHP читает Excel

Открытое сравнение avadim/fast-excel-reader с основными библиотеками чтения XLSX: сколько времени и сколько памяти уходит на один и тот же файл. Замеры выполняются на реальных файлах в изолированных процессах — и вы можете прогнать тот же тест на собственном файле, без регистрации.

3,38 с FastExcelReader читает 1 000 010 ячеек (6,4 МБ)
×4,15 быстрее, чем PhpSpreadsheet, на том же файле
30,2 МБ пик памяти на этом же чтении
×18,6 меньше памяти, чем PhpSpreadsheet

Что сравнивается

FastExcelReader v3.2.0 потоковая предмет теста

avadim/fast-excel-reader

Потоковый XMLReader поверх ZIP; строки отдаются генератором nextRow().

OpenSpout v5.8.0 потоковая

openspout/openspout

Наследник box/spout. Потоковые итераторы; shared strings кэшируются на диск при нехватке памяти.

PhpSpreadsheet 5.9.0

phpoffice/phpspreadsheet

Строит полную объектную модель книги. Замеряется в режиме setReadDataOnly(true) — без стилей и формул.

SimpleXLSX 1.1.16

shuchkin/simplexlsx

Один класс без зависимостей. readRows() — генератор, но XML листа целиком лежит в SimpleXMLElement.

Результаты на подготовленных файлах

Семь наборов разной формы: от небольшой выгрузки до таблицы на миллион ячеек, отдельно — широкая таблица, отдельно — текст в словаре sharedStrings и тот же текст инлайном. Каждый файл можно скачать и перепроверить результат у себя. Прогон от 22.07.2026, по 5 повторов на замер, показана медиана.

  • Всего 21 замер: 7 наборов × 3 сценария. Чаще всех оказывался самым быстрым SimpleXLSX (14), самым экономным по памяти — OpenSpout (21). У FastExcelReader 5 побед по скорости и 0 по памяти.
  • Попарно с FastExcelReader по всем замерам (медиана отношения): OpenSpout — по времени медленнее в 2,13 раза, по памяти легче в 1,45 раза; PhpSpreadsheet — по времени медленнее в 4,01 раза, по памяти тяжелее в 8,33 раза; SimpleXLSX — по времени быстрее в 1,55 раза, по памяти тяжелее в 2,93 раза.
  • Расход памяти почти не зависит от размера файла у: OpenSpout. Такие библиотеки безопасно ставить туда, где размер входного файла заранее неизвестен.
  • Пик памяти растёт вместе с файлом у: FastExcelReader (×16,5), PhpSpreadsheet (×45,5), SimpleXLSX (×56,6) — разница между самым маленьким и самым большим набором.
  • Один и тот же текст, записанный через словарь sharedStrings, читается не так, как записанный инлайном. По времени на словаре: FastExcelReader — на 23% медленнее; OpenSpout — на 21% медленнее; SimpleXLSX — на 29% медленнее.
  • Словарь sharedStrings дороже по памяти — библиотеки держат его целиком в ОЗУ. Инлайн против словаря: FastExcelReader — 1,8 МБ против 26,5 МБ (×14,5); OpenSpout — 1,3 МБ против 3,2 МБ (×2,50). Если вы сами генерируете файлы для последующего чтения, это заметный рычаг.
  • Стоимость «открыть файл и получить первую строку» на самом большом наборе: FastExcelReader — 566 мс, OpenSpout — 1,24 с, PhpSpreadsheet — 3,65 с, SimpleXLSX — 1,37 с. Это важно для валидации заголовков перед импортом.
Метрика
Время чтения всех строк, медиана
Набор FastExcelReader OpenSpout PhpSpreadsheet SimpleXLSX
small-1k
1 001 × 12, 84,5 КБ
45 мс
×1,70
86 мс
×3,23
174 мс
×6,55
27 мс
medium-20k
20 001 × 15, 2,0 МБ
1,05 с
×1,55
2,27 с
×3,33
4,18 с
×6,14
681 мс
large-100k
100 001 × 10, 6,4 МБ
3,38 с
×1,54
6,95 с
×3,16
14,03 с
×6,38
2,20 с
wide-2k-x-150
2 001 × 150, 2,1 МБ
1,07 с
×1,58
3,16 с
×4,66
4,04 с
×5,95
679 мс
strings-40k-shared
40 001 × 8, 1,9 МБ
1,35 с
×1,50
3,03 с
×3,37
4,51 с
×5,01
900 мс
strings-40k-inline
40 001 × 8, 1,7 МБ
1,09 с
×1,57
2,50 с
×3,58
4,54 с
×6,50
699 мс
numeric-40k
40 001 × 10, 2,6 МБ
1,11 с
×1,60
1,97 с
×2,84
4,96 с
×7,13
695 мс
Сравнивается только чтение данных. PhpSpreadsheet проигрывает по скорости и памяти, потому что строит полную объектную модель документа: стили, формулы, изображения, диаграммы. Там, где эта модель нужна, у него нет замены — а там, где нужно просто прочитать строки, за неё приходится платить. Подробно о методике →

Разбор по наборам

Внутри каждого набора — все три сценария и подробная таблица с минимумом, максимумом и счётчиками прочитанных строк.

Небольшой отчёт — 1 000 × 12

Скачать этот файл ↓

Типичная выгрузка из админки: смешанные типы, немного данных.

84,5 КБ на диске распакованный XML — 850 КБ 1 001 × 12 (по dimension) листов — 1 shared strings — 372 КБ

Чтение всех строк

Основной сценарий: пройти по всем строкам первого листа и получить значения ячеек. Значения не накапливаются в памяти — там, где библиотека умеет отдавать строки потоком, используется поток.

SimpleXLSX лучший
27 мс
FastExcelReader
45 мс ×1,70
OpenSpout
86 мс ×3,23
PhpSpreadsheet
174 мс ×6,55

Открытие + первая строка

Сколько стоит просто открыть файл и получить первую строку. Показывает, обязана ли библиотека разобрать весь документ до того, как отдаст первые данные.

FastExcelReader лучший
11 мс
OpenSpout
16 мс ×1,36
SimpleXLSX
17 мс ×1,49
PhpSpreadsheet
57 мс ×5,02

Весь лист в массив

Весь лист загружается в один PHP-массив. Самый частый способ использования и самый тяжёлый по памяти.

SimpleXLSX лучший
26 мс
FastExcelReader
46 мс ×1,73
OpenSpout
86 мс ×3,23
PhpSpreadsheet
171 мс ×6,47
Все цифры таблицей
Библиотека Сценарий Время (медиана) Мин Макс Пик памяти Прочитано строк Непустых ячеек
SimpleXLSX Чтение всех строк 27 мс 27 мс 27 мс 2,7 МБ 1 001 11 814
FastExcelReader Чтение всех строк 45 мс 45 мс 48 мс 2,0 МБ 1 001 11 814
OpenSpout Чтение всех строк 86 мс 85 мс 87 мс 1,7 МБ 1 001 11 814
PhpSpreadsheet Чтение всех строк 174 мс 174 мс 174 мс 12,3 МБ 1 001 11 814
FastExcelReader Открытие + первая строка 11 мс 11 мс 12 мс 2,0 МБ 1 12
OpenSpout Открытие + первая строка 16 мс 16 мс 16 мс 1,7 МБ 1 12
SimpleXLSX Открытие + первая строка 17 мс 17 мс 17 мс 2,7 МБ 1 12
PhpSpreadsheet Открытие + первая строка 57 мс 57 мс 57 мс 5,7 МБ 1 12
SimpleXLSX Весь лист в массив 26 мс 26 мс 27 мс 2,7 МБ 1 001 11 814
FastExcelReader Весь лист в массив 46 мс 46 мс 46 мс 2,3 МБ 1 001 11 814
OpenSpout Весь лист в массив 86 мс 85 мс 87 мс 2,0 МБ 1 001 11 814
PhpSpreadsheet Весь лист в массив 171 мс 170 мс 172 мс 12,5 МБ 1 001 11 814
Окружение стенда
PHP
8.4.12 (cli)
ОС
Linux 4.19.0-18-amd64 / x86_64
CPU
12th Gen Intel(R) Core(TM) i5-12600
Zend Engine
4.4.12
ext-zip
1.22.6
libxml
2.9.4
Xdebug
не установлен
OPcache
установлен (в воркерах выключен)

Проверьте на своём файле

Загрузите книгу XLSX — те же четыре библиотеки прочитают её на этом сервере, и вы получите ссылку на страницу с результатами. Регистрация не нужна. Файл удаляется сразу после прогона, его содержимое нигде не показывается — в отчёт попадают только размеры, количество строк и тайминги.

Прогон занимает от нескольких секунд до нескольких минут — по 3 повтора на каждый из 12 замеров.

Не загружайте файлы с персональными данными и коммерческой тайной: сервер обрабатывает их обычным PHP-процессом, а ссылка на результаты доступна любому, кто её знает.