2007年3月7日
Movable Type 3.3以降をご利用の方は、MT3.3専用版をお使いください。
詳細はこちらのページを参照してください。
2005年12月20日 9時50分
スクリプトに一部不具合がありました。申し訳ありません。
9時50分頃までにダウンロードされた方は、再度ダウンロードいただき、「mt-dynamic.cgi」のみ差し替えてくださいますようお願いいたします。
昨日に続いて、Perl版ダイナミック・パブリッシングを紹介します。
今日は、インストールの基本的な手順を解説します。
今日のインストール手順を行うと、キャッシュ機能はオフの状態で、Perl版ダイナミック・パブリッシングを使うことができます。
なお、キャッシュをオンにする場合は、今日の作業を行った後で、キャッシュをオンにするための処理を追加する形になりますので、今日の作業も行っておいてください。
1.ファイルのダウンロードと解凍
まず、以下のリンクをクリックして、Perl版ダイナミック・パブリッシングのファイルをダウンロードしてください。
ダウンロードしたファイルは、Zip形式になっています。
ファイルを解凍すると、全部で7つのファイルができます。
2.ファイルのアップロード
解凍してできたファイルの中で、「GetConfig.pl」ファイルはプラグインです。
このファイルを、Movable Typeの「plugins」ディレクトリにアップロードします。
また、「mt-dynamic.cgi」ファイルは、Blogの出力先ディレクトリ(MTのディレクトリではない)にアップロードして、パーミッションを変えて実行可能にしておきます(705や755など)。
3.dynamic_init.plの設定
次に、ダイナミック・パブリッシングにしたいBlogで、インデックステンプレートを1つ作成します。
「dynamic_init.pl」ファイルの中身をすべてコピーして、インデックステンプレートに貼り付けます。
そして、テンプレートの名前と出力ファイル名を「dynamic_init.pl」にします。
また、テンプレートの中で、以下の2箇所を書き換えます。
・3行目「$index_file = 'index.php';」
各ディレクトリのインデックスページのファイル名を指定します。
例えば、インデックスページのファイル名が「index.html」の場合は、この行を「$index_file = 'index.html';」に変えます。
・4行目「$error404 = '';」
アクセスされたページが見つからない場合に、表示するページのURLを指定します。
例えば、ページが見つからないときには「http://www.hogehoge.com/error.html」を表示するようにしたい場合は、「$error404 = 'http://www.hogehoge.com/error.html';」とします。
なお、URLを指定しない場合は、「ご指定のアドレスのページは見つかりませんでした。」というエラーメッセージが表示されます。
テンプレートの書き換えが終わったら、「インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する」のチェックをオフにしてテンプレートを保存し、再構築しておきます。
4.mt-dynamic.phpの設定
次に、インデックステンプレートをもう1つ作り、解凍してできた「mt-dynamic.php」ファイルの内容をすべて貼り付けます。
出力ファイル名とテンプレート名は、「mt-dynamic.php」にしておきます。
そして、このファイルの5行目にある「$index_filename = "index.php";」の文を書き換えます。
この行では、各ディレクトリのインデックスページのファイル名を指定します。
例えば、インデックスページのファイル名が「index.html」の場合は、この行を「$index_filename = "index.html";」に変えます。
書き換えが終わったら、「インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する」のチェックをオフにしてテンプレートを保存し、再構築しておきます。
5..ダイナミック・パブリッシングをオンにする
再構築を不要にしたいBlogで、ダイナミック・パブリッシングをオンにします。
Blogのメニューで「環境設定」の中の「設定」のページに接続し、「公開」のタブを開きます。
その中の「公開」の部分で、「テンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択します」をオンにし、ページ末尾の「変更を保存」ボタンをクリックします。
これで、ダイナミック・パブリッシングがオンの状態になります。
6..htaccessファイルの編集
5.の作業が終わると、Blogの出力先のディレクトリに、「.htaccess」というファイルができます。
この.htaccessファイルをいったんダウンロードして、メモ帳等で開きます。
その中に、「/○○/mtview.php」という部分が4箇所あります(○○はBlogの出力先ディレクトリ)。それらすべての「mtview.php」を、「mt-dynamic.php」に書き換えます。
書き換えが終わったら、.htaccessファイルを元の場所に再度アップロードします。
7.phptempディレクトリの作成
Blogの出力先のディレクトリに、「phptemp」という名前のディレクトリを作ります。
そして、そのパーミッションを「707」に設定します。
8.各テンプレートの設定
テンプレートの編集画面で、動的に出力したいテンプレートを開きます。
そして、画面の右上にある「このテンプレートをダイナミック・ページにする」のチェックをオンにします。
↓テンプレートごとに「このテンプレートをダイナミック・ページにする」のチェックをオンにする
![]()
9.Blogの再構築
ここまでの作業がすべて終わったら、Blog全体を再構築します。
8.の設定を行ったページが正しく表示されれば、設置は終わりです。
これ以後も、テンプレートを新規作成した時には、Blogの再構築を行ってください。
なお、ここまでの設定をすると、以前の静的に構築されたHTMLファイルは不要になります。
それらのファイルは、拡張子に「.static」が追加された状態で、Webサーバーに残っています。必要に応じて削除することができます。
10.PHPでモジュール化している場合の注意
Perl版ダイナミック・パブリッシングは、テンプレートをPHPでモジュール化していても動作します。
ただし、include文で読み込むテンプレートは、ダイナミック・パブリッシングにせずに、静的に再構築するようにしてください。
そのようなページまでダイナミック・パブリッシングにすると、ページを表示する際にモジュールごとに再構築が行われ、ページの表示に時間がかかるようになります。


コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。
いつも有益な情報ありがとうございます。
今回DBをSQLiteに変更すると共に、Perl版ダイナミック・パブリッシングを試そうとカスタマイズしております。
当サイトは、サブドメイン毎に複数のブログを管理しているのですが、その様な場合、.htaccessをどのように編集したらよいのかがいまいちわかりません。
本カスタマイズへの直接的な質問ではなく、大変申し訳ないのですが、お知恵を拝借できないでしょうか。
よろしくお願いいたします。
>yamatoさん
こんにちは。
サブドメインでBlogを管理していらっしゃるなら、個々のサブドメインのルートにあたるディレクトリに、.htaccessファイルができるはずです。
そして、その中に「/mtview.php」という部分が4箇所あるはずです。
これらをすべて「/mt-dynamic.php」に置換してください。
壱さん
ご回答ありがとうございます。
ご指摘の方法でもうまくいかず、調べたところ
私のRewriteruleの認識が間違っていたようです。
http://www.nurs.or.jp/~sug/homep/rewrite/rewrite15.htmを参考に、
/mt-dynamic.php
を
/home/sites/lolipop.jp/users/lolipop.jp-dp********/web/subhoge/mt-dynamic.php
とフルパスでサブドメイン毎に記述したところうまく動作いたしました。
どうもお騒がせ致しました。
大変すばらしいものを作っていただいて感謝しています。
きっとうまく使えたらいろいろと便利なんだろうと、何度かトライしてみているのですが
なかなかうまくいきません。
どうかご教授ください。
現在のブログでやってうまくいかないのでMT3.2-ja2を新規に別サブドメインでインストールしてみても現象は同じでした。
現象としては動的に設定したテンプレートを利用したファイルがうまく生成されない状態です。
.htaccessの /mtview.php を /mt-dynamic.php に変更して動的生成のファイルにアクセスすると以下のようなエラーを吐きます。
Warning: Unknown modifier '$' in /var/www/home/hoge/public_html/sub.domain.com/mt-dynamic.php on line 39
Warning: main(
): failed to open stream: No such file or directory in /var/www/home/hoge/public_html/sub.domain.com/mt-dynamic.php on line 157
Warning: main(): Failed opening '
' for inclusion (include_path='.:/usr/lib/php') in /var/www/home/hoge/public_html/sub.domain.com/mt-dynamic.php on line 157
内容的にはファイル名をうまく渡せずエラーを吐いているのかななんて思いますが、いかんせん技術的に明るくないのでよくわからなかったりします。
また、コメントに「 mt-dynammic.php までのパス」をフルパスで記述するとうまくいった例がありましたがそうした場合はInternal Server Errorを吐きます。
この時点で詳しいエラー内容がわからなくなったので行き詰まってしまいました。
もしかしたら私が利用しているサーバのしようなのかもしれないですが、なんとか解決できないものでしょうか。
>Testerさん
こんにちは。
開こうとしているページのURLが、こちらのスクリプトで想定していないものになっているのではないかと思われます。
ただし、そちらのサーバーでデバッグしてみないことには、おそらく問題は解決できないと思います。
> 壱さん
そうですか…
壱さんが私が利用しているレンタルサーバを触れなければ具体的な解決は難しそうですね。
Perlによる動的生成はしばらくあきらめます。
そのうちの他のレンタルサーバを触る機械があればそちらでもためしてみたいと思います。
このサーバに興味があればサブアカウントを発行しますのでご連絡いただければとおもいます。
ありがとうございました。
すばらしいプラグイン&仕組みですね。
ロリポップで試してみてダイナミック・パブリッシングされるようになったのですが、いまいち動きがおかしいと思う部分があります。
日付アーカイブのテンプレートを、月別アーカイブ用、動的カレンダー用と2種類定義し両方ともダイナミック生成に設定して、アーカイブ・マッピングの設定で月別に
前者 yyyy/mm/index.php [デフォルト]
後者 calendar/yyyy/mm/index.php
と定義してあります。
この設定でで静的なファイルもすべて削除し、phptempの中もキレイにした状態でエントリの存在する月で上記のURLをたたくと、
前者はダイナミックに生成後表示され、後者は「ご指定のアドレスのページは見つかりませんでした。」が表示されます。
また、アーカイブ・マッピングの設定で前者を削除してみたのですが何故か同じように生成されてしまいます(設定は消えているはずなのに)
一応いろいろな設定を変えたり、テンプレートの中身を2つとも同じにしてみたり、出力ディレクトリを換えてみたりいろいろやったのですが同じ結果で...
なにか大きな勘違いをしているのかもしれませんが、入力されたURLからどのようにアーカイブのURLなのか、そしてどのテンプレートなのかを判断しているのか教えていただけないでしょうか?それがわかれば設定の悪い部分がわかるかと...
すみませんがよろしくお願いいたします。
>mountさん
こんにちは。ご利用ありがとうございます。
「calendar/年/月/index.php」の形式で出力したいのであれば、出力フォーマットを「calendar/%y/%m/index.php」にする必要があります。
また、アーカイブマッピングを削除しても、そのページが表示されるのは、MT側の問題のようです。
MTのデータベースの中に、URLとアーカイブとの関連を表すテーブルがありますが、アーカイブマッピングを削除しても、そのテーブルから情報が削除されていませんでした。
> 壱さん
回答ありがとうございます。
出力フォーマットを「calendar/%y/%m/index.php」にしたら無事いけました。
MT3.2から「calendar/yyyy/mm/index.php」のような形式が使えるということを小粋空間のページで見てこのような設定にして、静的構築の時はうまく出力されていたようなのでひっかかりました。ありがとうございます。
アーカイブマッピングを削除してもページが表示される件も了解しました。不要な場合は自分でDELETEしますね。
また何かありましたらよろしくお願いいたします。
いつも大変お世話になっています。
dynamic_init.plをはじめいろいろなテンプレートでindex.phpと設定しますが、アーカイブマッピングでindex.phpと設定していないと、表示されないんでしょうか。
カテゴリーは壱さんが教えてくださったように、最新の並べ替えを使用して無事表示されているのですが、それ以外は全く表示されません。
エントリーアーカイブでは
<$MTArchiveDate format="%Y/%m/%d-%H%M"$>.php
日付の日別アーカイブでは
…>-index.php
と設定しています。
このような設定では表示されないのでしょうか。
全ての手順が済んで、サイトを確認しようとしたらメインとカテゴリー以外は表示されませんでした。
できればアーカイブマッピングを変えないで表示させたいのですが…
お手数ですが、教えていただけませんでしょうか。
ちなみに、アーカイブのテンプレートは全部ダイナミックにしています。
>にうさん
こんにちは。
おそらく、.htaccessの記述ミスです。
mt-dynamic.phpのアドレスを書く箇所が4箇所ありますが、そこが「/niumt-dynamic.php」になっていると思われます。
「/niu/mt-dynamic.php」のように、「/niu」の後にスラッシュを追加してください。
いつも、お手数かけます。
壱さんがおっしゃる通りの状態で1ヶ所そのような記述がありました。
修正すると無事表示されました。
単純ミスで恥ずかしいですが、お答え頂き感謝したします。
ありがとうございました。
こんばんわ。
ダイナミック・パブリッシングを導入しようと思っていたんです。途中まではOKだったんですけども・・・
5..ダイナミック・パブリッシングをオンにする
というところで、「設定」の「公開」のところに
>テンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択します」をオンにし、ページ末尾の「変更を保存」ボタンをクリックします。
これで、ダイナミック・パブリッシングがオンの状態になります。
がないんです
もしかして・・・導入できないんですかね~~~?
(´;ェ;`)ウゥ・・・
サーバーは、ロリポップです。
こんばんわ。
ダイナミック・パブリッシングを導入しようと思っていたんです。途中まではOKだったんですけども・・・
5..ダイナミック・パブリッシングをオンにする
というところで、「設定」の「公開」のところに
>テンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択します」をオンにし、ページ末尾の「変更を保存」ボタンをクリックします。
これで、ダイナミック・パブリッシングがオンの状態になります。
がないんです
もしかして・・・導入できないんですかね~~~?
(´;ェ;`)ウゥ・・・
サーバーは、ロリポップです。
BLOGにコメントがあったんで、コメントを開いたら・・・
表示されずに。。。
ソースでいいんですかね?コメント表示ができなくなっていました。。。(´;ェ;`)ウゥ・・・
それで、再構築をしてみたんです。
そしたら、エントリーアーカイブで
「再構築に失敗しました: ブログ2の読み込みに失敗しました: 「/home/sites/lolipop.jp/users/ciao.jp-pig-family/web/cgi/mt/db/comment.entry_id.idx」を関連づけられません: Cannot allocate memory」と
いうエラーでした。。。
意味がわからず・・・そして、コメントできず・・・
解決策はありますか?
すみません
>feiさん
こんにちは。
ダイナミック・パブリッシングを導入するには、データベースとしてMySQL/PostgreSQL/SQLiteを使っていることが必要です。
エラーメッセージからすると、そちらではBerkeley DBをお使いのようですので、そのままではダイナミック・パブリッシングを導入することはできません。
そうなんですかぁ・・・(´;ェ;`)ウゥ・・・
>MySQL/PostgreSQL/SQLiteを使っていることが必要です。
導入する方法ってありますか???
すみません(´・(●●)・)(o´_ _)oペコリ
MySQL/PostgreSQL/SQLite
このデーターベースは、サーバーに問い合わせを・・・
ということでしょうか?
カスタマイズの本270ページに書いてありました。
一度エラーになったんで、全て削除をしたんですけども・・・

直らないんです
反映されるまで時間がかかるのか。。。
初めから・・・やりなおしをした方がいいんですか?
すみません。。。
サーバーからの返答がきました。
「弊社ではデータベースとしてMySQLの利用が可能です」という返答です。
1サーバー1データベース可能ということです。
ダイナミック・パブリッシングは
MySQL/PostgreSQL/SQLiteのどれかですか?
それとも、3つのデータベースが必要なんですか?
初歩的な質問すみません
サーバーからの返答がきました。
「弊社ではデータベースとしてMySQLの利用が可能です」という返答です。
1サーバー1データベース可能ということです。
ダイナミック・パブリッシングは
MySQL/PostgreSQL/SQLiteのどれかですか?
それとも、3つのデータベースが必要なんですか?
初歩的な質問すみません
>feiさん
ダイナミックパブリッシングを行うには、3つの中のどれか1つのデータベースが使えればOKです。
先月6/17からこちらの方法で3つやっているうちの一つのブログのインデックス、アーカイブ、月別・カテゴリー別・エントリー別アーカイブの5つをダイナミック・パブリッシングにしていたのですが、今夜突然そのブログだけ開けなくなってしまいました。今日の夕方までは問題なく閲覧できていました。
ずっとロード中になって、かなり時間がたった後に何も表示されないまま「ページが表示されました」になってしまいます。
スタティックに直したらちゃんと表示されるようになりましたが、どんな原因が考えられますでしょうか?
あと、こちらのHPはなんでこんなに重いのでしょうか?
ページを開いているだけでCPU60%になってしまいます。(二ページ同時に開くと100%です)
>subaruさん
以前、当方のBlogでも同じような現象が起こったことがあります。
原因は、サーバー(XREA)の設定が変わったらしいことでした。
そのときは、XREA内でやむなく別サーバーを乗り換えました。
また、当Blogが重いとのことですが、サイドバーのFlashが原因です。
なお、ページ先頭の「Utility」メニューをクリックしていただくと、テンプレートを変えて当Blogを表示することができます。
このテンプレート(オリジナル)以外は、ほとんどカスタマイズしていませんので、表示が軽くなります。
このプラグインの存在を知り、さっそく導入を行ってみましたが、問題が発生しており解決できなく困っております。
現象としてはダイナミック・パブリッシングを行ったページが真っ白の状態になってしまいます。
(もちろん、ソースファイルをみても何も書いてありません。)
環境はMT3.31-ja+MySQLです。
サーバはさくらインターネットを利用しています。
思いつく原因などありましたら教えてください。
追記です。
その後、キャッシュ機能をONにしてみたらどうなるか確認してみました。
キャッシュONの場合、
「キャッシュファイルのコピーに失敗しました」
というメッセージが表示されました。
>はみちゃさん
こんにちは。
キャッシュONの状態で、常に「キャッシュファイルのコピーに失敗しました」のメッセージが表示されるのであれば、キャッシュ関連のディレクトリ(phptempとphpcache)のパーミッションの設定が正しくないことが考えられます。
壱さん
ご回答ありがとうございます。
キャッシュ関連のディレクトリ設定を見直したところ
エラーメッセージの表示は発生しなくなりました。
ですが、やはり画面は真っ白のままです。
キャッシュディレクトリをみると確かにファイルは生成されているのですが、
それがうまく表示されていない感じです。
自己解決したので報告です。
このプラグインはPHP化していることが前提なのでしょうか?
PHP化もやってみたいと思っていたので
ダイナミック・パブリッシングをOFFにした後で拡張子のPHP化を行ったところ同じ現象(真っ白のページが表示)が発生しました。
解決策を調べてみると
を
') ?>
に変更するとうまくいくようでしたので、変更してPHP化が無事行えました。
もしやと思い、拡張子をhtmlに戻した上で
ダイナミック・パブリッシングを行ったところうまく表示されました。
ですので私のような現象にあわれた方は
テンプレートファイルの中身を
') ?>
に変更するようにしてみたらうまくいくかもしれません。
タグが消えてしまったのでもう一度書きます。
') ?>
を
に変更したらうまくいきました。
確認画面ではOKでも、画面ではだめですね。
<>を全角で書きます。
<?php echo('<?xml version="1.0" encoding="UTF-8"?>') ?>
を
<?xml version="1.0" encoding="UTF-8"?>
に変更したらうまくいきました。
今度は肝心の内容を書き間違えました。
<?xml version="1.0" encoding="UTF-8"?>
を
<?php echo('<?xml version="1.0" encoding="UTF-8"?>') ?>
に変更したらうまくいきました。
(先ほどとは逆です。)
ほんと、何回もごめんなさい。
こんばんは。
とっても有意義なものを作成いただきまして、感謝です。
早速テスト用のブログでダイナミックパブリッシングを試したみたのですが、以下のようなエラーが出てうまくいきません。
もし原因がお解りになるようでしたら、アドバイスお願いします。
Warning: main(): Failed opening '' for inclusion (include_path='.:/usr/local/lib/php:/usr/local/lib/php/Smarty') in /home/sites/lolipop.jp/users/moo.jp-xxxxx/web/test/mt-dynamic.php on line 157
使用サーバはロリポップ、データベースはSQLiteです。
どこか間違っているのかと、何度も見直したのですが、原因が解りませんでした。
よろしくお願いします。
>billyさん
こんにちは。
エラーメッセージからの推測ですが、mt-dynamic.cgiがうまく動作していないようです。
mt-dynamic.cgiのパーミッションや、アップロード先のディレクトリ等をご確認ください。
壱様
返信ありがとうございます。
原因は、dynamic_init.plを保存しただけで再構築するのを忘れていたことだったようです。
ケアレスミスでした。
お手数おかけしました。
こんにちは^^
最後までちゃんと出来て 再構築もうまくいったように
見えたのですが 500エラーが出て表示されなくなりました
それと「.static」のついたファイルはすべて削除したほうがいいのでしょうか?
>MELLさん
こんにちは。
いきなり500エラーが出るとなると、おそらく.htaccessのどこかが間違っているのではないかと思います。
.htaccessの記述を見直してみてください。
.htaccessはちゃんと/blog/mt-dynamic.phpに
4ヶ所書き換えして UPしたんですけど
はじまして、昨日より試行錯誤していますがうまくいきません。
私はMTで複数のブログを運営しています。
あるブログで壱さんのプラグインを導入してダイナミックパブリッシングしてみました。
すると、なぜか他のブログのページが表示されてしまうのです。
具体的には
www.bbb.com
というサイトの
www.bbb.com/company.html
をダイナミックパブリッシングしているのに、
表示されるのは同じMTで管理している
www.aaa.com
というサイトの
www.aaa.com/company.html
のページなのです。
別ブログの同じディレクトリのページが表示されているのです。
これはDBが何か不具合を起こしていると考えたほうがいいのでしょうか?
>TKさん
こんにちは。
ご指摘の件ですが、MT3.3専用版でその不具合を修正したものを近々公開しますので、それまでお待ちください。
壱さんいつもお世話になってます。
他の方にもおこっている現象のようですね。
RightFieldなどを使っている場合は壱さんのプラグインしか方法がないですからね。。
一つのMTで一つのブログしか管理しなければ問題ないのかもしれないと気付きました。今からちょっと試してみます。