ExcelからPHPへの高速インポートの実装

メールマーケティングサービスPechkin-mail.ruで使用されているテクノロジーについて引き続き説明します。 顧客データに関連するサービスの重要なタスクの1つは、このデータをサービスにアップロードすることです。 Pechkinにとって、電子メールアドレス、名前、姓、その他の追加データを含むアドレスデータベースをすばやく簡単にダウンロードすることが非常に重要です。



ツールとして何を使用しますか?



住所データベースをインポートするときに使用される基本的な標準として、Microsoft Excelを使用しました。 説明は簡単です:





アドレスデータベースをインポートする際のユーザーの問題は削除されました。 しかし、ここでは開発自体の問題が発生します。





開発者としての痛み



Excelはオープンソース開発ではなく、独自のソリューションです。 特に2007年以降の新しいバージョン(xlsx)でのデータ形式は簡単ではありません。 PHPはPechkinaで使用されているため、この問題を解決できるライブラリを探し始めました。 しかし、ここで、多くのライブラリがxlsxの読み取りを許可しないという問題に遭遇しました。





PHPExcelライブラリーが注目を集めました。 数年前にSMS24X7.ru sms-mailingサービスで使用しました 。 才能のある開発者であるPetya Sokolov( Petr_Sokolov )は、このライブラリのラッパーを作成し、その多くの欠陥とバグを修正しました。



ライブラリは確かに興味深いものであり、開発されています。 しかし、Pechkinにとっては、私たちとお客様の両方が成長した数年後、リソースに対する壊滅的な要求とファイルの解析に膨大な時間を費やして使用できなくなりました。 たとえば、100,000行を超えるアドレスデータベースを複雑な構造でサービスにダウンロードすることは珍しくありません。 また、ファイルの長さがすでに500,000行で、30 MBを超える「重量」がある場合はどうでしょうか。



そして、私たちは手放されました...



検索したところ 、Stackoverflowで「 makeshiftベンチマーク」の結果を見て、 libxl商用ライブラリを見つけました。



ライブラリはC ++で記述されており、 Ilia Alshanetskyの PHP用の優れたオブジェクト指向拡張機能のおかげで、学習と統合が簡単です(たとえば、現在のソリューションを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
      
      







コンパイルの結果、/ usr / lib / php5 / 20090626 /フォルダーにexcel.soファイルが作成されます。 次に、内容を含むファイル/etc/php5/conf.d/excel.iniを作成します。

 extension=excel.so
      
      







モジュールがインストールされているかどうかを確認し、Webサーバーを再起動します。

 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 />'; } }
      
      







パフォーマンス結果



RAMの必要性の欠如(ファイルのダウンロードと読み取りのプロセスで)は喜んで喜んでいた。





また、Excelファイルの読み込み速度と、さまざまなサイズのアドレスベースでの読み取り速度が向上しています。





これらのテストは、100分の1にN人のサブスクライバーがいるxlsxファイルで実行されました。 実際のアドレスベースはさらに大きく、より複雑であり、速度とメモリ消費の利点はさらに大きく見えます。



ライブラリのコストは開発ライセンスで199ドルですが、信じてください、それは価値があります。 もちろん、Excelファイルをサービスにインポートする問題に直面しているすべての人にお勧めします。



All Articles