PHP+MySQLによるWebアプリケーションについて、参考意見をお聞かせください。


アプリケーション内で、DB情報やコンフィグ情報など、各ソースファイルで共通のファイルをinclude(require)すると思いますが、
1.どのようなコンフィグファイルにするか?
2.そのファイルをどこに置くか?
3.どのようにファイルを呼び出すか?
という点でいつも悩んでしまいます。

現時点では
1.PHPの連想配列
2.public_htmlより上の階層のどこか
3.require_once('ファイルへのルートパス');
とすることが多いのですが、3が煩わしいです。
ローカルテストと本番とでパスが違うため、わざわざその処理を全ページに書くのも・・・
public_htmlより上の階層とはいえDB情報などを平文で書いているのも少し気がかりです。

皆さんは1~3をどうしていますでしょうか。

回答の条件
  • 1人5回まで
  • 登録:2008/09/15 12:05:50
  • 終了:2008/09/16 16:24:08

回答(5件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402008/09/15 12:47:23

ポイント20pt

1.PHPの連想配列

これはまぁ Apache の環境変数から取得するなりほかの方法もあるけど、あんまり大差ないですね。

結局何らかの方法で最終的にPHPの変数として取り出せることが絶対条件になりますから。

2.public_htmlより上の階層のどこか

これはアプリの作り次第ですが、DocumentRoot と同階層で、Apache の公開ディレクトリでない場所に置きますね。

名前等はまぁわかるようになっていれば特にこだわりはありません。


3.require_once('ファイルへのルートパス');

.htaccess や Apache の設定ファイルで include_path を設定してやればいいです。

もしくはPHP側でも、相対パスで書くことも可能です。

require_once( dirname(__FILE__) . '/../path/to/lib/lib.inc.php' );

とか。

この場合ドキュメントルートからの相対位置が決まっていないとだめですけど。

id:indiana

なるほどhtaccessのinclude_pathならどこからでも同じように参照できますね。

require_once( dirname(__FILE__) . '/../path/to/lib/lib.inc.php' );

のように普通に相対パスで取得するのと速度的には同じ・・・ですかね。

2008/09/15 22:30:34
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/09/15 13:15:02

ポイント20pt

1.どのようなコンフィグファイルにするか?

プログラムの内容によって千差万別です。

一般論としては、共通クラスを外部ファイルに持たせるのがスマートだと思います。


2.そのファイルをどこに置くか?

公開されていない位置であれば十分だと思います。public_htmlより上か下かという問題ではありません。

平文であることを気にされているようですが、メインのPHPスクリプトも平文ですのでリスクは一緒です。

心配でしたら、Zend Guardでスクリプト全体をバイナリ化、暗号化するという手があります。

また、


3.どのようにファイルを呼び出すか?

これも case by case ですが、require_once が一般的ではないでしょうか。


むしろ、「ローカルテストと本番とでパスが違う」ということの方が問題です。

requireでエラーが発生しなかったとしても、プログラムの他の部分にパス指定ミスがあり、本番環境へ移行してからエラーが発生するということが起こり得ます。最も厄介なのが、たまにしか発生しない条件でパス指定ミスの処理に入るケースです。

パスを define しておくなどの工夫が必要です。

id:indiana

1については呼び出す処理が内容によって変わるということですね。

なるほどスクリプト全体を暗号化すると安心ではありますが管理がややこしくなりそうですね・・・そこは妥協しようと思います。

>requireでエラーが発生しなかったとしても、プログラムの他の部分にパス指定ミスがあり、本番環境へ移行してからエラーが発生するということが起こり得ます。

それも起こりえますが、そのミスを無くすためにコンフィグファイルにできるだけこまかくパス設定などを書いておきたいと思います。

2008/09/15 22:38:09
id:fonya3 No.3

fonya3回答回数238ベストアンサー獲得回数102008/09/15 16:53:53

ポイント20pt

拡張子を.phpにしてプログラムと同じ階層においてinclude()するのはいかがでしょうか?

こりゃ、手抜きかもしれませんが、拡張子が.phpなら、万が一直呼びされても白いページが出るだけですので。。。

ダミー:

http://www.2ones.com/geeklog_000/

id:indiana

現在はおっしゃるように「.php」でやっています。

そのphpファイルをrequire等で呼び出す際に、「../」など相対パスで呼び出すと階層が変わった時などに修正が面倒で・・・

その煩わしさをなるべく無くしたいです。

2008/09/15 22:41:18
id:yawaraseisaku No.4

yawaraseisaku回答回数1ベストアンサー獲得回数02008/09/16 02:46:55

ポイント20pt

1.どのようなコンフィグファイルにするか?

php.ini形式のファイルを使用し、

parse_ini_file()関数で呼び出すようにしています。



2.そのファイルをどこに置くか?


public_htmlの外に置いています。



3.どのようにファイルを呼び出すか?


フロントコントローラ形式を使用し、

public_html以下に配置するPHPファイルは、index.phpのみとし、

実際のプログラムは、public_htmlの外に置いておきます。


そのディレクトリについて、


define( "APP_DIR", dirname(__FILE__) . '/../app/' );

と定数定義しておき、このAPP_DIRを使いまわす、という方法をとっています。

$ary_db_info = parse_ini_file(APP_DIR. "config/db.ini");

として、必要な情報を呼び出すようにしています。


もし、各ソースにて APP_DIR. "config/db.ini" という記述をするのが嫌であれば、

グローバルな関数を一つ定義して、そこに記述すればよいのではないでしょうか。

function get_db_info()
{
    return parse_ini_file(APP_DIR. "config/db.ini");
}
id:indiana

parse_ini_fileという関数は知りませんでした。

php.ini形式なら少し見やすいですね。使えそうです。

public_html以下にはindex.phpのみというのは思い切りがいいですね。

2008/09/16 16:21:39
id:t_shiono No.5

t_shiono回答回数256ベストアンサー獲得回数222008/09/16 03:39:06

ポイント20pt

他の方と重なる部分もありますが、

1.どのようなコンフィグファイルにするか?

内容によって変えることが多いです。

DBのアクセス情報など4つ程度で、個々に意味がはっきりしていると、defineしちゃう方が多いですね。

逆に要素数が多いと、配列 or 連想配列なんかに押し込めます。この辺りは利用方法にも依存するでしょう。

2.そのファイルをどこに置くか?

3との兼ね合いもありますが、公開ディレクトリ外ならどこでもいいかと思います。

CakePHPを使うことが多いですが、その他も含めてフレームワークを使うとそれぞれ設定ファイル用のディレクトリがあると思うので、それに準じるのが適当でしょうね。

3.どのようにファイルを呼び出すか?

フレームワークを使わない場合は、ドキュメントルートなど、どのファイルからもアクセス可能な場所にconfig.phpのようなファイルを用意し、

<?php
require_once (実際のパス);
?>

のようにする場合が多いですかね。

それほど重要じゃない定数なんかはここで定義しちゃったりもできますし。

何かの参考になれば。

id:indiana

やはりおっしゃるような形式が一般的のようですね。

CakePHPなどオープンソースのものの構造なども参考にしてみます。

2008/09/16 16:23:44

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません