- PVSM.RU - https://www.pvsm.ru -
Мы продолжаем рассказывать о технологиях, используемых на нашем сервисе email-маркетинга Pechkin-mail.ru [1]. Одной из ключевых задач любого сервиса, связанного с данными клиентов, является загрузка этих данных на сервис. Для Печкина очень важно быстро и без проблем для пользователя загружать адресные базы, содержащие email-адреса, имена, фамилии и другие дополнительные данные.
В качестве базового стандарта, используемого при импорте адресных баз, мы взяли Microsoft Excel. Объясняется это просто:
Проблему пользователей при импорте адресных баз сняли. Но тут возникает уже проблема непосредственно разработки.
Excel — это не open-source разработка, а проприетарное решение. Формат данных, особенно в новых версиях после 2007 года (xlsx), нетривиален. На Печкине используется PHP, поэтому мы начали поиск библиотек, которые позволят нам решить данную задачу. Но тут столкнулись с проблемой, что целый ряд библиотек, не позволяют читать xlsx:
Обратила на себя наше внимание библиотека PHPExcel [2]. Ее мы использовали еще несколько лет назад в сервисе sms-рассылок SMS24X7.ru [3]. Петя Соколов (Petr_Sokolov [4]), наш талантливый разработчик, написал обертку для этой библиотеки, исправляющую ряд ее недостатков и багов.
Библиотека, безусловно, интересная и развитая. Но для Печкина ее использовать стало невозможно уже через пару лет, когда выросли и мы и наши клиенты — ее катастрофическая требовательность к ресурсам и огромное время парсинга файлов. Например, нередки случаи загрузки на сервис адресных баз > 100 000 строк со сложной структурой. А если файл уже 500 000 строк и “весит” больше 30Мб?
В процессе поисков мы наткнулись на коммерческую библиотеку libxl [5], увидев результаты [6] “кустарного benchmark” на Stackoverflow.
Библиотека написана на C++, а благодаря великолепному объектно-ориентированному расширению для PHP от Ilia Alshanetsky [7], легка в освоении и интеграции (например, переписать наше текущее решение на PHPExcel на LibXL заняло около 3 часов). Что очень классно, учитывая, что, к сожалению, документации от разработчика расширения нет и необходимо пользоваться расширением Reflection.
Процесс установки очень прост.
cd /usr/local/src/
wget http://libxl.com/download/libxl.tar.gz
tar zxfv libxl.tar.gz
cd libxl-3.5.4.1/
ln -s include_c include
cd ../
wget https://github.com/iliaal/php_excel/archive/master.zip
unzip master.zip
cd php_excel-master/
./configure --with-excel --with-libxl-libdir=../libxl-3.5.4.1/lib64 --with-libxl-incdir=../libxl-3.5.4.1/include_c
make
make test
make install
В результате компиляции вы получите файл excel.so в папке /usr/lib/php5/20090626/. Теперь достаточно создать файл /etc/php5/conf.d/excel.ini с содержимым.
extension=excel.so
Проверим установился ли модуль и перезагрузим веб-сервер.
php -m | grep excel
service lighttpd restart
В коде все тоже очень просто. Подгружаете файл и читаете необходимые ячейки. Например, вот так:
$doc = new ExcelBook();
$doc->loadFile(‘example.xls’);
for($r=$sheet->firstRow();$r<=$sheet->lastRow();$r++){
for($c=$sheet-> firstCol();$c<=$sheet-> lastCol();$c++){
echo ‘Строка: ’.$r.’ Столбец: ’.$c.’ Значение: ’.$sheet->read($r,$c).’<br />’;
}
}
Отсутствие потребности в оперативной памяти (в процессе загрузки файла и его чтения) приятно порадовало.
А вот и прирост скорости загрузки excel-файла и его чтения на различных размерах адресных баз.
Данные тесты проводились на xlsx-файлах с N подписчиками в один стоблец с email. Реальные же адресные базы еще больше и сложнее и преимущество в скорости и потреблении памяти выглядит еще значительнее.
Стоимость библиотеки 199$ за девелоперскую лицензию, но, поверьте, это того стоит. Безусловно рекомендуем всем, кто сталкивается с проблемой импорта Excel-файлов на свой сервис.
Автор: dsosnin
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/blog-kompanii-pechkin-mail-ru/60962
Ссылки в тексте:
[1] сервисе email-маркетинга Pechkin-mail.ru: http://pechkin-mail.ru
[2] PHPExcel: http://www.codeplex.com/PHPExcel
[3] сервисе sms-рассылок SMS24X7.ru: http://sms24x7.ru
[4] Petr_Sokolov: http://habrahabr.ru/users/petr_sokolov/
[5] libxl: http://libxl.com
[6] результаты: http://stackoverflow.com/questions/18570936/libxl-with-php-excel-read-performance
[7] Ilia Alshanetsky: http://ilia.ws/archives/222-PHP-Excel-Extension.html
[8] Источник: http://habrahabr.ru/post/224207/
Нажмите здесь для печати.