EC-CUBEにダウンロード販売機能が追加! 大容量ファイルもイケる?
現在、EC-CUBEの開発コミュニティにて新バージョンのEC-CUBE Ver.2.5.0が開発されています。
今回の目玉はプラグイン機能の追加*1、PEAR::DBからPEAR::DB2への切り替えと*2、ダウンロード販売機能、管理画面のxhtml化ではないでしょうか?
特に最近盛り上がっているのはダウンロード販売機能です。
ダウンロード販売機能と言うのは、画像や音楽、動画、電子書籍等のコンテンツやソフトウェアを、購入したお客様に対してダウンロードしてもらって納品するというものです。
今日はその、ダウンロード販売機能について書いてみます。
言うだけ言ってみた。
今年の7月にEC-CUBE開発コミッターのMLに、開発元のロックオン様より下記の様なメールが流れて来ました。
かなり遅れてしまいましたが、EC-CUBE2.4.4のリリースも完了し、前々より
予定しておりました、EC-CUBE2.5の開発を実際に進めていこうと思っております。本メールは、今回の2.5開発作業開始に関するご報告と、作業協力のお願い の
2点でございます!....中略...
上記を実施していただきたく思っておりますが、特に、現段階において、
まずは機能追加のご提案をいただきたく思っております。早速以下、ご提案をお待ちしております。
そこで早速
2.5の機能提案についてですが、早速いくつかご提案です。
■人間用サイトマップ生成機能(○修正難易度:低)
以前コミュニティに要望があり、簡単に実装できたのでどうかな?と思います。当方のソースであれば提供いたします。■ダウンロード販売機能(○修正難易度:中)
提案というか要望になってしまうのですが、クォーレ様が無料で配布されているダウンロード販売機能ですが、本体に組み込めないでしょうか?最近電子書籍等が流行ってきている事もあり、要望が多いです。是非お願いしたいです。
http://ec.cuore.jp/products/detail.php?product_id=4■API(○修正難易度:中)
現在当方で開発している機能ですが、商品情報や店舗情等をHTTPリクエストでxmlやjsonで返すものです。2.5に間に合うかどうかが微妙ですが、間に合えば入れて頂きたいです。■フッターのコピーライト年の自動更新(○修正難易度:低)
単純なSmartyタグで実装出来るので是非。■シンプルなテンプレート(○修正難易度:高)
デザインカスタマイズのベースとなる様なシンプルなテンプレートが欲しいです。
と、その時思いついた希望を返信。
結果、サイトマップは僕が提供する事になり、クォーレさんがダウンロード機能を提供してくれる事になりました。*3
いやー、言ってみるモンですね。
クォーレさんでは既にダウンロード機能を独自に一部フリーで提供されていて、頻繁にアップデートを繰り返しています。*4
なので、新機能にも関わらず既に複数の実績があり改良が重ねられているという素敵な事態です。
大容量ファイルをダウンロードさせるとサーバのメモリを大量消費
早速クォーレさんがコードをコミットされていたので、速攻でチェックしました。
気になっていたのは、ダウンロード方法とアップロード方法です。
と言うのも、以前同様の機能を開発した時に、何も考えずにファイルを出力してしまうと、容量の大きいファイルではメモリが足りずにエラーを起こしていたからです。
PHPの設定で利用可能メモリを大きくすれば動きますが、大容量ファイルのダウンロードには時間がかかるので、ダウンロードが複数重なった時に大変な事になってしまいます。
単純にファイルのURLへリダイレクトしてしまえばPHPでメモリを大量消費する事は無くなりますが、それではURLを知っている人間が誰でもダウンロード出来てしまいます。
「ダウンロード販売」ではクリティカルな問題です。
ではどうすれば良いか?
サーバ側でリクエストしているユーザが、そのファイルをダウンロード出来る権利を持っており、正しいリクエストかどうかを判断して、メモリを節約しながらファイルを出力して上げる必要があります。
クォーレさんのコードではダウンロード可能かどうかのチェックはちゃんとされていましたが、一旦ファイルを丸ごとPHPで読み込んでから出力する形式になっていました。*5
小さいファイルであればこれでも全然問題ありませんが、数MB以上のファイルでは少々メモりを贅沢に使ってしまう事になってしまいます。
なので以下の様に修正を提案。
//ファイルサイズ指定 $zv_filesize = filesize($realpath); header("Content-Length: " . $zv_filesize); set_time_limit(0); ob_end_flush(); flush(); //ファイル読み込み readfile($realpath);
を
//ファイルサイズ指定 $zv_filesize = filesize($realpath); header("Content-Length: " . $zv_filesize); set_time_limit(0); ob_end_flush(); flush(); $fp = fopen($realpath, "r"); while(!feof($fp)) { print fread($fp, round(DOWANLOAD_RATE * 1024)); flush(); sleep(1); } fclose($fp);
に変更します。
ポイントはreadfile()では無く、print fread()を使う所です。
readfile()はファイルを丸ごと読み込んでしまいますが、fread()は指定されたバイトだけ読み込みます。
つまり、「ちょっと読み込んで出力」を繰り返す感じです。
上記のコードでは、ついでにDOWANLOAD_RATEという定数を使って一度に読み込むサイズを変えられる様にしてあります。これでダウンロード速度の指定も出来るので帯域が制限されているサーバとかでも便利になります。
クォーレさんでテストしてみて、問題が無ければ提案した方式にしてくれるとの事でしたので、楽しみに待つ事にします。*6
大容量ファイルのアップロードは?
次に問題になるのが大容量ファイルのアップロードです。
これもダウンロードの問題と一緒で、管理画面から普通にPOSTしてしまうとサーバ側で問題が起きます。
現段階では大容量ファイルのアップロードはFTPソフト等を使ってアップロードするのが現実的な様です。*7
EC-CUBE 2.5.0は年末リリース?
現状のロードマップでは、
- EC-CUBE 2.5.0 α版(2010年9月末 完了予定)
- 機能面をFIX
- ナイトリービルド版(コミュニティ版)との統合
- 基本機能部分の作成
- 各種機能の追加
- 機能面をFIX
- EC-CUBE 2.5.0 β版(2010年11月目処)
- EC-CUBE 2.5.0 RC版-正式版(2010年中目処)
- 不具合修正後、正式リリース(RC版以降、基本的に仕様の変更は行いません。)
となっています。
予定通りに行けば年末か年始ごろに正式版がリリースされる予定です。
このダウンロード機能が追加されれば、様々なコンテンツ販売がグッとしやすくなります。
また、商品説明のPDFファイルのダウンロード等もカンタンに提供出来る様になるので、「ダウンロード販売」以外でも色々役に立ちそうですね。
いやー楽しみです。
*1:コミュニティ版では既に実装されています。
*2:大河内さん、本当にお疲れ様です。
*3:開発コミュニティでのやりとり: http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=6489&forum=5
*4:出しっぱなしじゃなくて、無償で配布している物もちゃんとメンテされている所が素晴らしいですね。
*5:実際に開発環境下でテストコードを下記、ダウンロード中のメモリの使用量をチェックしてみました。
*6:2.5.0のリリースまで待てない方は、是非テストしてみてください。開発SVNからチェックアウトできます。
*7:FTPで大きいファイルをアップロードした場合は管理画面ではなく、CSVでファイル名を指定して商品登録を行うフローの様です。