PHPはサーバサイドスクリプトなので、hogehoge.phpというファイルにスクリプトが書かれている場合、クライアントがそのファイルにアクセスする度にサーバ側でスクリプトの処理が行われhtmlが生成され、クライアントのブラウザが解釈し、表示します。
作ったPHPファイル内のスクリプトがサーバにかける負荷が大きかったり、スクリプトでの処理結果が出るまでに時間がかかってしまう場合があります。
そんな時、私はhogehoge.phpを別のPHPから呼び出し、hogehoge.htmlをサーバに作成してしまい、クライアントからはhogehoge.htmlを呼ぶようにしています。
PHP1ファイルでDBやテキストファイルへのアクセスを複数回したり、SQLをループで何回も投げたりする場合で、且つスクリプト部分から呼び出されるデータがそれほど頻繁に変更がかからない場合などに有効かと思います。
要は、データに変更がかかった場合のみ、自動生成のためのPHPにアクセスしてボタンをぽちっと押してやるとデータ変更が反映されたhtmlがサーバに作られるというものです。
流れとしては、
1.あらかじめサーバ内にファイルが作られる場所を確保する。
2.クライアントに見てもらいたいファイル、つまり行いたい処理が書かれたPHP(仮にhoge.php)を作る。
3.ボタンを押すとファイルが作られる処理を書くPHP(仮にcallhoge.php)を作る。
4.ボタンをぽちっと押す。
5.スクリプト処理が終わったhtmlが作られる。
こんな感じです。
1.のディレクトリは書き込み権限を許可しておかないと怒られます。
hoge.phpの内容は当然その時それぞれ人によって違うので、ここではcallhoge.phpのソースをのせます。
<?php
//POSTされた値を受け取る
$create = htmlspecialchars($_POST['create'],ENT_QUOTES);
//生成場所
$savepath = "/var/www/html/dirhoge/";
//POSTされたか否か
$hantei = 0;
if(($create != null) and ($create != ""))
{
$hantei = 1;
}
//POSTされたら
if($hantei == 1)
{
//****** hoge.html作成 ******
$filename = "hoge.html";
$html_tmp = "";
$html = "";
//出力をバッファリング開始
ob_start();
//処理したいファイルをインクルードする
require('./hoge.php');
$html_tmp = ob_get_contents();
$html = str_replace("\r","",$html_tmp);
//保存処理
if(!($fd = fopen($savepath . $filename,"w"))){die($filename . " 書き込みオープン失敗");}
if(!($rslt = fwrite($fd,$html))){die("書き込み失敗");}
fclose($fd);
// バッファリング終了&破棄
ob_clean();
echo '<div style="padding-top:10px;"><a href="hoge.html">hoge.html</a>を作成しました。</div><br>';
//******************************
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>html生成</title>
</head>
<body>
<?php
//POST前
if($hantei == 0)
{
?>
<form name="form1" method="post" action="">
<input type="submit" name="create" value="静的html作成">
</form>
<?php
}
//POST後
else
{
?>
<form name="form2" method="post" action="">
<input type="submit" name="back" value="戻る">
</form>
<?php
}
?>
</body>
</html>
こんな感じですがあとは使いやすいようにカスタマイズしてみてください。
にしてもスクリプトってブログに書きづらいなぁ・・・。
よくソースコードが綺麗に色分けされたりしてるブログを見るけどああいうのはどうやってるのだろう・・・。
タグ:PHP
私はよくアド用サイトでwordpressを使用しているのですが、ベースがPHPなんですね。
なので、静的なhtmlで書き出す技術にはすごく興味があります。
今の所、SEOにおいて検索エンジンでは動的か静的かという事をURLで判断するらしいのでwordpressを使用したサイトのパーマリンクを変更して対応していますが、
ユーザーへの負担という部分を考えたら静的に吐き出す方法などないのかな、と思っていた次第です。
知識がなくて全て理解できないのがつらい(笑)
頑張って調べます!!
あと、ソースコードはスタイルシートで<pre>や<code>を追加して表示している方が多いようです。
私は、preのみでマークアップしています。
以下のサイトが参考になりました。
http://www.ideaxidea.com/archives/2006/09/post_128.html
http://www.ideaxidea.com/archives/2006/09/post_130.html
静的ページにする方法は、本当に静的なページにしてしまう方法(私の記事)やあたかも静的ページのように見せる、
mod_rewrite
http://memorva.jp/memo/linux/mod_rewrite.php
や
PATH_INFO
http://exam.su-jine.com/path_info/path/info.html
がありますね。
あたかも見せるだけ(SEO目的)ならmod_rewriteやPATH_INFOでもいいですがサーバ負荷や表示速度を考えると実際に静的ファイルを書き出したほうがいいですね。
サーバをいじれるならcronを使って定期的に自動生成させることもできます。
Wordpressなら色んなモジュールがありそうな気もしますが、なければやはり自作するしかないですね^^;
Wordpress特有の関数とPHPの関数を使えばできそうですし実際やっている人もいるかもしれないですね。
何かお手伝いできそうなことがあれば言って下さい。
それと、ソースの書き込みについての参考文献ありがとうございました m(_ _)m
おかげで改行やスペースは文献のやり方で対処できそうです。
PHPの参考ソースが載っているサイトなどで関数名にマウスポインタを乗せると説明がポップアップしたり、関数や命令で色分けされたりするサイトがあるんですがああいうのはWordpressとかMovableTypeで専用モジュール使ったりしてるんだろうなぁと。。
調べたところ、WPでHTMLではきだして・・とやっている方は少なく、
ほとんどの方がキャッシュのログを生成させるプラグインかパーマリンクの設定にて対応しているようです。
WPは、.htaccessを自動的に変更してくれるので楽といえば楽なのかもしれません。
サーバーにもよると思いますが、やはり表示が多かったりプラグインを多様しているサイトは表示が遅くなってしまうんですよね。
一応、生成スクリプトは発見することができたのですが
http://bmky.net/product/script/petit.html
zipのDL先がnot found でしたorz
今後もちょこちょこと調べていきたいと思います。
ソースコードの色分けについては、WPだったら色々なプラグインがあるようでした。
http://jmblog.jp/archives/62
確かに静的htmlを生成している人はプラグインでキャッシュから生成しているっぽいですね。
http://wppluginsj.sourceforge.jp/i18n-ja_jp/wp-cache/
まあこれでも十分サーバの負荷軽減にはなるのではないでしょうか。
生成後は静的ファイルへのアクセスになるわけですし。
ソースコードの色分け表示ですが現在奮闘中です^^;
あと少しな感じなんですけどねぇ。。