Movable Type 備忘録

 
  

 MovableTypeを自動的に再構築する

MovableType(ムーバブルタイプ)には、便利なプラグインがたくさんありますよね。

MovableType(ムーバブルタイプ)を使っている人のほとんどが、プラグインによるカスタマイズをやってるのではないでしょうか。

でも、そんなプラグインの中には再構築しないと本領発揮しないものもあります。
再構築することで本来の機能をフルに使えるプラグインがあります。たとえば、以下のプラグインです。

  • RSSパーサで気になるサイトをチェック!
    この記事では、気になるサイト、お気に入りのサイトの最新エントリを自分のブログ内に表示させることができるカスタマイズを紹介しています。 でも、再構築しないとお気に入りサイトの最新エントリを取り込むことができません。

  • サイドバーにランダム画像表示する
    こちらの記事では、サイドバー( サイドバーに限らず )に画像をランダムに表示するカスタマイズを紹介しています。 でも、やっぱり再構築しないとランダムには表示されません。

他にもこの類のプラグインはありますが、そんなプラグインの本来の機能をフルに活用しましょうということで、MovableType(ムーバブルタイプ)を自動的に再構築するカスタマイズのご紹介です。

MovableType(ムーバブルタイプ)を自動的に再構築させるには2つの方法があります。( もっとあるかも、ですけどわたしは知りません。 )

cron とは、わたしも詳しくは知りませんが、定期的にある処理を実行させられるプログラムらしいです。
ロリポップではこの cron の使用を許可していませんが、さくらインターネットでは使用可能です。

そして、再構築させるmt-rebuildスクリプトと併用することで自動的にMovableType(ムーバブルタイプ)を再構築させることができます。

▼mt-rebuild スクリプトの入手はこちらから▼
http://code.appnel.com/mt-apps

まず、mt-rebuild スクリプトをアップロードします。
上記URLから mt-rebuildの圧縮ファイルをダウンロードして適当なフォルダに展開します。

そして、mt-rebuild.pl を mt.cgi がある場所と同じディレクトリの中にアップロードしてください。
アップロードしたら、パーミッションを 755 にします。

mt-rebuildスクリプトには、以下の機能があります。

すべてのブログを再構築したい場合
mt-rebuild -all

指定したブログのすべてを再構築させたい場合
mt-rebuild -mode="all" -blog_id=0

- 2006.11.27 追記 -

指定ブログIDのすべてを再構築ができないと思ってたのですが、訪問者さんのご指摘により再構築できることを確認しました。
正しくは以下のように、-mode="all"のところを-mode='all'とすれば再構築できました。

mt-rebuild -mode='all' -blog_id=0

ありがとうございます。

青い字の部分に、再構築したいブログIDを指定します。

指定ブログのインデックス・テンプレートを除く、全アーカイブを再構築させたい場合
mt-rebuild -mode='all' -blog_id=0 -no_indexes

上記同様、青い字の部分に再構築したいブログIDを指定します。

指定ブログの指定アーカイブのみ再構築させたい場合
mt-rebuild -mode='archive' -blog_id=0 -archive_type='Individual'

青い字の部分で再構築したいブログIDを、赤い字の部分で再構築したいアーカイブ名を指定します。
アーカイブ名は以下の中から指定します。

  • Individual: 個別エントリアーカイブ
  • Daily: 日別エントリアーカイブ
  • Weekly: 週別エントリアーカイブ
  • Monthly: 月別エントリアーカイブ
  • Category: カテゴリアーカイブ
指定ブログの特定エントリのみ再構築させたい場合
mt-rebuild -mode='entry' -blog_id=0 -entry_id=0

青い字の部分で再構築するブログIDを、赤い字の部分で再構築したいエントリIDを指定します。

指定ブログのインデックス・テンプレートのみ再構築させたい場合
mt-rebuild -mode='index' -blog_id=0 -template='your template name'

青い字の部分で再構築するブログIDを、赤い字の部分で再構築したいインデックス・テンプレート名を指定します。

cron を利用する場合

cron の使い方は、お使いのレンタル・サーバによって異なりますので、使い方についてはサーバ・サポートに問い合わせてください。
ここでは cron を利用した mt-rebuild.pl を実行させるコードについて説明します。

cron に以下のコードを実行させるようにすれば自動的に再構築されるようにできます。

mt-rebuild.pl -mode='index' -blog_id=1 -template='メインページ'

上記コードは、青い字の部分でブログID、赤い字の部分で再構築させたいインデックス・テンプレート名を指定します。

トップページへのアクセスをトリガーにして再構築

具体的にはどうするかというと、スクリプトを利用して訪問者さんがトップページなどにアクセスしたタイミングで、再構築させてしまおう…という発想です。
言いかえると、アクセスがないと自動的には再構築されません。

ですから、1番アクセスの多いページまたは、複数のページに、後から説明するスクリプトを組み込んでおく必要があります。

以下のコードをコピペして、mt-period.cgi という名前で保存します。
その際、各自の文字コードに合わせて保存してください。

わたしの場合には、MovableType(ムーバブルタイプ)標準の UTF-8 で保存しました。
保存したら、mt.cgiと同じ場所にアップロードして、パーミッションを 755 とします。

#!/usr/bin/perl -w
$blogid   = $ARGV[0];
$logfile  = "../mt-period.txt"; # 任意のログファイルパス
$nowtime  = time;
# 最終アクセス時間を外部ファイルから取得しています
if ( -e $logfile )
{
open(HN, "$logfile");
$lasttime = <HN>;
close(HN);
}
else
{
# 外部ファイルが存在しない場合
$lasttime = 0;
}
# 最終アクセス時刻から30分経過したかどうかチェックしています
if ( $nowtime - $lasttime >= 1800 )
{
# ここで指定インデックス・テンプレートの再構築を行っています
system("perl mt-rebuild.pl -mode=index -blog_id=$blogid -template='メインページ'");
# 最終アクセス時間を外部ファイルに保存しています
open(HN, ">$logfile") || die("Cannot open error.");
print HN $nowtime;
close(HN);
}
# ブラウザから直接 mt-period.cgi を実行する場合は以下の2行を有効にします
# それ以外の場合は、必ず以下の2行をコメントしてください
#print "Content-type: text/html\n\n";
#print "done.";
1;

青い字の部分で、再構築する周期( 秒 )を指定します。上記コードでは前回のアクセスから30分後に再構築するよう指定しています。
赤い字の部分で、再構築したいインデックス・テンプレート名を指定しています。
ここは先ほどの cron での再構築と同じです。

次に、トップページ( どのページでも構いません )に以下のコードを追加します。

<script type="text/javascript" src="<$MTCGIPath$>mt-period.cgi?<$MTBlogID$>"></script>

青い字の部分で、mt-period.cgi をアップロードしたURLを指定します。
追加したら、トップページを再構築してください。
そうすると、mt-period.cgi と同じ場所にで指定したディレクトリに mt-period.txt というファイルが作成されていれば完了です。

以上、2通りの自動再構築の方法を紹介しました。
他にも方法があるのかもしれませんけど、とりあえず、わたしはこれらで問題なく使えています。

  
  

 Trackback Pings(5)

from movabletype

少数人数の会社に求められるスタッフの要素 Prototype.js を使って、MovableTypeで最新記事を表示する MovableTypeを自動的に...

from のぶろぐ

…ということで検索をしていると、mt-rebuild.plに行き着く。 Mova...

from gekka blog

一応仕込んでみたので、作業メモとして。...

from blog化作業録

カツオ少年の三部作完結編 複数ブログにわたる運営で、各ブログのエントリ(投稿記事...

from blog化作業録

カツオ少年の三部作完結編 複数ブログにわたる運営で、各ブログのエントリ(投稿記事...

  
  

 Comments(70)

#1: Posted by kazu [RES]

トップページへのアクセスをトリガーにして再構築、大変参考になりました。
私も是非と思い設定したのですが、再構築がされません(ーー;)
mt-rebuild.plを何も変更せず、MTのアップロード機能でアップロード
mt-period.cgiもテンプレート名を入れて保管しMTのアップロード機能でアップロード
mt-period.txtをurl指定してみると数字が表示されているので、実行はされているのと思うのですが・・・
ftpが利用できないので、2つともmt.cgiとは別のデレクトリィーにあるのがいけないのでしょうか?

ご教授いただければ幸いです。

#2: Posted by bzbell [RES]

>>1 kazu さん

こんにちわ^^

mt.cgiと同じディレクトリにないと再構築されないです。
mt-rebuild.plの中を見ると、mt.cgiがある場所を基準にいろんなことをやっています。

なので、必ずmt-rebuild.plとmt-period.cgiは、mt.cgiと同じ場所におく必要があります。

また何かありましたらご連絡ください。

#3: Posted by tiiop [RES]

bzbellです。
文字化けがひどかったので内容は削除しました。

お手数ですが、再度コメントしていただけますか。

#4: Posted by tiiop [RES]

間違いです. 申し訳ありません. plと cgiは実行されます. しかし my blog(web)ではだめです. すなわち あるいは の間どこにでも入れても良いですね? しかしならないです. ありがとうございます.

#5: Posted by kazu [RES]

ご指示いただきありがとうございます。
不確かな知識で試行錯誤していますので、ご回答いただきホッとしました。

#6: Posted by bzbell Author Profile Page [RES]

>>5 kazu さん

こんにちわ^^

> 不確かな知識で試行錯誤していますので、ご回答いただきホッとしました。

はい。またトライしてみてください。
それ( >>2 )でもできなければ、またご連絡くださいね。

#7: Posted by GUTS [RES]

こんにちわ
自動再構築チャレンジしましたが上手くいきません(泣
ロリポップサーバーなのでトリガー構築にしてます。
ディレクトリ構造もあっているのですが、mt-period.txt自体が吐き出されていないのと
javascriptで読み込んでいるところで構文エラーが発生しちゃうみたいですね。
もうしばらくおっかけてみまーす

#8: Posted by bzbell [RES]

>>7 GUTS さん

こんにちわ^^

> ディレクトリ構造もあっているのですが、mt-period.txt自体が吐き出されていないのとjavascriptで読み込んでいるところで構文エラーが発生しちゃうみたいですね。

mt-rebuild.plのパーミッションはGUTSさんのことだから問題ないとは思います。
JSのスクリプトエラーは、おそらくmt-period.cgi内でエラった為の2次的なものだと思います。

  • mt-period.cgi内のテンプレート名称は合ってますでしょうか。
  • ファイルに出力されてない…ということは、ディレクトリの書き込み権限なども考えられるように思います。

わたしもちょと前までロリポユーザでしたが、このスクリプトを使ってました。
わたしも、ちょと調べてみます。

#9: Posted by GUTS [RES]

出来ましたぁ!
やっぱりmt-period.cgiのエラーで二次被害ってやつですねw
ソース内でテンプレート名ではなく指定ブログのリビルドにしているところで、一部消去されてました(笑

お手数おかけしました

#10: Posted by bzbell [RES]

>>9 GUTS さん

こんにちわ^^

> 出来ましたぁ!

ほっ( ̄∇ ̄;)良かったです☆
ホントはエラー処理などした方が良いと思うのですが手抜きしてます。
気が向いたらGUTSさん入れてやってください♪

#11: Posted by GUTS [RES]

こんばんわbzbellさん
system("perl mt-rebuild.pl -mode=index -blog_id=$blogid -template='メインページ'");
ってのはメインページが再構築するのですよね?
system("perl mt-rebuild.pl -mode="all" -blog_id=$blogid");と入力すれば
全て再構築されるんですよね?
ロリポップで指定投稿用のプラグインつっこんだらまたスクリプトエラーになっちゃいました(笑

#12: Posted by bzbell [RES]

>>11 GUTS さん

こんにちわ^^

> system("perl mt-rebuild.pl -mode=index -blog_id=$blogid -template='メインページ'");
> ってのはメインページが再構築するのですよね?

はい。その通りです。

> system("perl mt-rebuild.pl -mode="all" -blog_id=$blogid");と入力すれば全て再構築されるんですよね?

はい。そのようにmt-rebuildには説明があります。
けど、わたしは全buildは試したことないです( ̄∇ ̄;)はは

ちょと試しにわたしもやってみます。

#13: Posted by bzbell [RES]

>>11 GUTS さん

わたしの方でも試してみました。
結果、GUTSUさんが言われるようにエラーしますね。
どうやらアーカイブのbuildは止めておいたほうが良さそうです。

わたしの場合、CustomFields、Faviconプラグインあたりでダァー!!ってエラーでましたΣ( ̄Д ̄;)ギャー!!

配布元でも最新版はリリースされてないようです。
わたし自身インデックス・ページのみにしか使ってないので、気づきませんでしたが、追記しておいた方が良さそうですね。

#14: Posted by GUTS [RES]

早いっ!すごい対応の早さですね
アーカイブでRSSを読み込むようなエントリーも書いてたので重宝するかとは思ったんですけどね。
難しいみたいなので外しておきます

#15: Posted by bzbell [RES]

>>14 GUTS さん

> 早いっ!すごい対応の早さですね

あは( ̄∇ ̄;)
ちょどテンプレいじってたとこだったので…。

> アーカイブでRSSを読み込むようなエントリーも書いてた…

おぉΣ( ̄Д ̄)!!
それは興味アリアリですね。
後ほどお邪魔します。

#16: Posted by Mr.K [RES]

初めまして。
ここに書かれていたことを早速トライ。
うまくいきました。
ありがとうございます!

ひとつ疑問が生まれたのですが、

指定ブログの指定アーカイブのみ再構築させたい場合
mt-rebuild -mode="archive" -blog_id=0 -archive_type="Individual"


これ、複数のブログで実行する際は「○○.sh」 ←実行させてます。

改行で2行に書けばよろしいでしょうか???
お手数おかけしますが、よろしく御願いします。

#17: Posted by bzbell [RES]

>>16 Mr.K さん

はじめまして^^

はい。それでいいと思います。
ただし、わたしのブログでは、インデックス・テンプレート以外の再構築はエラーがでてしまいました。

環境に依存するものなのかどうかわ分かっていません( ̄∇ ̄;)

#18: Posted by kaz [RES]

はじめまして。
自動投稿後の再構築の自動化に方法が無いかと・・やっとたどり着きました^^
さっそく手順どおりに設定してみたのですが、技術的な事が分らないので、
質問させてください。

「トップページへのアクセスをトリガーにして再構築」の方法は、再構築が必要な
ファイルが存在する時だけ作動するのでしょうか?
それともトップページにアクセスがある度の1800秒後に自動再構築が動くのでし
ょうか?

 ┃ たとえば、1時ちょうどから1分おきに10人がアクセスしてきた場合・・30分後の
 ┃ 1時30分、1時31分、1時32分・・・と1分おきに再構築されるという意味合いです

いくつかのブログを作っているので、サーバーに負荷が掛かって怒られないかな・・
と、少し心配をしてしまいました。

すみませんが、教えていただけますでしょうか?
よろしくお願い致します。

#19: Posted by bzbell [RES]

>>18 kaz さん

こんにちわ^^

ご質問の件ですが、基本的にMTの管理画面からインデックスを変更せずに再構築するのと同じです。
ですので、アクセスがあって規定時間を満たしていたら、毎回無条件に再構築されます。

あまりにも早い周期 & ページ数の再構築となるとサーバへの影響大かと思います。

また、アクセスの度に再構築するのではなく、前回の再構築時刻から規定時間を満たした場合に限り構築します。

ですので、複数のアクセスがあっても

前回の再構築時刻+30分 <  現在時刻

の場合には再構築されません。

ただし、再構築時刻をファイルに保存しているのですが、ファイル保存前にアクセスされてしまうと再構築の対象となってしまうかも、です(; ̄- ̄)

#20: Posted by honda [RES]

初めまして。記事を参照させていただきました。cornが使えない環境ではトップからの読み込み、便利ですね!

>>12 bzbell さん

> system("perl mt-rebuild.pl -mode="all" -blog_id=$blogid");と入力すれば全て再構築されるんですよね?

たぶん表記的には

> system("perl mt-rebuild.pl -mode='all' -blog_id=$blogid");

ではないかと。この表記で試したところ、無事mt-period.txt ができていました!

#21: Posted by bzbell [RES]

>>20 honda さん

はじめまして^^

> この表記で試したところ、無事mt-period.txt ができていました!

(||||▽ ̄)アウッ!!
そっかぁ!! そんなことだったんですねっ!!
ご指摘ありがとうございます♪

#22: Posted by Cafe [RES]

はじめまして。記事を参考に、自動再構築の導入をしてみました。
私の使用環境では、cronが使えないので、大変助かりました。

で、導入中に悩んだことを一点。

> <script type="text/javascript" src="http://●●●/mt/mt-period.cgi?<$MTBlogID$>"></script>

これでは、実行されず、

<script type="text/javascript" src="<$MTBlogURL$>mt/mt-period.cgi?<$MTBlogID$>"></script>

こちらだと、正常に実行されました。

どちらも、同じだと思うのですが、、、う~ん。

#23: Posted by bzbell [RES]

>>22 Cafe さん

はじめまして^^

> 私の使用環境では、cronが使えないので、大変助かりました。

わたしも最初ロリポップだったのでcronが使えなくて、でも自動化したくてこのカスタマイズは重宝しました ( ̄∇ ̄)/

> どちらも、同じだと思うのですが、、、う~ん。

う~ん・・・いっしょですよね。
どちらも問題なさそうなんですよねぇ (; ̄∇ ̄A

#24: Posted by YUMI [RES]

はじめまして。 失礼致します。

mt-rebuild.plを使おうと思い、こちらへたどり着きました。

このmt-rebuild.plは、MT3.3以降でも使えるのでしょうか?

まだ、MTのバージョンは3.35は使用せず、Version 3.33-jaでやっているのですが、
再構築をかけることができていないのです。XサーバーでCRONは使えるのですが、
mt-rebuildが使えないので自動再構築ができていないのです。

MT3.33とかでも大丈夫ですよというのであれば、こちらのやり方になにか問題が
あるのではないかと思うのですが。

#25: Posted by bzbell [RES]

>>24 YUMI さん

はじめまして^^

ご質問の件ですが、わたしは今でも使ってます (●´∀`●)
ですので、回答は YES です。

全ビルドも、エントリの個別のビルドも確認してます。

> MT3.33とかでも大丈夫ですよというのであれば、こちらのやり方になにか問題があるのではないかと思うのですが。

もしかしたら、それはありうるかも、です (; ̄∇ ̄A
YUMI さんが試してみたスクリプトを一度見せていただけますか。

何が原因なのか解決できるかも、です。
ご迷惑をおかけしてすいません (m;_ _)mペコ

#26: Posted by YUMI [RES]

Xサーバーですので、CRONが使えるので、下記のようにCRONのコマンドの
ところにブログ全構築を入れてみてるだけなんです。

/home/ユーザーーID/mtのあるディレクトリ/mt-rebuild.pl -all

MT3.3で動くということだけでもわかりましたので、いくつか何が要因か試してみます。

#27: Posted by YUMI [RES]

使っているのは、Xサーバーなのですが

CRONでやった件は変わらずで、CRONの時刻になっても何も起こらないままです。

mt-period.cgiを使って、ブログのメインページのテンプレートに
<script type="text/javascript" src="http://mtcgiのあるpath/mt-period.cgi?<$MTBlogID$>"></script>
でやってみてもだめでした。
<script type="text/javascript" src="<$MTCGIPath$>mt-period.cgi?<$MTBlogID$>"></script>
でやってもだめで、エラーログをみると
failed to open log file
fopen: Permission denied
Premature end of script headers: mt-period.cgi
というようにログが残っているんです。 Xサーバーに問い合わせはしたんですが、CGIの中のことはわかりかねますと答えがきまして。 でも、CGIの中からlogfileなんて、呼んでいませんし。 ほぼ指定日投稿のプラグインも同じ場所で使っているのですが、こちらは動いているんです。
<script type="text/javascript" src="<$MTCGIPath$>mt-run-periodic-tasks.cgi?blog_id=<$MTBlogID$>"></script>

Xサーバー側の設定がなにか必要なんですかね。
データベースはMySQLを使っています。

#28: Posted by YUMI [RES]

すみません。NAMEを入れ忘れてだしてしまったようです。文中のURLの部分は削除していただいたのですよね。
お手数おかけしました。Xサーバーのほうにもあらためて問い合わせしています。

#29: Posted by bzbell [RES]

>>26 YUMI さん
>>27 [匿名] さん
>>28 YUMI さん

こんにちわ^^
返事が大変遅くなりすいません (m;_ _)mペコ

まず、mt-period.cgiではログファイル(前回アクセス時刻)を作成しています。
なので、mt-period.cgiを置いた場所のディレクトリのパーミッションに書き込み権限が必要です。

mt-period.cgi中のmt-period.txtの作成場所を相対パスなどで書き込み許可なディレクトリを指定してみたはどうでしょうか ( ̄∇ ̄)b

#30: Posted by YUMI [RES]

匿名になってしまったのは、NAMEの入れ忘れです。

お手数をおかけしてすみません。
ディレクトリの権限については、大丈夫です。アクセスできるようにしてます。
それとは別のところで、少し進展しました。少なくともmt-period.cgiが動くところまではいきました。

Xサーバーなんですが、
まず、サーバー側からphp.iniを作って、allow_url_fopenをonにしてはどうかという連絡があった
のですが、それは特にやってみても状況が変わりませんでした。
変わったのは

普通これで動いてくれると思うのですが、
#!/usr/bin/perl
このサーバーでは
#!/usr/bin/perl -w
としてあげないと動いてくれませんでした。-wをつけたら動いたのですが、いくつかエラーがでました。
これも他ではあまりでないんじゃないかと思うのです。いろいろ作法にうるさいサーバーのようです。
エラーの内容ですが、まず
warningで、@ARGV[0] は、$ARGV[0] にしたほうがいいという。
次はエラーで
HNのファイルハンドラがcloseしているのに使おうとしているというエラーをだす。
open(HN,”mt-period.txt");
close(HN);
としてやると、ファイルハンドラの使い方が間違っているぞ!!と言っていたのは黙ってくれました。
括弧はなくても、他では動くと思うのですが。
mt-period.txtは作成されるようにはなったというところまでは行きました。ですから、mt-period.cgi
は動作するようになりました。

まだ、Premature end of script headersというのが出てますが、これはあまり気にしなくて
よいメッセージのようですね。

でも、まだmt-rebuild.plが動いてくれないようです。今度はmt-rebuild.plのほうを考えないと
なりません。特にPremature end of script headers以外のエラーログはだしていないよう
なので、mt-rebuild.plのほうはまだ難航しそうです。

ちょっと合間合間になってはしまうのですが、Xサーバーでmt-period.plが動かないかどうか
解析してみます。Xサーバー側は、CGIに立ち入ったサポートはできないという回答なので、
あまり期待はできないのですが。


#31: Posted by bzbell [RES]

>>30 YUMI さん

こんにちわ^^

> #!/usr/bin/perl -w
> としてあげないと動いてくれませんでした。

えっ!? そうなんですか!?
-wスウィッチって、ただ言語的なワーニングを告知してくれるだけだと思ってました (; ̄∇ ̄A

mt-period.cgi が動いても肝心の mt-rebuild.pl が動いてくれない!? んじゃ話にならないですね。
てか、どんなエラーでますか!?

わたしの方ではmt-rebuild.pl実行後、再構築時にワーニングは表示されてます。
たとえば、TELNETでログインして、以下のように指定ブログIDの指定エントリをビルドしてみてはどうでしょうか。

perl mt-rebuild.pl -mode='entry' -blog_id=1 -entry_id=199

これにより指定エントリが再構築されれば、mt-rebuild.pl は問題ない・・・という判断になるかと思われます。

でも、サーバによってこうも動作が違うものなのか・・・と認識させられました。
ホントならいろんなサーバで評価できればいいんですけどね。

勉強になりました♪

#32: Posted by YUMI [RES]

お騒がせしております。ご協力ありがとうございます。

mt-rebuld.plが動作しなかったのは、単なる実行権限を与えていないだけでした。
お騒がせしてすみません。700や755にすることで動作はしました。
初歩的なミスですみません。

#!/usr/bin/perl -w
私もこれは -wがあってもなくても動作するものだと思っていたので、たまたま入れてみたら
動いたというものです。文法的な違いも解析するのが難しいですね。ひとつひとつつぶして
行かないとならず。
サーバーによって、癖があってどれでも動作するものをつくるというのはつくづく大変だという
ことがわかりました。

それでもまだ癖が残っていて、指定日投稿をしていると、インデックスのファイルはリビルド
されるのですが、エントリー・アーカイブだけリビルドされず、メインページには最新の記事は
表示されるのに、エントリーページへのリンクで飛ぼうとするとページがありませんとエラー
になってしまうようになっている事象が頻発するんです。index.htmlもindex.xmlもちゃんと
できているのに、エントリー・アーカイブだけ足りないという現象が起きてしまっています。
これもまた、MTの中のどこかとXサーバーとの相性の話なのかなと、mt-rebuild.plを
使って定期的にエントリー・アーカイブの再構築をかけようかと試しているところです。

mt-rebuild.pl -allをやった限りでは、全てを強制的に再構築してくれなくて、インデックス
の一部だけを再構築するという動作になっていまいした。

Xサーバーの場合、シェルに入るインターフェースを持っていないのがまた解析等で
やっかいなところです。

何か進展がありましたら、また書き込みさせていただきます。同じような経験をして困って
いる人がいるかもしれませんから。再構築の件では、こちらのブログにこられる方が多い
と思いますので。

#33: Posted by bzbell [RES]

>>32 YUMI さん

こんにちわ^^

> mt-rebuld.plが動作しなかったのは、単なる実行権限を与えていないだけでした。

そうでしたか (; ̄∇ ̄A はは

> サーバーによって、癖があってどれでも動作するものをつくるというのはつくづく大変だということがわかりました。

同感です (つω-`。)
インストールされてるモジュールのバージョンなど、マチマチですもんね。

> それでもまだ癖が残っていて、指定日投稿をしていると、・・・

指定日投稿の件ですが、ちょっとよく理解できてないので確認させてください。

指定した日付は未来の日付でしょうか。それとも過去の日付!?

どちらにしても、以前わたしが確認したときは双方共にページが作成されなかったように記憶してます。
ただし、データベース上には存在してて、mt_entryテーブルの投稿日が、指定した過去/未来の日付になるだけだったように思います。

この記憶が確かだとすると、YUMI さんの方では指定日投稿にも関わらず、メインページには最新の記事が表示されてしまい、リンクエラーする・・・ということでしょうか。

認識違いでしたらすいません。
でも、認識があってましたら何か腑に落ちないところがあります (; ̄∇ ̄A

気になるので、わたしも確認してみます。

> 何か進展がありましたら、また書き込みさせていただきます。同じような経験をして困っている人がいるかもしれませんから。

それは助かりますね♪
わたしの方ではできないことなので、そういった情報のシェアは助かると思います ( ̄∇ ̄)/

#34: Posted by YUMI [RES]

実行権限与えていなかった件は、初歩的なミスですみませんでした。

指定日投稿の件は、未来の日付で、いくつか記事を書いておいて、指定日になったら自動的に投稿するようにしていました。CRONをXサーバーは使えるのですが、「ほぼ指定日投稿」プラグインをつかって指定日投稿を試していたのです。

ご認識はあっていると思います。
いくつかの複数のブログを、それぞれの記事の投稿時刻はばらばらの日時で投稿するようにしていたのですが、インデックステンプレートのほうは再構築されていて、トップページに指定日投稿にしていた新しい記事も表示されるのですが、エントリー・アーカイブのほうが再構築されていなくて、個別記事をみようとするとリンクエラーとなってしまっているのです。
index.xmlもatomもそして、カテゴリーアーカイブも再構築はされていて、全部指定日の過ぎた記事があるということになっていて、リンクも貼られている。ところがエントリーアーカイブができてないために、RSSからもカテゴリーからも個別記事に行こうとするとリンクエラーするということが発生しています。

その後、エントリーアーカイブができないのはどうも奥がふかそうなので、mt-period.cgiでカバーしようと試しています。

それで
system("perl mt-rebuild.pl -mode=index -blog_id=$blogid -template='メインページ'");
では、たりなかった個別記事が構築されました。でもそれ以外のファイルは再構築はかからないです。
これはとにかく最新のものであっても再構築してくれるのだと、思っていたのですが、足りない個別記事
だけを再構築してくれました。月別のindex.htmlは作ってくれませんでした。
system("perl mt-rebuild.pl -mode=archive -blog_id=$blogid -archive_type=Individual");
こうしても、個別記事は足りない分だけ構築してくれました。さらに月別のindex.htmlも作成
してくれました。
system("perl mt-rebuild.pl -mode=all -blog_id=$blogid'");
これでも、足りない個別記事と月別のindex.htmlは作成してくれました。でも足りないところだけであり、
全部を強制的に再構築するというのはしてくれません。
(MovableTypeは3.35です。)

どうも腑におちない動作ではあるのですが、指定日投稿で構築されない記事のリカバリーはmt-rebuld.pl
とmt-period.cgiでできそうではあります。

#35: Posted by bzbell [RES]

>>34 YUMI さん

こんにちわ^^

そうすると、現状のmt-rebuild.plでは投稿/未投稿に関わらずビルドしてる・・・ということですね。

わたしの方で未投稿エントリを事前に作成しておいて、コマンド実行した結果を以下に記します。

  • 全ブログを対象に再構築
    [OK] # mt-rebuild -all
  • ブログID指定によるブログ全体の再構築
    [OK] # mt-rebuild -mode='all' -blog_id=1
  • ブログID指定によるブログ全体の再構築(ただし、メインインデックス除く)
    [OK] # mt-rebuild -mode='all' -blog_id=1 -no_indexes
  • ブログID指定によるエントリ・アーカイブの再構築
    [OK] # mt-rebuild -mode='archive' -blog_id=1 -archive_type='Individual'
  • ブログID指定および、エントリID指定による再構築
    [OK] # mt-rebuild -mode='entry' -blog_id=1 -entry_id=199
  • ブログID指定および、未公開エントリID指定による再構築
    [OK] # mt-rebuild -mode='entry' -blog_id=1 -entry_id=999
  • 任意のインデックス・テンプレート指定による再構築
    [OK] # mt-rebuild -mode='index' -blog_id=1 -template='Main Index'

上記いずれのコマンドを実行しても、未投稿エントリのファイルが生成されることはありませんでした。
※mt-rebuild.pl内の27行目、mt.cfg ⇒ mt-config.cgiに変更した方が良さそうです。

上記のことから、指定実行による保存時のみの現象であることが分かりました。

通常、未公開で保存するとmt_entryテーブルのentry_status(=1)となります。
※公開するとentry_status(=2)となります。

指定日実行で保存したら、entry_status(=4)でデータベースに保存されていました。
よって、指定日実行で保存するとmt-rebuild.plは、entry_status(2 or 4)含めて再構築するようです ( ̄∇ ̄)b

ですので、YUMI さんが言われるように、mt-periodic.cgiで対応するしかなさそうですね (; ̄∇ ̄A

#36: Posted by may [RES]

はじめまして。仕事でブログを製作しており、
どうしてもhtmlのままで自動再構築したく、
こちらにたどりつきました。

あまりサーバに強くないので初歩的なミスをしているのかもしれませんが、
こちらのコメント等も拝見しながら、この2日間試行錯誤しても、うまくいきません。(泣

トップページのアクセスをトリガーにして再構築、という方法で行おうとしております。

サーバはラピッドサイトです。

設定しても、何も起こらずmt-period.txtも作成されません。
間違っている箇所があれば、ご指摘いただけますでしょうか。

(http://ドメイン/test/)をBlog公開場所とし
(http://ドメイン/mt33/)にあるmt.cgiと同じ場所に
mt-rebuild.pl<パーミッション755>
mt-period.cgi<パーミッション755>
をアップ。

mtのテンプレート「メインページ」(http://ドメイン/test/index.html)の<head></head>内に
<script type="text/javascript" src="http://ドメイン/mt33/mt-period.cgi?<$MTBlogID$>"></script>
を記載しました。

mt-period.cgiはとくに変更を加えておりません。

(#!/usr/bin/perlで良いことは確認済み)


この状態で「メインページ」を再構築、サイトを表示させましたが
mt-period.txtが作成されません。

ちなみにmt33ディレクトリのパーミッションが755で
testディレクトリのパーミッションが777なので
mt-period.cgiの中のmt-period.txtの作成場所を
open HN, "../test/mt-period.txt";
としたのですがやはり何も起こりませんでした。

以下、確認したもの

●直接、ブラウザにhttp://ドメイン/mt33/mt-period.cgiとURLに入力すると
InternalServerErrorがでます

●http://ドメイン/test/index.htmlを表示させ、ソースをみると
<script type="text/javascript" src="http://●●●.com/mt33/mt-period.cgi?2"></script>
となっています

すみません、よろしくお願いいたします。

#37: Posted by bzbell [RES]

>>36 may さん

はじめまして^^

> mt-period.txtが作成されません。

そうすると、Perlのバージョンの影響かも、です。
試しに以下のスクリプトを使用してみていただけますか。

#!/usr/bin/perl -w
$blogid  = $ARGV[0];
$logfile = "../mt-period.txt" # 任意のログファイルパス
# 最終アクセス時間を外部ファイルから取得しています
open(HN, "$logfile");
$lasttime = <HN>;
$nowtime  = time;
close(HN);
# 最終アクセス時刻から30分経過したかどうかチェックしています
if ( $nowtime - $lasttime >= 1800 )
{
# ここで指定インデックス・テンプレートの再構築を行っています
system("perl bzbell-mt-rebuild.pl -mode=index -blog_id=$blogid -template='メインページ'");
# 最終アクセス時間を外部ファイルに保存しています
open(HN, ">$logfile");
print HN $nowtime;
close(HN);
}
# ブラウザから直接 mt-period.cgi を実行する場合は以下の2行を有効にします
# それ以外の場合は、必ず以下の2行をコメントしてください
#print "Content-type: text/html\n\n";
#print "done.";
1;

以前、Xサーバで、#!/usr/bin/perl -w としないとダメだったということがありました。
今回も '-w' を付けて実行してみていただけますか。

> ●直接、ブラウザにhttp://ドメイン/mt33/mt-period.cgiとURLに入力するとInternalServerErrorがでます

ブラウザから直接実行して確認したい場合には、上記スクリプトにコメントしてますのでご確認ください。

#38: Posted by may [RES]

>>33 bzbell さま

とても早いレスをいただきまして、ありがとうございます!
まさかまだお返事ないだろうな、と思いながらみたら
ご返信あったのでびっくりしました。


頂きましたソースを当て込んでみましたが、、やはり変わらずでした。。。

試しに
#print "Content-type: text/html\n\n";
#print "done.";
の#をとって、ブラウザから直接実行してみましたが、やはり
InternalServerErrorがでてしまいます。

コメントでYUMIさんが書かれていた
@ARGV[0] → $ARGV[0] も試してみましたが、変化なく・・・

明日、また1からやり直してみたいと思いますが
もし他の可能性があるようでしたらお教えいただけるとありがたいです。

#39: Posted by bzbell [RES]

>>38 may さん

こんにちわ^^

そうですか、ダメでしたか。
1つ確認していただきたいことがあります。

上記スクリプトでは、最初に最終アクセス時刻をファイルから読み出す処理が入っています。
でも、そのファイルが存在しない場合 open エラーとなります。

「500 InternalServerError」が出るということは、スクリプト内で何らかのエラーしたか、スクリプトのパーミッションに実行権限がない場合ですよね!?

そこで以下のようにエラー処理を追加してみました。

#!/usr/bin/perl -w
$blogid   = $ARGV[0];
$logfile  = "../mt-period.txt"; # 任意のログファイルパス
$nowtime  = time;
# 最終アクセス時間を外部ファイルから取得しています
if ( -e $logfile )
{
open(HN, "$logfile");
$lasttime = <HN>;
close(HN);
}
else
{
# 外部ファイルが存在しない場合
$lasttime = 0;
}
# 最終アクセス時刻から30分経過したかどうかチェックしています
if ( $nowtime - $lasttime >= 1800 )
{
# ここで指定インデックス・テンプレートの再構築を行っています
system("perl mt-rebuild.pl -mode=index -blog_id=$blogid -template='メインページ'");
# 最終アクセス時間を外部ファイルに保存しています
open(HN, ">$logfile") || die("Cannot open error.");
print HN $nowtime;
close(HN);
}
# ブラウザから直接 mt-period.cgi を実行する場合は以下の2行を有効にします
# それ以外の場合は、必ず以下の2行をコメントしてください
#print "Content-type: text/html\n\n";
#print "done.";
1;

これでもダメなのかご確認お願いします。
また、しつこいようですが合わせてスクリプトのパーミッションを確認してみてください。
たぶん mt.cgi と同じなら問題ないと思うのですが (; ̄∇ ̄A

#40: Posted by may [RES]

bzbell さん

mt-period.txt が作成されました!
ありがとうございます。

作成された、ということは
アクセスされてから30分後にメインページを再構築することが
できているのでしょうか。

今回のスクリプトを入れる前に、
randomentriesプラグインを入れていれまして
メインページのテンプレートを再構築するたびに、
一部分のエントリーをランダム表示するようにしています。

今回の「自動構築」をとりいれることで
アクセス30分後に最読込すると自動で再構築→違うエントリーが表示される
という風になるかと思ったのですが

mt-period.txtは作成されたのですが
時間をすぎて再読込しても、表示が変わりません。
(再構築ボタンを押せば変わるのでrandomentriesプラグインは作動していると
思います)

このプラグインだとそういう風にはできないのでしょうか?


ちなみに30分待つのがもったいないので

# 最終アクセス時刻から10秒経過したかどうかチェックしています
if ( $nowtime - $lasttime >= 10 )

としました


#41: Posted by bzbell [RES]

>>40 may さん

こんにちわ^^

やりましたねっ!!

> 再構築ボタンを押せば変わるのでrandomentriesプラグインは作動していると
思います

一応わたしの方でも上記スクリプトを使用したところ、再構築されることを確認しました。
ちなみに<head>~</head>の中に埋め込むタグは以下です。

<script type="text/javascript" src="<$MTCGIPath$>mt-period.cgi?<$MTBlogID$>"></script>

再構築指定しているテンプレート名称に間違いはないですか。

#42: Posted by may [RES]

>>41 bzbell さん

resが遅れてすみません。パソコンがクラッシュしてしまったので、復旧作業をずっと行っておりました。。。 (; ̄∇ ̄A

前回のご指摘、<head>~</head>内に埋め込むタグを上記に差し替えましたが、まだ更新されないです。。

テンプレート名称ですが、日本語のままで大丈夫なんですよね?

デフォルトのインデックス・テンプレート(テンプレート名:メインページ)の<head>~</head>内に上記タグを記入しており、なおかつこのページの特定の部分をランダム表示したいので

mt-period.cgiには、

system("perl mt-rebuild.pl -mode=index -blog_id=$blogid -template='メインページ'");

と、記入してあります。

う~ん、あと少しみたいなんですが。。。

#43: Posted by bzbell [RES]

>>42 may さん

こんにちわ^^

> テンプレート名称ですが、日本語のままで大丈夫なんですよね?

はい。特に問題なく再構築できましたよ。

> う~ん、あと少しみたいなんですが。。。

えと、>>40 ではログファイルが作成されたとのことでしたが、それでもメインページが再構築されないんですか!?

ページアクセス時に再構築されますが、その時表示される内容は再構築前のものが表示されるはずです。
ですので、実際に再構築されたページは次回アクセス時となりますが・・・それでもダメだったのでしょうか。

だとすると、mt-period.cgi は問題なさそうで、mt-rebuild.pl がエラーしてるとしか思えません。

  • mt-rebuild.pl は mt.cgi と同じ場所に置かれてますか!?
  • mt-period.cgi は mt.cgi と同じ場所に置かれてますか!?

上記のことを再度確認してみてください ( ̄∇ ̄)b

#44: Posted by [RES]

初めまして。複数ブログを運営しているとき、コメントを集約して表示させるのに手動で再構築せずに済む方法を探していてたどりつきました。
このページの自動再構築の手法のおかげで目的を果たせました。
ありがとうございました。

以下、思ったことですが・・・。

mt-period.cgi 内で
$logfile = "../mt-period.txt"; # 任意のログファイルパス
とした場合、
>mt-period.cgi と同じ場所に mt-period.txt というファイルが作成されて・・・

1つ上の階層に作成されないでしょうか?
(mt-period.txt自体はmt-period.cgiと同じ場所に作成されなくても動作に問題ないことだとは思いますが・・・)

もう1点、
mt-rebuildスクリプト内で、
再構築したいインデックス・テンプレート名を指定する際、
>-template='メインページ'
私もこの日本語のままで問題ないはずと思うのですが、他に問題点らしき問題点ないままさまよっていた際、こことMT管理画面の名称を試しにMainIndexと英字に表記変更するとうまく作動しました。
環境に因るのかもしれないですが、ご参考までに。

ともあれ、おかげで非常に助かりました。

#45: Posted by bzbell [RES]

>>44 羊 さん

こんにちわ^^

> 1つ上の階層に作成されないでしょうか?

そうですね、1つ上のディレクトリに作成されますね。

以前は、カレント(mt-period.cgi と同じ場所)に作成していたのですが、その後スクリプト変更して記事はそのままでした。
ご指摘ありがとうございます。

> こことMT管理画面の名称を試しにMainIndexと英字に表記変更するとうまく作動しました。

えっ Σ( ̄Д ̄;)!!
そうなんですか!? てか、日本語版の MT を使っている場合、通常、'メインページ' とされますよね!?
わたしの環境(さくらインターネット、ロリポップ)では実行できたので、問題ないかと・・・。

そういう要因もあるんだと、覚えておきます。

今後ともよろしくです (●>∀<●)/

#46: Posted by May [RES]

bzbell さん

お世話になっております。

上記からいろいろ試してみましたが、まだ構築にいたっておりません。。。
プラグインがいろいろ入っていたのでそれが原因かもしれないと思い、同じサーバの別URLにもう一度MTを入れて初期状態のままやってみました。

mt3.35をインストール

mt-rebuild.pl をmt.cgiと同じフォルダにいれ、755属性に。

#39で書いていただいたソースの中で#44を参考に、-template='メインページ'
を-template='MainIndex'に変更。
utf-8で保存。

mt-period.cgiをmt.cgiと同じフォルダにいれ、755属性に。

index.htmlのテンプレート名称を
「MainIndex」に変更し、ソースの<head></head>内に<script type="text/javascript" src="<$MTCGIPath$>mt-period.cgi?<$MTBlogID$>"></script>を追加。

保存と再構築ボタンを押す

ここまで行いましたが
mt-period.txtが作られませんでした。


うーーーーーん。何がいけないんでしょうか。
サーバはラピッドサイトを使用しているのですが。

ちなみに今回mtのおき場所は
http://●●●.com/●●●/●●●/mt.cgi

なのですが、問題ないですよね。mt.cgiは問題なく作動しているので、、、

#47: Posted by bzbell [RES]

>>46 May さん

ご無沙汰しております。
さっそくですが、以下のことを確認していただけますか。

  1. >>34 のコードをそのまま利用した場合、mt-period.txt は mt-period.cgi を置いた場所の1つ上のディレクトリ内にに作成されます。
    そちらにも作成されてませんか。

  2. ラピッドサイトでは TELNET や SSH によるサーバ接続が可能なようですね。
    では、TELNET( or SSH) で接続後、mt-period.cgi があるディレクトリに移動してください。
    そして、以下のコマンドを実行することでエラーが出力されるか、または、mt-period.txt が作されるか確認してください。

    $ cd $HOME/mt
    $ ls mt-period.cgi mt-rebuild.pl
    $ ./mt-period.cgi ブログID
    

    もし、上記コマンド実行によりエラーが出力された場合、お手数ですがエラー内容をご連絡してただけますか。
    また、正常に終了して mt-period.txt が作成された場合、特に問題ありません。他の外部要因が考えられると思います。

#48: Posted by may [RES]

bzbell さん
おせわになっております。

最初の$ cd $HOME/mtは、「mt-period.cgi があるディレクトリに移動」の意味ですよね。


移動後、
$ ls mt-period.cgi mt-rebuild.pl
と入力、エンターをおしたら
mt-period.cgi mt-rebuild.pl
と表示され、続けて
./mt-period.cgi 1
と入力しましたら

./mt-period.cgi: Exec format error. Binary file not executable.


と表示されました。

いかがでしょうか。m(._.)m


#49: Posted by bzbell [RES]

>>48 may さん

こんにちわ^^

> 最初の$ cd $HOME/mtは、「mt-period.cgi があるディレクトリに移動」の意味ですよね。

はい。そうです。
お手数おかけしてすいません。ありがとうございます。

「./mt-period.cgi: Exec format error. Binary file not executable.」の出力結果ですが、エラー内容から mt-period.cgi を実行可能なバイナリファイルでないからエラーしてるみたいです。

  1. mt-period.cgi の1行目のパスは正しいでしょうか。

  2. Perl スクリプトが実行可能な環境・・・ですよね (; ̄∇ ̄A

  3. mt-period.cgi のコード中にラピッドサイトではインストールされていないライブラリを使用してる!?

調べてみます。

#50: Posted by May [RES]

bzbell さん

ありがとうございます。

1.について

#!/usr/bin/perl で大丈夫です。mt-cgiファイルとおなじものです。
ラピッドサイトには、
/usr/local/bin/perl (もしくは /usr/bin/perl)
とありましたので
#!/usr/local/bin/perl
に変更してみましたが変わりありませんでした。

2.について

関係ないかもしれませんがmt-check.cgiで出てくる表示には

Perl のバージョン: 5.8.4

とでてきます。(この表記が実行可能な環境である、ということではないのでしたら、何を調べればよいかおしらせください。)

>調べてみます。

すみません。m(._.)m

他に私の方で調べることがあればお知らせください。

#51: Posted by bzbell [RES]

>>50 May さん

そうですか。
もしかすると 1. かなと思ったのですが (´Д`;)

> 他に私の方で調べることがあればお知らせください。

では、他の Perl スクリプトを同様に TELNET( or SSH)で実行した場合、どのような結果になりますか!?
たとえば、以下のようなスクリプトを適当なファイルに保存してパーミッションを 755 に変更します。

#!/usr/bin/perl -w
$t = time();
print "$t\n";
1;

予想では上記スクリプトも同様のエラーが出るんでしょ!? と思ってるのですが・・・どぅでしょ (´・д・`)

#52: Posted by May [RES]

bzbell さん

お世話になっております。

2通りの方法を試しました。

(1)新しくメモ帳で上記コマンドを記入(UTF-8保存)
sshで実行したところ、やはり同じエラーがでました。

今までインストールに成功している他のプラグインは、
CGIファイルをダウンロード&アップロードするだけで
コマンドをコピーしてUTF-8保存、ということをしていないので
そこになにか不具合があるのかと思い、(2)を試してみました。

(2)うまく実行できている「mt-check.cgi」ファイルをダウンロード、
上記コマンドに差し替え「test2.pl」と名前変更しアップロード、
sshで実行したところ、


Name "main::t" used only once: possible typo at ./test2.pl line 4.
use of uninitialized value in concatenation (.) or string at ./test2.pl line 4.


というコメントが出ました。これはうまくいっているのでしょうか?

#53: Posted by bzbell [RES]

>>52 May さん

こんにちわ^^

> (1) について

やっぱりそうですか。
う~ん(つω-`。)

> (2) について

namespace のエラーでしょうか。
以下のように実行してみてください。

$ perl ./test2.pl

たぶんこれで mt-check.cgi と同様の結果が得られると思います ( ̄∇ ̄)b

#54: Posted by May [RES]

できました~~!! (≧▽≦)

mt-check.cgiのファイルをダウンロードして
mt-period.cgiの内容・ファイル名に書き換え
アップロードしたら
ランダムに切り替えができるようになりました!!!

どうやら、cgiの書き方ではなく、
ファイルの保存の仕方、がまずかったようです。
でも、メモ帳でファイル保存でUTF-8を選んでいるのに
なんでダメだったのか・・・。

bzbell さんには
本当に何度も、貴重なお時間を割いていただき、ありがとうございました。
これからもこちらのHPにアクセスして
いろいろ勉強させていただきます。

ありがとうございました。

#55: Posted by bzbell [RES]

>>52 May さん

PHP 版を作ってみました。

<?php
if (!isset($_REQUEST['blogid'])) return;
$blogid  = $_REQUEST['blogid'];
// 任意のログファイルパス(必ず書込み権限(757以上)のあるディレクトリ先を指定)
$logfile = '../mt-period.txt';
// 現在時刻取得
$nowtime = date('ymdHis');
// 最終アクセス時間を外部ファイルから取得しています
if (file_exists($logfile))
{
$fp       = fopen($logfile, 'r');
$lasttime = fgets($fp);
fclose($fp);
}
else
{
// 外部ファイルが存在しない場合
$lasttime = 0;
}
// 最終アクセス時刻から30分経過したかどうかチェックしています
if (1800 <= ($nowtime - $lasttime))
{
// ここで指定インデックス・テンプレートの再構築を行っています
system("perl mt-rebuild.pl -mode=index -blog_id=$blogid -template='●●●'");
// 最終アクセス時間を外部ファイルに保存しています
$fp = fopen($logfile, 'w');
flock($fp, LOCK_EX);
stream_set_write_buffer($fp, 0);
rewind($fp);
fwrite($fp, $nowtime);
flock($fp, LOCK_UN);
fclose($fp);
}
?>

使い方は以下の通りです。

<script type="text/javascript" src="<$MTCGIPath$>mt-period.php?blogid=<$MTBlogID$>"></script>

ロリポップ、さくらインターネットでは動作確認しました。
May さんお使いの、ラピッドサイトでご確認ください。

#56: Posted by bzbell [RES]

>>54 May さん

> できました~~!! (≧▽≦)

やりましたねっ (●>∀<●)/
よかったぁ (; ̄∇ ̄A

先ほどすれ違いで PHP 版 mt-period.php をお知らせ(>>55)したところだったんです。

結果からすると、UTF-8 で保存されてなかったということですね。
文字コードが異なると、バイナリファイルとして認識されてしまうんですね・・・勉強になりました♪
貴重な経験だったかも、です。

#57: Posted by ドラゴン [RES]

作者様 すばらしいプラグインをありがとうございます。


何とか使えるようになって感激しております。

質問があるのですが・・・・

<http://123.com>
<http://aaa.123.com>
<http://bbb.123.com>
<http://ccc.123.com>
<http://ddd.123.com>
<http://123.com/eee/>
<http://123.com/fff/>


という感じで、サブドメインなどでたくさんブログを作った場合、
すべて再構築するなら

-----------------------------------------------------------
# ここで指定インデックス・テンプレートの再構築を行っています
system("perl mt-rebuild -all");
# 最終アクセス時間を外部ファイルに保存しています
open(HN, ">$logfile") || die("Cannot open error.");
print HN $nowtime;
close(HN);
}
-----------------------------------------------------------
でOKですよね? 特定のブログのすべてを再構築する場合は
-----------------------------------------------------------
# ここで指定インデックス・テンプレートの再構築を行っています
system("perl mt-rebuild -mode='all' -blog_id=1");
system("perl mt-rebuild -mode='all' -blog_id=3");
system("perl mt-rebuild -mode='all' -blog_id=6");
# 最終アクセス時間を外部ファイルに保存しています
open(HN, ">$logfile") || die("Cannot open error.");
print HN $nowtime;
close(HN);
}
-----------------------------------------------------------

というように必要なブログIDを改行して入れればよいのでしょうか?

で各ブログに
<script type="text/javascript" src="<$MTCGIPath$>mt-period.cgi?<$MTBlogID$>"></script>
を入れればよいでしょうか?


質問の仕方が悪くて申し訳ありませんが、自動再構築したい
ブログとそうでないブログがあった場合のやり方を教えて
いただけるとありがたいです m(__)m

#58: Posted by bzbell [RES]

>>57 ドラゴン さん

こんばんわ^^

すべて再構築するならドラゴン さんのおっしゃる通りで OK です ( ̄∇ ̄)b

また、特定のブログのみ更新したい場合もおっしゃる通りで問題ありません ( ̄∇ ̄)/
各ブログから実行する mt-period.cgi のパラメータにブログ ID を渡すわけですが、このケースの場合はパラメータのブログ ID は意味を成しません。
でも、特に問題にもなりませんので OK です♪
ただし、複数のブログから再構築が実行されることになるので、工夫(排他制御)が必要ですね。

ちょっとお時間いただけますか。考えてみます。

#59: Posted by bzbell [RES]

>>57 ドラゴン さん

遅くなりました。
以下のように mt-period.cgi をカスタマイズしました。

#!/usr/bin/perl -w
$blogid   = $ARGV[0];
$logfile  = "../mt-period.txt"; # 任意のログファイルパス
$locfile  = "../mt-period.loc"; # 排他制御用のファイルパス
# 再構築中かどうかチェックします
# ※再構築中の場合何もせず終了します
if (symlink(".", $locfile))
{
$nowtime  = time;
$lasttime = 0;
# 最終アクセス時間を外部ファイルから取得しています
if (-e $logfile)
{
open(HN, "$logfile");
$lasttime = <HN>;
close(HN);
}
# 最終アクセス時刻から30分経過したかどうかチェックしています
if (1800 <= $nowtime - $lasttime)
{
# ここで特定のブログを再構築します
$blogs = "perl mt-rebuild.pl -mode=all -blog_id=1;
perl mt-rebuild.pl -mode=all -blog_id=2;
perl mt-rebuild.pl -mode=all -blog_id=3;
";
system($blogs);
# 最終アクセス時間を外部ファイルに保存しています
open(HN, ">$logfile") || die("Cannot open error.");
print HN $nowtime;
close(HN);
}
# 排他制御用のロックファイルを削除します
unlink($locfile);
}
# ブラウザから直接 mt-period.cgi を実行する場合は以下の2行を有効にします
# それ以外の場合は、必ず以下の2行をコメントしてください
#print "Content-type: text/html\n\n";
#print "done.";
1;

再構築中の判断として、mt-period.loc ファイルを作成します。
このファイルが存在している間は再構築されないようにしています。
mt-period.loc ファイルは、mt-period.txt と同じ場所を指定してください。

以上です。
ご確認お願いします ( ̄∇ ̄)/

#60: Posted by ドラゴン [RES]

作者様

早速カスタマイズしていただいていたのに
お礼が遅くなってしまい、大変失礼いたしました。


質問を投稿させていただいたときに、説明不足で
ちゃんと意味が通じるか不安でしたが、思っていたとおり・・


いやそれ以上に排他制御のことまで考えていただき、
感謝しております。

お忙しい中、本当にありがとうございますm(__)m


早速使わせていただきましたところ、作ったブログにアクセスすると
mt-period.txtはタイムスタンプが更新されていたのですが、mt-period.locは
同じ場所に作成されていません。


最初(カスタマイズする前)のmt-period.cgiを使っていたときに、一つ
ブログを作っていました。

IDは2です。

その後
ID3
ID4 と二つのブログを作成しました

カスタマイズしたmt-period.cgiをアップして、ID3とID4の
ブログにアクセスしたところなぜかID2のブログが更新されていて、
3と4は更新されていませんでした。


どこか私の設定かおかしいかも知れません(汗)


何度かトライしてみます

#61: Posted by bzbell [RES]

>>60 ドラゴン さん

こんばんわ^^

> ちゃんと意味が通じるか不安でしたが、思っていたとおり・・

えっ Σ( ̄Д ̄;)!! すいません、わたし勘違いしてました!?

> mt-period.locは同じ場所に作成されていません。

はい。mt-period.loc は一時的に作成されるだけで、不要になったら削除されます ( ̄∇ ̄)b

> どこか私の設定かおかしいかも知れません(汗)

あ~なるほど (; ̄∇ ̄A
ドラゴン さんがやりたかったことは、ブログ 2 にアクセスされたらブログ 2 だけを、ブログ 3 にアクセスされたらブログ 3 だけを再構築したいわけですね (; ̄∇ ̄A

それでしたら最初(カスタマイズする前)の mt-period.cgi をベースに以下のようにカスタマイズしてください。

4行目
変更前
$logfile  = "../mt-period.txt"; # 任意のログファイルパス
変更後
$logfile  = "../mt-period" . $blogid . ".txt"; # 任意のログファイルパス

上記変更により、ブログごとの mt-period.txt が作成されます。
たとえば、ブログ 2 の場合は、mt-period2.txt というファイルが作成されるはずです。

わたしの理解が乏しいばかりに・・・すいません (´Д`;)

#62: Posted by ドラゴン [RES]

作者様


すばやいレスありがとうございます m(__)m

-----------------------------------------------------------
あ~なるほど (; ̄∇ ̄A
ドラゴン さんがやりたかったことは、ブログ 2 にアクセスされたらブログ 2 だけを、ブログ 3 にアクセスされたらブログ 3 だけを再構築したいわけですね (; ̄∇ ̄A
-----------------------------------------------------------

そういうことだったんです。

やはり文章力のなさから作者様にはお手を煩わせてしまい、
申し訳ありませんでした(汗)


-----------------------------------------------------------
わたしの理解が乏しいばかりに・・・すいません (´Д`;)
-----------------------------------------------------------

とんでもありません。
このような貴重な情報を無料で公開していただいていることに
感謝いたしております。


本日出社が早いため、帰宅しだいご指導いただいた
やり方を試してみます。

お忙しい中、ありがとうございます。

感謝!

#63: Posted by ドラゴン [RES]

作者様

ドラゴンです。
会社の昼休みを利用して設定してみました。


下記の設定でmt-period.cgi をアップしました。
各ブログごと(ID2、3、4、)の mt-period.txt が出来上がっています。


しかし・・・・(汗)

どのブログにアクセスしても更新されるのはID2のブログ
だけなのです(涙)


私の設定方法がどこか悪いのかと思いますが、
お気づきの点がありましたら、教えてくださいませ m(__)m

-----------------------------------------------------------
#!/usr/bin/perl -w

$blogid = $ARGV[0];
$logfile = "../mt-period" . $blogid . ".txt"; # 任意のログファイルパス
$nowtime = time;

# 最終アクセス時間を外部ファイルから取得しています
if ( -e $logfile )
{
open(HN, "$logfile");
$lasttime = ;
close(HN);
}
else
{
# 外部ファイルが存在しない場合
$lasttime = 0;
}

# 最終アクセス時刻から30分経過したかどうかチェックしています
if ( $nowtime - $lasttime >= 1800 )
{
# ここで指定インデックス・テンプレートの再構築を行っています
system("perl mt-rebuild.pl -mode='all' -blog_id=$blogid");
# 最終アクセス時間を外部ファイルに保存しています
open(HN, ">$logfile") || die("Cannot open error.");
print HN $nowtime;
close(HN);
}

# ブラウザから直接 mt-period.cgi を実行する場合は以下の2行を有効にします
# それ以外の場合は、必ず以下の2行をコメントしてください
#print "Content-type: text/html\n\n";
#print "done.";

1;

#64: Posted by bzbell [RES]

>>63 ドラゴン さん

こんばんわ^^

そうですか。
複数の mt-rebuild.pl 実行ってのは無理かも、ですね。
1 つのプロセスが再構築を担わないとダメですね。

考えてみれば、MT の管理画面から再構築するにしても、1つ1つ行ってますもんね。

となると、今思いつくことは、以下のステップを踏むようになると思います。

  1. 各ブログアクセス時に、再構築を依頼(キューイング)する
  2. 再構築用プロセスを実行して、そのプロセスがキューイングされたブログを順次再構築していく

こんなかんじのことが可能であれば、ドラゴン さんがやりたいことが実現できそうです。ただし、順次処理になるのでタイムラグが発生します。

またまたお時間いただけますか。
よ~く考えてみます。

#65: Posted by 守屋 [RES]

管理者様

守屋と申します。
今、貴殿のプログラムを使用させていただこうと
思考錯誤中です。
mt-period.txtも作成されている状態ですがいまいち
mt-rebuild.plの記述方法がわかりません。
インデックスを再構築するとして変更すべき箇所を以下のようにしたのですが間違いでしょうか?2箇所あるうち1箇所でいいんでしょうか?ご指導いただけると幸いです。

(抜粋)
my $help_msg = mt-rebuild Usage:

mt-rebuild -mode='index' -blog_id=16 -template='メインページ'
OR

mt-rebuild -mode='index' -blog_id=16 -template='メインページ'

See the POD documentation embedded in this script for more detail.
HELP_MSG

#66: Posted by bzbell [RES]

>>65 守屋 さん

こんばんわ^^

はい。守屋 さんの記述で問題ありませんよ。
ちなみに、さくらインターネットでは!? mt-rebuild というようには実行できませんでした。

# perl mt-rebuild.pl -mode='index' -blog_id=1

上記のように、'perl' コマンドを明示的に 'mt-rebuild.pl' と、フルネームでないとビルドできませんでした。また、-mode='index' の場合、-template='●●●' を指定しないとエラーしますのでご注意を。
ご参考までに・・・。

#67: Posted by 守屋 [RES]

管理者様

すばやいご返答ありがとうございます。

ファイル名指定をmt-rebuild.plとしたのですが
やはり再構築がかかりません。
下記のように記述しているのですが
どうでしょう?ご指導お願い致します。
-------------------------------------------------------------
●mt-period.cgi変更部分

# ここで指定インデックス・テンプレートの再構築を行っています
system("perl mt-rebuild.pl -mode=index -blog_id=$blogid -template='MainIndex'");

--------------------------------------------------------------
●mt-rebuild.pl 変更部分

mt-rebuild Usage:

mt-rebuild.pl -mode='index' -blog_id=16 -template='MainIndex'
OR

mt-rebuild,pl -mode='index' -blog_id=16 -template='MainIndex'

See the POD documentation embedded in this script for more detail.
HELP_MSG
;

#68: Posted by bzbell [RES]

>>67 守屋 さん

こんばんわ^^

再構築できないとは、何らかのエラーがでてるってことでしょうか ( ̄∇ ̄)b
ちなみに 「Can't locate MT.pm ・・・ 」てなかんじのエラーでてますか!?
もしその場合、mt-period.cgi、mt-rebuild.pl を mt.cgi と同じ場所においてください。
特に mt-rebuild.pl は mt.cgi と同じ場所じゃないとダメです (>∀< )

あと、mt-rebuild.pl の 27 行目を以下のように変更してください。

変更前
my $mt = MT->new( Config    => $MT_DIR . 'mt.cfg',
変更後
my $mt = MT->new( Config    => $MT_DIR . 'mt-config.cgi',
#69: Posted by 管理者様 [RES]

またまたご返答いただき、ありがとうございます!
再構築できないとは、エラーとかは特にでないのですが設定した時間に自動再構築がかからないということです。

mt-period.cgi、mt-rebuild.pl は mt.cgi と同じ場所においてます。

mt-rebuild.pl の 27 行目は直しました。

が、まだダメです。
ほかに要因は考えられませんでしょうか。。。

#70: Posted by bzbell [RES]

>>69 管理者様 さん

こんばんわ^^

> 再構築できないとは、エラーとかは特にでないのですが設定した時間に自動再構築がかからないということです。

では、mt-period.cgi を使用した場合、

  1. mt-period.txt というファイルが作成されます。そちらは作成されますか!?
  2. mt-period.cgi 内で mt-period.txt が作成されるディレクトリのパーミッションに書込み権限はありますか!?
  3. そもそも、mt-period.cgi のパーミッションに問題はありませんか!?
  4. 今さら聞くのなんですが、守屋 さんが mt-rebuild.pl の以下の場所を変更したのはなぜでしょう (; ̄∇ ̄A
    mt-rebuild Usage:
    mt-rebuild.pl -mode='index' -blog_id=16 -template='MainIndex'
    OR
    mt-rebuild,pl -mode='index' -blog_id=16 -template='MainIndex'
    See the POD documentation embedded in this script for more detail.
    HELP_MSG
    ;
    

が、考えられると思います。
まずは 1 つずつ要因をつぶしていきましょ♪

  

 Post a Comment

コメント用フィード