- 締切済み
新規データをHTMLファイルへ書き込み
こんばんは。お世話になっております。 以前、以下のページにて質問をさせていただきました。 http://oshiete1.goo.ne.jp/qa4103031.html http://oshiete1.goo.ne.jp/qa4085773.html 以上は、DBを使わずテキストファイルへに登録されているデータを、PEARやSmartyなどを利用せずにベースとなるhtmlを参照して、指定した場所にデータを書き込む、といった内容で質問させて頂いた次第です。 ※書き込まれたhtmlファイルのイメージは、掲示板のスレッド一覧といった感じで、10件表示としており、50件のデータがある場合は4つのファイルを別名で生成・データ書き込みをしています。 そこで、今回ご指導頂きたいのは、現在、テキストファイルに保存したデータは、プログラム実行時にfor文を用いて、以前ご指導いただいたようにhtmlファイルを生成しているのですが、データの追加があった際、その都度新規にて1からファイルを生成している(ファイルを作り直している状態)ため、データが多くなったとき、ソースの記述内容にも夜と思いますがプログラムが実行・完了するまでに時間がかかり、タイムオーバー?となってしまいます。 前置きが長くなってしまいましたが、 1.以上のような流れを考えた場合、どのようなアルゴリズム?が適切なのか? 2.タイトルにあるように、既に生成されたhtmlファイルにデータを追加する場合は、どのようなプログラムになるのか? が、ここ数週間考えては調べ・・を繰り返していますが、イメージがわかずに立ち止まっております。 少々分かりにくい説明になってしまいましたが、ご指導いただければ幸いです。お忙しい中恐縮ですが、宜しくお願い申し上げます。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- foreach
- ベストアンサー率51% (43/84)
ファイル書き込みなんて相当やってないんですが、レスが付いてないようなので書いておきます。参考程度にしてください。 >その都度新規にて1からファイルを生成している(ファイルを作り直している状態) お気づきの通り、これが効率悪化の最大要因です。 PHPのfopen関数でテキストファイルをオープンしてると思いますが、モードは何を使われてますか? 参考URLにマニュアルの該当ページを貼り付けましたが、ここにあるようにモードを「a」でオープンすることで、ポインタがファイルの末端に行くので、いちいちファイルを作り直す必要は無くなると思います(要するに追加書き込み)。 >2 すみません。「書き込み」の意図がわかりません。 既にサーバー側に存在するHTMLファイルに対してfopenして内容を変更して「上書き保存」するってことでしょうか? そもそもそういう事を極力しないためにPHPのようなサーバーサイドがあるんですが・・・ どうしてもやりたいのならHTMLの構造解析をする必要があります。 そういうライブラリを探してきてHTMLを構築してファイルとして保存するなり、smarty等のテンプレエンジンを使ってHTMLを作って保存するなりが簡単かと思います。 前にも似たような質問に同じ返答をしましたが、レスポンスを気にされるほどの人気掲示板なのであればデータベース対応にするのが手っ取り早くて確実だと思います。
- 参考URL:
- http://jp.php.net/fopen
お礼
foreachさま はじめまして、こんばんは。ご親切なご対応を有難う御座います。 foreachさまのレスを見てから、色々とイメージしようとしていますが、正直なかなかイメージすることが出来ません。 以下が、質問にある“作り直し”をしている箇所の一部ですが、例えば、スレッド一覧が10件表示ずつの場合、既に8件が表示されていて、3件の書き込みがあったとき、2件を8件の後に追加。1件を新しいファイルを生成→1件の書き込み。とさせたいと思っているのですが、既に表示のある、8件の終わりを取得?するために、どうしたら良いのかが分かりません。モードを「a」とする意味は分かるのですが・・・知識不足ですみません。 ちなみに、以下が現在記述してあるソースです。 $addfname = "../../category/".$file_data_no.".html"; //$file_data_no書き込み(修正)すべきファイルが複数あるため、変数に代入されたファイルを指定しています。 $addstr = file_get_contents($addfname); $fp=@fopen("$addfname","r"); $no = ''; if($fp){ $main = ""; while (!feof($fp)){ $no++; $main .= fgets($fp,1000); } } //変数$up_fileに、配列として代入されたデータ(掲示板でいうスレッド一覧)を、<!--list_start--><!--list_end-->で括られた箇所に書き込むようしています。 $main = mb_ereg_replace('<!--list_start-->.+?<!--list_end-->', "<!--list_start-->$up_file<!--list_end-->", $main); $fp=fopen("../../category/".$category_file.".html","w"); fputs($fp,$main); fclose($fp); 以上、仰るようにDBを用いてやりたいところですが、これも知人に頼まれての事でして、勉強の意味も含め引き受けてのことです。お忙しい中、お手数お掛けし恐縮ですが、今一度ご指導のほど頂戴出来れば幸いです。