Hatena::ブログ(Diary)

EC-CUBEのカスタマイズならクロスキューブ!サイト制作メモ このページをアンテナに追加 RSSフィード Twitter

2010-09-13

EC-CUBEにダウンロード販売機能が追加! 大容量ファイルもイケる?

EC-CUBEでepub,PDF,mp3などもダウンロード可能に現在EC-CUBEの開発コミュニティにて新バージョンEC-CUBE Ver.2.5.0が開発されています。
今回の目玉はプラグイン機能の追加*1PEAR::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リクエストxmljsonで返すものです。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は年末リリース

現状のロードマップでは、

となっています。

予定通りに行けば年末年始ごろに正式版がリリースされる予定です。


このダウンロード機能が追加されれば、様々なコンテンツ販売がグッとしやすくなります。

また、商品説明の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からチェックアウトできます。

*7FTPで大きいファイルアップロードした場合管理画面ではなく、CSVファイル名を指定して商品登録を行うフローの様です。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/xross-cube/20100913/p1
リンク元