japan.internet.comThe Internet & IT Network
RSS
  • ニュース
  • コラム
  • リサーチ
  • ヘッドライン
  • 特集
  • ブログ
  • プレスリリース
  • 専門チャンネル
  • イベント
  • ランキング
  • ニュースメール
2008年9月6日
文字サイズ文字サイズ小文字サイズ中文字サイズ大
デベロッパー2008年7月22日 10:00

PHP、MySQL、JavaScriptによるセキュアなインターネットファイル共有システムの作成

海外海外internet.com発の記事
  • このエントリーを含むはてなブックマーク
  • この記事をクリップ!
  • Buzzurlにブックマーク
  • Yahoo!ブックマークに登録
  • newsing it!

はじめに

 私は最近、いつもの共有ディレクトリメカニズムを使ってファイル共有を実装することに嫌気がさしてきました。管理者レベルで定義するアクセス権が多すぎるだけでなく、異なるオペレーティングシステム間でファイルを共有するためのあらゆる処理が必要になります。その上、インターネット接続しか使用できないとしたらどうでしょう。もちろん、EメールやFTPを使うことはできますが、必ずしもスマートな解決策ではありません。

 そこで、ようやくPHPを使う気になったのです。次のことをすべて実行するPHPファイル共有プログラムを作成しました。

  • ブラウザでファイルをアップロード/ダウンロードする
  • これらのファイルをメタデータと一緒にリレーショナルデータベース管理システム(Relational Database Management System:RDBMS)に格納する
  • 可能な場合はファイルを暗号化して圧縮する
  • ファイル整理に関しては階層アプローチ(ディレクトリ)を避け、ファイルにラベルでタグ付けをし、まったく異なる方法で分類する
 基本的なプログラムを完成させた後、次の最適化ガイドラインに従ってプログラムをアップデートしました。

  • コード行数を削減する
  • 一般的なRDBMSを使う
  • HTMLコードを切り離し、できれば、自分よりももっと詳しい人に託す
  • 言語を混在させずにJavaScriptポップアップとのインタラクションのワークフローを短くする
 本稿では、インターネット上でのファイル共有の実践例として私なりに最適化したPHPプログラムを紹介します。ここでは、オープンソースのライブラリとフレームワークを統合して、データベース抽象化レイヤを使い、アプリケーションロジックをプレゼンテーションから切り離す方法を実証します。MVC(Model Control View)パラダイムの非常に優れた実装というわけではありませんが、オープンソースの各種ヘルパパッケージの統合がどのように働き、いかに負担を軽減するかを示します。

必要なもの

  • PHP 5.Xモジュールが組み込まれた稼働中のApache 2.Xインスタンス
  • PHPがサポートするRDBMSデータベース(この例ではMySQL 4.Xを使用)
  • PEAR
  • Smartyパッケージ
  • overLIBパッケージ
  • インターネット接続

クイックスタートのためのインストール手順

 このサンプルプログラムのサーバーインフラストラクチャには、PHPコードを実行できるWebサーバーが必要です。また、選択したRDBMSのサポートによってPHPインタープリタをコンパイルする必要があります。この場合は、LAMPフレームワーク、つまり、Linux(Debian)、Apache、MySQL、そして言うまでもなく、PHPを選びました。次のインストール手順は、Apache 2.X、PHP 5.X、MySQL 4.Xがインストールされ、インターネット接続が確立されていることを前提とします。

 始めに、本稿のサンプルコードをダウンロードし、次のコマンドを実行してWebサーバーのドキュメントルート(以降、[document_root])下に「file_sharing.zip」ファイルを解凍します。

unzip file_sharing.zip

PEAR MDB2のインストール

 PEARパッケージをインストールするには、PHPバージョン4.3.0またはそれ以上をインストールした場合に利用したインストーラが必要です。

pear install MDB2
pear install MDB2#mysql

Smartyのインストール

 Debian環境にSmartyテンプレートエンジン(Smartyについては後で詳しく説明します)をインストールするには、次のコマンドを実行します。

apt-get install smarty
 他のLinuxシステムを使用している場合は、次の手順に従います。

  1. Smartyの最新バージョンをダウンロードします。
  2. 選択した任意のディレクトリ(/usr/localなど)に、ダウンロードしたファイルを解凍します。本稿では、このディレクトリを[installation_dir]と表します。
  3. ディレクトリ[installation_dir]/smarty/templates_cと、[installation_dir]/smarty/cacheを作成します。

overLIBのインストール

 次に、overLIB JavaScriptライブラリをインストールします(overLIBについては後で詳しく説明します)。

  1. overLIBのzipファイルをダウンロードします。
  2. [document_root]ディレクトリに変更し、次のコマンドを実行します。
  3. mkdir overLIB
    cd overLIB
    
  4. overLIBのzipファイルを解凍します。

MySQLのインストール

 次のコマンドを実行してMySQLデータベーススキーマを作成します。

mysqladmin -u[user] -p[password] <file_sharing.sql

構成変数の設定

 ダウンロードしたソースコード内のファイル「inc.config.php」に示されているように、ローカルインストールに固有のグローバル変数があります。これらの変数を次の表1の推奨値に従って設定します。

表1 構成変数の推奨設定値
変数
$smarty_include_path[installation_dir]/smarty/libs
$pear_include_pathPEARをインストールする場合のMDB2.phpファイルのコピー先
$overlib_path/overLIB
$template_dir[document_root]/file_sharing/smarty/templates
$config_dir[document_root]/file_sharing/smarty/configs
$cache_dir[installation_dir]/smarty/cache
$compile_dir[installation_dir]/smarty/templates_c
$dsnmysql://db_user:db_password@db_server/file_sharing
 以上のインストールをすべて完了したら、http://yourserver/file_sharing/file_sharing.phpを呼び出し(図1を参照)、ファイルのアップロードを始めることができます(図2を参照)。

図1 ファイル共有アプリケーションのホームページ。アップロードされてタグ付けされたファイルと、使用されているタグのリストが表示される。
図1 ファイル共有アプリケーションのホームページ。アップロードされてタグ付けされたファイルと、使用されているタグのリストが表示される。
図2 ファイル共有アクションのポップアップ。ファイルをクリックするとポップアップが表示される。
図2 ファイル共有アクションのポップアップ。ファイルをクリックするとポップアップが表示される。
著者注
 Internet Explorerバージョン6および7は、W3Cの推奨とは逆に、ボタンの値ではなく、ボタンの内部テキストを送信します。そのため、本稿のサンプルでこれらのバージョンのIEを使いたい場合は、CSSのメリットの一部が犠牲になりますが、.tplファイル内のすべての<button>インスタンスを<input>で置き換える必要があります。

コードの解説

 PHPコードはこのサンプルの「接着剤」となる部分です。ソースコードのアプリケーションルートディレクトリ下には4つのPHPファイルがあります。メインファイルは「file_sharing.php」で、このファイルによってインクルードされる他のすべてのファイルに「inc.*.php」という名前を付けることにしました。

 ローカルインストールに固有のグローバル変数はすべて「inc.config.php」に入れました。つまり、本稿のダウンロードファイル(zipファイル)を解凍した後、このファイルに変数を適切に設定することでファイルを環境に適応させることができます。

 「inc.vars.php」ファイルには、PHPセッション開始メカニズム(ここでは、タグソートとファイルソートのメソッドプロパティを渡す目的にのみ使用)と、便宜上必要なその他のグローバル変数、およびすべてのSmartyテンプレートに有効なグローバルな代入が含まれています。

 「inc.util.php」ファイルには、主にコードの行数を削減することを目的とするいくつかのユーティリティ関数が含まれています。一部のルーチンはデータベースアクセスを実装するので、データベース抽象化レイヤの使用例として注目に値します。これらの関数はPEAR MDB2 APIを使ってMySQLにアクセスします(このアプローチの長所については、次のセクションで実装例を取り上げながら詳しく説明します)。

 「file_sharing.php」ファイルは、すべてのHTTP要求を処理してGETメソッドまたはPOSTメソッドから渡された変数を構文解析する中心ファイルです。処理を構文解析した後、プログラムはイベントの管理に必要なデータをすべて取得して、そのデータをSmarty構造に割り当て、表示します。

PEARによるデータベース抽象化

 PEARは、PHP開発をスピードアップできるPHPライブラリ(パッケージ)の巨大なリポジトリです。このプログラムでは、メインのPEARパッケージは、データベース抽象化の最新ソリューションであるMDB2ライブラリです。この例ではMySQLデータベースを使いますが、このソリューションはコードに少し変更を加えるだけで、他の環境(例えば、Oracleをデータベースとする企業など)でも実行できます。MySQLの関連するPEARコンポーネントをインストールした後で別のデータベースを使用するために必要なことは、「inc.config.php」内の$dsn変数の値を変更することだけです。この変数には、DSNのドキュメンテーションに記載されているルールに従って有効なデータソース名(Data Source Name:DSN)を入れる必要があります。

 MySQLに使用したDSNは次のとおりです。

$dsn = 'mysql://user:password@mysql_server/mysql_db_name
 つまり、データベース呼び出しはすべて、基礎となっているデータベースに関して完全に透過的です。

 MySQLの代わりに別のデータベースを使いたい場合は、同じデータベーススキーマを作成する必要があります。もちろん、ファイル「file_sharing.sql」は有効ではありませんが、このファイルには、別のRDBMSを使ってデータベースを構成するために変換しなければならないSQLステートメントが含まれています。

ファイルの暗号化による機密保護

 このファイル共有アプリケーションの例では、128ビットキーのAES(Advanced Encryption Standard)アルゴリズムを使って、パスフレーズを暗号化形式(RFC 3174セキュアハッシュアルゴリズムに記載されているSHA1 160ビットチェックサムを使用)で保存することで、ファイルを必要に応じて暗号化形式で保存することができます。暗号化されたファイルの操作には必ずこれらのパスフレーズが必要なので、次の重要なガイドラインを覚えておきましょう。

  • パスフレーズを失うとファイルをダウンロードできなくなるので、MySQLコマンドでファイルを削除しなければなりません。さらに、データとパスフレーズは平文でインターネット上を移動します。対応策として、インターネット上で送信する前に、JavaScript関数を使ってローカルでデータの暗号化とパスワードのハッシュ化を行うことをお勧めします。
  • MySQLの代わりに別のデータベースを使いたい場合は、PHPコードで暗号化とハッシュ化に使用されているMySQL関数を同等の関数に置き換える必要があります。

Smartyの内容と働き

 Smartyを専門用語で言えば、テンプレートエンジンです。要するに、開発者が標準的なサイトレイアウトを維持しながらプレゼンテーションからロジックを切り離すことを簡単にできるようにするフレームワークです。多くのオンラインディスカッションフォーラムで、SmartyはMVCパラダイムの最小限の有効な実装かどうかという議論が繰り広げられていますが、私自身の考えでは、Smartyは経験の浅い開発者がコードとプレゼンテーションの分離を実現するための抜け道です。

 Smarty自体は基本的な構文を持つプログラミング言語です。前述のフォーラムで議論されているように、プレゼンテーションロジックを持つプレゼンテーションエンジンが必要だと考える人もいるようです。個人的には、ビジネスロジックとプレゼンテーションロジックの両方が存在すると考えます。つまり、プレゼンテーションロジックの乱用はよくないと思う場合でも、両方のロジックを受け入れることは可能です。実際、PHPコードによって、最終的な変数の代入をできる限り多く処理する必要があり、結局のところ、SmartyテンプレートはHTMLファイルを保たなければなりません。

 Smartyをインストールするには、2つのディレクトリ(templatesとconfigs)を作成する必要があります。一般に、これらの2つのディレクトリはWebサーバードキュメントルートの外に置く必要がありますが、この例ではアプリケーションルートの下に入れました(smarty/templatesとsmarty/configs)。smarty/templatesディレクトリには、拡張子が.tplであるすべてのSmartyファイルを入れます。結局、Smartyファイルは、PHPコードによってコンテンツの割り当てと受け渡しが行われる単なるHTMLファイルです。

 すでに説明したように、Smartyには、プレゼンテーションロジックの簡単な管理に役立つ基本的な構文が用意されています。{include ...}という便利な構成体を使うと、複数のテンプレートの共通部分を1つのマスタテンプレートに埋め込むことができます。私は、PHPファイルと同じ命名スキーマを採用し、HTMLページの部分的なパーツを表すファイルに「inc」という接尾辞を使いました。このモジュール式メカニズムでは、Smarty/HTMLテンプレートの作成を始める前に、ページレイアウトを作成する必要があります。たとえば図3のスキーマは、この例で「files.all.tpl」ページと「files.tag.tpl」ページに使用しているスキーマです。Smartyファイルの編成と命名規則はこのスキーマを反映しています。

図3 テンプレートのレイアウトスキーマ。Smartyファイルの編成と命名規則はこのスキーマを反映している。
図3 テンプレートのレイアウトスキーマ。Smartyファイルの編成と命名規則はこのスキーマを反映している。
 Smartyが実際に動作するかを確認するため、複数の連想配列から成るインデックス付き配列をPHPからSmartyに渡す処理を分析しましょう。特に、「inc.util.php」内の関数ファイルが、データベースに格納されているファイルのリスト作成を処理します。行$file_array=db_query($dsn,$sql)$file_arrayが、SQLクエリから返されたインデックス付き配列です。各要素は行を表しますが、これはクエリフィールドに等しいキーを持つ連想配列です。コードをもう少し進むと、Smarty構造に割り当てられる行があります。これらの行の例を次に示します。

$smarty->assign('file_array', $file_array);
 最後に、次の行があります。

$smarty->display('files.all.tpl');
 これらの命令は、ファイル「files.all.tpl」内の規則に従ってHTMLページをレンダリングする制御をSmartyに送ります。このファイルには「inc.file_list.tpl」が埋め込まれ、そこに次の行があります。

<ol class="core">
{foreach item=file from=$file_array name=file_loop}
<li class="core_left">
{if isset($file.protection)}
   ... 
    <input class="core" type="checkbox" name="select-{$file.id}" 
           value="yes" disabled="disabled"/>
   ... 
 いくつかの構文構成体が記述されていることがすぐにわかるでしょう。たとえば{foreach ... }は、インデックス付き配列に対して繰り返し処理を行います。また、この例から、連想配列内の要素を参照する方法もわかります。{$file.protection}$file['protection']に対応し、{$file.id}$file['id']に対応します。

overLIBとポップアップメニュー

 PHPコードがサーバーサイドですべての処理を行わなければならない場合は、ワークフロープロセスが長くなりすぎるかもしれません。インタラクションを若干短縮するソリューションとしてJavaScriptのポップアップがありますが、JavaScriptを構成に挿入すると、許容しがたいエントロピーが生じて、ビジネスロジックとテンプレートロジックとの分離が著しく損なわれます。Smartyには、overLIBという非常に便利で強力なJavaScriptライブラリが埋め込まれています。SmartyのWebサイトによると、overLIBは「小さいポップアップ情報ボックスでWebサイトを拡張するために作成されたJavaScriptライブラリ」だそうです。

 Smartyは、overLIBを非常に単純な{popup ... }という構成体と統合します。ファイル「inc.file_list.tpl」で、overLIBの実際の使用例を見ることができます。

{include file='files.pop.tpl' assign='filePop'}
...
<a href="{$smarty.server.PHP_SELF}?id={$file.id}&not_crypted=1" 
{popup 
    trigger=onClick
    width=360
    sticky=true 
    caption='Action'
    closeclick=true
    text=$filePop
}
>{$file.filename}</a>
... 
 このコード例は、overLIBポップアップを1つの命令に接続する方法を示しています。ここに示したすべてのoverLIBパラメータを設定することで、ポップアップ用のHTMLコードを別のファイル「files.pop.tpl」に分離することができます。

PHPコードの改良

 コーディング中に適切なインデントやスペーシング規則を設定することはなかなか大変です。この目的には、PEAR PHP_Beautifierが大いに役立ちます。インストール方法は次のとおりです。

pear install PHP_Beautifier
 使用するときには、コマンドラインで次のコマンドを実行します。

php_beautifier [some_file].php --output new_file.php
 出力結果の「new_file.php」ファイルは適切に整形され、読みやすさが大きく向上します。

 さらに、PEARには、一連のコーディング標準も用意されています。たとえば、フィルタのメカニズムを使ってコードをフォーマットするには、次のように実行します。

php_beautifier --filters "Pear()" [some_file].php --output new_file.php
 私はもともと、自分の専門外であるHTMLやCSSのコーディングを避けて、経験豊富なグラフィックデザイナにプレゼンテーションを簡単に任せられるようにするために、小さいインターネットファイル共有アプリケーションのプレゼンテーションをロジックから切り離す方法を探していました。そこで結果的にできあがったのが、データベース抽象化レイヤを使い、オープンソースのライブラリとフレームワークを取り入れてHTMLのデザインをPHPプログラミングから切り離した実践例です。この例を活用することで、ユーザーが安心してファイルを共有し、タグとメタデータでファイルを分類できるインターネットファイル共有アプリケーションを作成することができます。

著者紹介

Roberto Giorgetti(Roberto Giorgetti)
イタリアに拠点を置くITマネージャ、テクニカルライター。主にビジネス分野と工業分野でオープンソースの開発に従事。核工学の学位を持つ。
このエントリーを含むはてなブックマーク この記事をクリップ!
BuzzurlにブックマークBuzzurlにブックマーク Yahoo!ブックマークに登録
最新トップニュース
データメーション
【データメーション】
OSについて気に入らないこと(9月5日)
ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」
【ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」】
「導入期〜成長期へ!一歩一歩と前進を目指す『Annoii(アノイ)』」/maka hou,Inc.(9月5日)
最新テクノロジーの意外な処方箋
【最新テクノロジーの意外な処方箋】
グリッドコンピューティング技術でETに遭遇(9月5日)
Graphic Design Forum
【Graphic Design Forum】
古い Emigre を探して (9月3日)
エンジニアの独り言
【エンジニアの独り言】
データをローカルに保存するWebアプリケーション(8月22日)
デスマーチからの脱却
【デスマーチからの脱却】
30min. iPhoneアプリリリース(8月18日)
最新ハイテク講座
最新ハイテク講座
なぜ勝った? 世界No.1シェアをつかんだ“Windows”(9月5日)
developer.com
developer.com
デザインパターンの使い方: Composite(9月5日)
最新アフィリエイト事例にみる成功の法則
最新アフィリエイト事例にみる成功の法則
コンバージョンレートを高めよう!(9月5日)
百式のネットビジネス研究
百式のネットビジネス研究
ガジェット購入時に将来の買取保証プランを提供する「TechForward」(9月5日)
週刊-サイト別アクセス状況データ
週刊-サイト別アクセス状況データ
ビデオリサーチインタラクティブ調査(月間インターネットオーディエンスデータ)(9月4日)
「IT の耳」
「IT の耳」
【書評】『検索にガンガンヒットさせる SEO の教科書』――SEO テクニックで効果的に PR する(9月4日)
検索エンジンマーケティング
検索エンジンマーケティング
果たしてモバイル SEO は必要なのか?(9月4日)
Eメールマーケティング事情
Eメールマーケティング事情
読者が迷惑メールと認識する時…(9月3日)
日本と韓国のインターネットビジネス最新動向調査
日本と韓国のインターネットビジネス最新動向調査
日本と韓国の動画サイト比較1―現状(9月3日)
SNSをビジネスに活用しよう
SNSをビジネスに活用しよう
「しまじろう」に学ぶ企業内コミュニティの活性化のポイント(9月2日)
海外のインターネットコムアメリカ韓国ドイツトルコ
Copyright 2008 Jupitermedia Corporation All Rights Reserved.http://www.internet.com/