<< デブサミ関西2013へ行ってきた | main | 無知でした(^^;; >>

PHPの実行結果をhtmlファイルとして書き出す

2013.10.01 Tuesday | by こも
PHPの実行結果をhtmlファイルとして書き出す方法にトライしてみました。


何故こういうことをやろうかと思ったかというと、あるDBのデータを元に生成された数千のコンテンツページを持つWebサイトのリニューアルに際して、以下のこと考えました。

月々500円未満の共同型の安サーバを借りているので、PHPで動的に作るより静的なhtmlをサーバ上に置いた方が負荷が軽減される

htmlで書かれた既存の数千のコンテンツページに対して、今からPHPで置き換えると外部SEO対策をまたやり直さないといけない


なので、ローカル環境で動くPHPシステムを作って、PHPの実行結果をhtmlファイルを出力して、それをサーバにアップするという手法をとってみようかなぁと思いました。



以下はsample.phpの実行結果をoutputtest.htmlに書き出す方法です。


<?php
	$url = "./sample.php";

	$buff = file_get_contents($url);

	$fname = "outputtest.html";

	$fhandle = fopen( $fname, "w");
	fwrite( $fhandle, $buff);
	fclose( $fhandle );

	echo "<a href='".$fname."'>作ったファイルを開く</a>";
?>

一瞬、「おっ、うまくいった」と思ったのですが、作られたhtmlファイルをよくみると何かおかしいことに気が付きました。


実はこのコードではPHPファイルの中身をhtmlファイルとして書き出すだけで、PHPタグやPHPのソースコードまでそのままコピーされていました(^^;;

やりたいことは、PHPファイルの中身の出力ではなくて、PHPの実行結果の出力なので困りました。



どうやるか試行錯誤していたら、httpアクセスならうまく行きましたので、そちらの修正版のソースも残しておきます。


<?php
	$url ="http://localhost/sample.php";

	$buff = file_get_contents($url);

	$fname = "outputtest.html";

	$fhandle = fopen( $fname, "w");
	fwrite( $fhandle, $buff);
	fclose( $fhandle );

	echo "<a href='".$fname."'>作ったファイルを開く</a>";
?>


これで一応やりたいことはできました。
(上記の例ではxamppを使ったローカル環境(localhost)にsample.phpを置いています)


でも、よくよく考えてみると、こうやって数千のコンテンツページをリニューアルしたとして、修正ごとにいちいち全部のファイルをアップロードする手間が発生しますよね(^^;;

そう思うと、この方法はセオリーではなくって、いっそのこと全システムをPHPに置き換えた方がいいんじゃないかという気がしてきました(>_<)

Comment
こうすればhttpアクセスしなくても実行結果受け取れますよ。

コメント欄にコード書くとなんか¥マークでエスケープされますね(^_^;)

対象のディレクトリからphpファイルの一覧を取得してループすれば対応するhtml吐けますけど。
たくさんある場合、負荷とかどうなんですかね。

<?php
$templatedir = __DIR__ . '/template';
try{
foreach ( new DirectoryIterator( $templatedir ) as $file ) {
if ( !$file->isDot() ) { // .. .を除外
if( !$file->isDir() ) // ディレクトリを除外
{
if($file->getExtension() ==='php'){ // 拡張子がPHPか判定
$filename = $file->getFilename(); //ファイル名取得
$templatefile = "$templatedir/$filename"; // 実行前のファイル(フルパス)
$filename = basename($filename, '.php');// ファイル名から拡張子.php削除
ob_start(); // 出力のバッファリングを有効にする
include($templatefile); //実行結果をバッファに出力
// 同階層の ファイル名.html にphp実行結果を出力
file_put_contents( "$filename.html", ob_get_contents() );
// 出力用バッファをクリア(消去)し、出力のバッファリングをオフにする
ob_end_clean();
}
}
}
}
}catch( Exception $errorObj ){
echo $errorObj->getMessage();
}
?>
なるほど。そういうやり方があるんですね。
ステキな方法を教えて戴きありがとうございます。

コメントに気付かず、返信遅くなってすみませんm(_ _)m
  • こも
  • 2014/06/08 10:34 PM
Add Comment









Sponsored Link
Recommend
PHP 逆引きレシピ (PROGRAMMER'S RECiPE)
PHP 逆引きレシピ (PROGRAMMER'S RECiPE) (JUGEMレビュー »)
鈴木 憲治,安藤 建一,山田 直明,八木 照朗,山本 義之,河合 勝彦
Recommend
Recommend
Powered
無料ブログ作成サービス JUGEM