Q&Aに似たWebサービスを個人で開発しているのですが、
ユーザーからの投稿をどのように実装するかで悩んでいます。
現在は、ユーザの投稿があった時点で投稿ごとのページの
PHPファイルをfopen関数で作成して、
サーバに1週間程度保存するという仕様を考えています。
つまり、投稿があるたびにファイルを作成して、
専用のディレクトリにどんどん貯まっていく形になります。
(ちなみに、写真もページに掲載できるようにする予定ですが、
写真はデータベース(MySQL)に入れることを考えています。)
この「投稿時にPHPファイルを作成し、どんどん貯めていく」
というのは適切な実装の方法でしょうか?
はてな人力検索やOKWaveなどのサイトのURLを見ても、
どういうやり方で実装しているのか想像できませんでした。
(人力検索の各ファイル名はタイムスタンプでしょうか?)
もし「普通はそんなやり方はしないよ」などありましたら、
是非アドバイスを頂けると嬉しいです。
ド素人ですが、よろしくお願い致します。
質問ごとに php を大量生産した場合、php ファイルにエラーがあった場合それら全てに対して編集したファイルをコピーしなければなりません。
数百程度であれば問題無いでしょうが、数万にも及んだ場合はかなり面倒なことになります。
そこで、 Apache の設定に
/USERNAME/QUESTION/index.php
を
q_and_a.php?user=USERNAME&q=QUESTION
として呼ばせるように出来る機能 (mod_rewrite) があります。
こうすれば、質問ごとに php ファイルを大量生産しなくても済みますし、
php ファイルにエラーが出ても、1つのファイルを編集すれだけで全てのアクセスに編集結果が適応されます。
また、バイナリ (JPEG など) をバイナリに入れるの管理が簡単になるかと思いますが、
データベースが無駄に太るのであまりオススメは出来ません。
JPEG のハッシュ値を取り、例えば je74jgjksdr78yt445y895h みたいな値が取れた場合、
img/je/74/jg/jk/sdr78yt445y895h.jpg のようにディレクトリを掘り下げる方法がオススメ出来ます。
これは1つのディレクトリに数万というファイルが集まらないようにするための対策です。
ブログであればユーザーごとにディレクトリを作ってそこに置くべきでしょうが、 Q&A なら
そんなに頻繁に画像をアップされることも無いでしょうから、ユーザーごとのディレクトリは作らなくても
大丈夫かと思います。
【1】古風な方式
回線も細く、サーバーも貧弱(容量数MBでデータベースなども使えず)だった時代は、その方法が主流でした
投稿単位ではなく、スレッド単位(人力検索であれば質問単位に相当)でファイルを作成して、
レス(回答やコメントに相当)はファイルに追記するという手を私も使っていました
最近はGB単位で借りることが出来ますし、サーバーも強力になって、データベースも容易に利用可能な環境が増えてますので、
今風であれば「そんなやり方はしないよ」ということになるかもしれませんが、サーバー負荷を考えて、
「記事は(検索しやすいように)データベースで、写真は(負荷を抑えるために)個別にファイルで保管」という手を、
使う場面もありますので一概にダメというものでもなく実際のところはケースバイケースです
【2】データベースの利便性
ファイルを作成する方法では検索やバックアップの仕組みを用意することが大変になりますが、
データベースであれば苦も無く一瞬で記事の検索もできますし、バックアップも楽です
【3】何を身に付けたいのかによっても選択肢は変わる
(1)phpを身に付けたい?
ゼロから作るのは言語の学習という点で悪くないと思うのですが、時間がかかる割には得るものが少ないとも言えます
特にphpで製作するWEBサイトは必要な関数だけ覚えれば出来てしまうので、作りながらは不適切と言っても良いでしょう
phpを身に付けたいのであればマニュアルにある言語リファレンスを熟読し、関数リファレンスのサンプルをじっくり試してみることが近道でしょう
(2)Webシステムの製作を身に付けたい?
自力でゼロから作るよりも、世にある多くのフリーのシステム(wordpressなど)を使って、
「どこでどのような処理をしているのか?」を紐解いていくほうが早いでしょう
phpについては紐解いていく最中で、必要な関数について学んでいけばいいということになりますが、
言語リファレンスだけは先に身につけておかないと紐解くにも紐解けないので、先に熟読しましょう
以上、ひとまず、ざっくりとです
以下、今のところは雑談です
【4】管理方法 - ここはサイトのHTMLソースコードなどを読んで行った推測です
(1)人力検索
質問投稿、回答、コメントなど全てが1つの連番になっているようです(そのため前後の質問投稿の番号が続き番ではなく飛んでいる)
質問の場合と、回答/コメントの場合でデータベースに登録する際に違いをつけて区別しているようです
(2)OKWave
質問投稿は質問投稿として1つの連番になっていて、回答投稿は回答投稿として1つの連番となっているようです
「でも」すなわち「ファイルとデータベースの両方で平行して管理」は複雑で面倒ですし、
幾人もが読み書きをするシステムにおけるファイル操作は非常に難しくパフォーマンスもよくはありません
データベースを用いた場合は読み書きをデータベース管理システム(MySQLやPostgreSQLなどのこと)が行ってくれますので、
利用者はSQLを投げるだけで済み、誰が作っても「そこそこのパフォーマンス」を出すことはできます
(高いパフォーマンスを得るためにはチューニングが必要なので熟練が必要です)
>動的URLを静的に偽装している
人力検索など多くのサイトで用いられていますね
phpではなくWEBサーバーの方で q.hatena.ne.jp/1290941276 を、
q.hatena.ne.jp/検索php?パラメータ=1290941276といった具合に動的に変換させるだけですから、
php側では特に意識する必要も無く、非常に簡素で済みますし、システムの改変も楽になります
>URL内で値を渡して動的に生成するのが常識的
常識/非常識で選ぶものではなくて、求められた要件にあわせて選ぶものだと認識しておかないと後々面倒です
わざわざファイルとデータベースの二元管理にするよりも、データベースで一元管理したほうが、
簡素でミスも少なく、そこそこのパフォーマンスが得られるとなれば、どちらを選ぶかはおのずと・・・
画像をデータベース内に収めるか、ファイルとして1枚1枚保管するかについては、
記事と写真を常に一緒にして扱うならばデータベース内に収めて一元管理が楽ですし、
記事を無視して画像に直接アクセスされることを前提(画像を直接アクセスされることが多い)とするならば、
画像は単独のファイルで保持するほうが楽です
>システム開発自体が目的
>頭に思い描いてきたこと
「開発が目的」ではなくて「作り上げることが目的」なようですね
開発を行うためには、ある程度はWEBの仕組みから学ばなければなりませんし、
それはphpだけにあらずwebサーバーの動作やクライアントとのやりとりの仕組みなどにも及びます
回答中にも少し書きましたが既存のものを利用することにしたほうがより早く目的に到達することでしょう
phpを覚えれば出来るというものではないと理解しておくと良いでしょう
余談ですが、
「phpを研究」という表現は「phpを深く調べて真髄を追い求める」という重い意味になってしまい、
本来の目的が何であるのかを見えなくしてしまうので、
「phpを学んでいます」くらいの表現にしておいたほうがいいと思います
>それとも、URL内で値を渡して動的に生成するのが常識的なのでしょうか?
わざわざ実ファイルを作成して参照させる理由が分からん。
まぁ、高負荷サイトならわずかなコストでも無視できないからそういうチューニングをする事もあるが。
パフォーマンスが気になるなら、1度目のアクセスで生成結果のキャッシュを作って置いて
次からはキャッシュにアクセスすれば良いんじゃね?
ご回答ありがとうございます。
皆さんのご指摘をうけて、現在、
実ファイルを保持しない実装を検討しています。
私の知識不足のせいで混乱を招いてしまい、失礼しました。
キャッシュについてはまだ頭になかったため、
早速調べたいと思います!
回答1とコメント欄一番上は私「7月の風windofjuly」です
回答7は一文字違いのまぎらわしいIDで私の回答やコメントをコピーして投稿したり、
今回のようなことを繰り返している愉快犯です
回答7の内容には一部納得の部分もあったりはしますが(そこが憎たらしいけど巧い。慣れている人のようだ)、
回答7の投稿者こそがポイントを掠め取るために質問とは関係ないことだけを書いていますので、
不適切な回答者の欄にチェックを入れておくことを勧めます
(先週木曜日に運営に通報したのですが放置状態です。運営は対処してくれないので自分たちでやるしかないです)
なんと、そうだったんですね・・・・。
私も「妙だな」とは感じたのですが、
まさかIDが一文字違いとは・・・。
何度もご回答頂いたのに気付かず、大変失礼致しました。
今後、よく確認したいと思います。
どの回答も大変参考になりました。
ベストアンサーをどの方に差し上げるべきか、大変悩みましたが、
最終的に最も希望に近い答えを下さった方に差し上げました。
また次回、質問させて頂く際にもよろしくお願い致します。