CMS構築を目的にPHPをベースとしたWordPress、CakePHPやPEARなどオープンソースを中心に解説しています

MovableTypeは再構築などが重いという印象を持っている人も少なくないかと思いますが。
私も、全体を再構築した場合に、レスポンスが帰ってこずに、そのままタイムアウトということもしばしばあります。特に、Google ChromeでMTを操作すると、管理画面の画面遷移だけでタイムアウトする場合があるのは私だけでしょうか。
画面が真っ白になったりすると、既存のデータは大丈夫?といった不安にかられます。大丈夫なんでしょうけど、万が一、長年蓄えてきた記事、知識、ログが一切失われるとなると、とっても悲しいですね。

そこで、今回、私の環境であるMovableType5.0のバックアップの取得方法です。
そうでなくても定期的に取るべきなんですけどね。

WordPressの記事投稿で、改行を1つ入れるとbrタグ、2つでpタグが自動で挿入されます。
それを前提にテンプレートやCSSが用意されていれば有用なのですが、そうでない場合、例えば独自CMSを開発している場合など、邪魔になるケースもあります。

そこで、フィルター関数を使って、brタグ、pタグが自動挿入されないようにします。
functions.phpに以下の1行を追加するだけです。

このブログもだいぶ技術的な記事が多くなり、大きくカテゴリで分けるようなデザインにしたのですが、そうなると「パンくず」がほしくなってきました。もはやブログっぽくないですね。

まず、ブログ記事については以下のようなコードを記述し、リストをレイアウトしてあげれば「パンくず」を表現できます。

<ul>
<li><a href="<$MTBlogURL$>">HOME</a></li>
<MTEntryCategories>
<MTParentCategory>
<li class="arrow"><a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a></li>
</MTParentCategory>
<li class="arrow"><a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a></li>
</MTEntryCategories>
<li class="arrow"><$MTEntryTitle$></li>
</ul>

表示は「ホーム > カテゴリ > サブカテゴリ > 記事タイトル」となります。サブカテゴリが存在しない場合、つまりそれ自身が親カテゴリに属している場合はMTParentCategoryが無視されるので「ホーム > カテゴリ > 記事タイトル」となります。

最近、MTが重過ぎる。。。
記事が100件を超えたぐらいから、全ページの再構築に5分以上かかるようになってしまいました。最大で10分近くかかることも。
そこで、MTの高速化に効果があるといわれているPHPのモジュール化を試してみました。

MTのPHPモジュール化とは

ずばりMTのPHPモジュール化とは、MTの構成を一部PHP化することで再構築の負荷を減らします。

MTの再構築では記述されたテンプレート内のMTタグがプログラムに解釈され、ページが生成されます。つまりは、MTタグの命令が多いほど再構築には時間がかかります。そこで、MTタグを減らせば再構築スピードも速くなるはずです。

例えば「最新の記事」。「最新の記事」は一般的に全ページのサイドバーに組み込まれます。これをふつうに100ページの記事を再構築するとなると、単純に「最新の記事」を生成するロジックが100回実行されます。もちろん「最新の記事」だけではないので、ページが増えれば累乗的に負荷が大きくなることが理解できます。

そこで、PHPのモジュール化をすると「最新の記事」は一度しか生成しません。生成した結果をPHPで全ページに読み込ませるというしくみです。

WordPressで新規投稿ができなくなりました。。。

管理画面にログインし、新規登録や記事の編集をクリックすると、記事を編集するエディタが表示されるが、5秒ぐらいすると画面が真っ白になり、エディタのボタン部分しか表示されなくなります。
特に何か設定を変更した覚えもなく、急にこのような状況になりました。。。

環境が悪いのかと、いろいろと試したところ、以下の条件で発生することが分かりました。

WordPressでRSSを配信しようと思いましたが、ソースを見てもそれらしいファイルが見当たりません。
拡張子が「.rss」「.xml」とか、それらしい名前のphpファイルやテンプレートを探してみたがよく分かりません。

少しwebで調べてみるとあっさり解決しました。というよりまずはマニュアルを調べればよい話ですが。。。
以下のようにフォーマット別にトップのphpにパラメータを付加してしまえばいいだけ。

http://cms.helog.jp/?feed=rss
http://cms.helog.jp/?feed=rss2
http://cms.helog.jp/?feed=rdf
http://cms.helog.jp/?feed=atom

ちなみに以下のように、catパラメータを付加することにより、記事をカテゴリで絞ることができます。

http://soccer.he-ron.jp/?feed=atom&cat=5

近年ではMovable TypeやGoogleが採用していることから、フォーマットはatomがおすすめです。
よし、これで他のサイトに記事の更新状況を載せることができるぞ!

レンタルサーバにMovable Typeのインストールして、早速ブログを書いてみました。
しかし、書いた記事にアクセスすると「500 Internal Server Error」となります。
FTPで確認してみると確かに記事ファイルは生成されています。
いろいろと調べてみたところ、レンタルサーバとの相性に問題があるみたいです。

MTではデフォルトで、フォルダは「777」、ファイルは「666」の属性で出力するようになっています。例えば、今回のレンタルサーバはCPIでしたが「セキュリティ的にユーザに書き込み許可をあたえるファイルにはアクセスさせないよ」(たぶん。。。)ということで、サーバーエラーを出力するみたいです。

そこで、MTの設定を変更して運営します。
フォルダを「755」、ファイルを「644」で出力するための設定として、「mt-config.cgi」に以下を追記します。

こんにちは、helog.jpの管理者です。

Web技術者として日々お仕事する中、「実際に触って学ぶ」事が多く、いくつもサイトを立ち上げては潰すことを繰り返してもうすぐ10年になります。

新しい技術、興味のある技術、仕事に必要な技術があると、とりあえず自身のサイトに導入してみる。その過程をそのままそのブログにメモとして書き留める。たまに失敗してサイトを壊す。。。といった感じです。かわいそう。

さて、近年、「小規模で簡単にCMSサイトを作れる」技術が充実してきたような気がします。
WordPressもブログツールとしてだいぶ安定してきて、CMSサイトを構築する機能やプラグインも増えてきました。
まだ精度は高くなくとも、CakePHPやFuelPHPなどPHPベースのフレームワークの今後も期待できます。

そうです。何を隠そう、このサイトも、新しい実験台がほしかったのでオープンした次第です。

「CMS helog」が今後どのような変貌を遂げるのか見守っていただければ、
また、メモ代わりの技術記事が少しでも世のためになればという思いをのせて、スタートいたします!!

CakePHP1.3でWebアプリケーションを構築する上で、Authコンポーネントを使った管理画面を作ってみます。

前提として、adminコントローラ配下に認証をかけることにします。つまりCakePHPで構築したサイト内で「http://xxx.xxx.xxx/admin」にアクセスするためには管理者権限を必要とするようにします。

ユーザ管理テーブルを用意する

ユーザIDとパスワードを管理するテーブル「users」を用意します。

CREATE TABLE users ( 
	id INTEGER(8) auto_increment PRIMARY KEY,
	username VARCHAR(50) NOT NULL, 
	password VARCHAR(50) NOT NULL, 
	date_create VARCHAR(19) NOT NULL, 
	date_update TIMESTAMP NOT NULL
);

最低限「ユーザID」と「パスワード」の2カラムを用意します。その他のカラムは任意です。また、カラム名は変更可能ですが、デフォルトの「username」「password」とします。今回は記述しませんが、カラム名を変更するためにはコントローラ内で設定が必要です。
今回、このテーブルへのINSERTは手動で行います。パスワードはハッシュ値を登録します。

例えば、CDショップのサイトをCakePHPで構築するとして、ロック音楽のパスを「/cd/rock/」、ポップ音楽のパスを「/cd/pop/」としたと仮定します。

CakePHPのコントローラの基本的なルールでは、「/cd/rock/」にアクセスがあった場合に、コントローラ「CdController」のメソッド「rock」で処理が行われ、ビュー「/app/views/cd/rock.ctp」で表示されます。
同じくして、「/cd/pop/」にアクセスがあった場合に、コントローラ「CdController」のメソッド「pop」で処理が行われ、ビュー「/app/views/cd/pop.ctp」で表示されます。

ここでコントローラの処理についていうと、ジャンルは違えど処理はほとんど同じのはずです。処理を共通化したい場合には、コンポーネントを活用すればよいことは以前書きました。
CakePHPでコンポーネントを作成する

Monthly Archives

Search