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

巷では、少し前からWordPressのxmlrpc.phpへの攻撃というのが流行りだしたようです。
今回、私もその被害に合うことになり、経緯と対策をまとめておきたいと思います。

問題の発端

ある日突然、当ブログへのアクセスが悪くなりました。
ブラウザでアクセスしようとすると、8割ぐらいの頻度で503エラーになってしまいます。

503 Service Temporarily Unavailable

共有サーバで複数サイトを運用しているので、試しに他のサイトにアクセスしてみると同じ症状です。
ページのほとんど503エラーが返され、サイトにアクセスすることができません。

503エラーなので、サーバにアクセスが集中して高負荷状態になり、繋がりにくくなっていることが考えられます。

「爆発的に人気が急上昇したページでも?」と淡い思いを抱きながらも、アクセス解析サイトを確認してみました。
しかし、解析結果に特に目立った変化はありません。
それもそのはず、503はそもそもサイトにアクセスできていないエラーなので、Google Analyticsなどの解析結果には反映されません。

FuelPHPのmigration機能は、コマンドラインやプログラムから簡単にDBのテーブルを操作、管理できます。
ドキュメントは少なく、その概念を理解するのには少々苦労しますが、使いこなせば非常に便利です。

そこで、私がこれまでに実行したmigrateコマンドを、ここに随時、メモとして書き留めておきたいと思います。

migrateの実行

テーブルの追加、削除、カラム追加、削除や変更などの設定を、oilコマンドを使ってmigrationファイルを生成することができます。
例えばテーブル「sample」を作成する場合は、以下のコマンドを実行します。

php oil generate migrate sample (...カラムの設定などは略)

するとフォルダ「/fuel/app/migrations/」に「001_create_sample.php」というファイルが生成されます。
このファイルの中にはテーブルの定義が記述されており、以下のmigrateコマンドを実行することで、実際にDBに反映されます。

php oil refine migrate

generateコマンドを実装する度に「002_」、「003_」と連番でmigrationファイルが生成されていきます。
これはDBの状態をバージョン管理するためであり、以下のようにコマンドを実行することで、いつでもDBの状態を変更できます。

php oil refine migrate:current	(最新の状態にする)
php oil refine migrate:up	(バージョンを一つ新しくする)
php oil refine migrate:down	(バージョンを一つ古くする)
php oil refine migrate --version=10	(指定したバージョンに更新する)

つまり、migrationファイルを適切に管理することで、本番環境、ステージング環境や開発環境など各環境でDB設定を同期できます。

それでは、具体的にさまざまなDB操作に関するmigrateコマンドを記していきます。

FuelPHPはMVC(Model、View、Controller)フレームワークとして知られていますが、『ビューモデル(ViewModel)』というオプションが存在します。

その名の通り、ViewとModelの中間の担うクラスなのですが、今回はその利用方法を勉強したいと思います。
※実際のイメージではControllerとViewの間?

「ビューモデル」とは?

「ビューモデルとは?」ですが、
例えばMVCで構築する場合、任意のテーブルの情報を取得し画面に一覧として表示する処理を考えます。

Controller内でModelからデータを取り出し、HTMLコードで整形し、Viewに渡して表示させます。
それに対して以下のような意見が出ることがあるでしょう。
「HTMLの整形はビューでやるべきでコントローラの中でHTMLタグを扱うべきではない」

一方で、ModelのデータをViewに渡して、View内でループさせたり値のフォーマットを調整したりしてHTMLを整形させます。
そうすると以下のような意見もあります。
「View内では表示処理のみで、あれこれロジックを組むべきではない」

はたまたこんな事言う人も。
「Modelはそれ自身の役割があるからController内(またはView内)で呼び出すべきじゃない」

。。。決めの問題で、どっちでもいい気がします。

そんな時、そんな処理はViewModelに記述しましょう!

FuelPHPの機能を活用して、良い感じで他言語対応サイトを構築できないか、考えてみました。

そこで、クラスAgent、Cookie、Langを活用したサイト構築にトライしてみました。
今回は、日本語ユーザがブラウザでアクセスした際は日本語表示で、そうでない場合は英語表示でサイトを切り替えることを目指します。

言語ファイルの用意

まず、言語を切り替える文言について、言語ファイルを「/fuel/app/lang/」に用意します。
ファイル名は任意ですが、各言語はフォーマットを含めて統一させます。
例えば以下のファイルを用意します。

WordPress 4.4にアップデートしてから、記事に投稿した画像の出力まわりがおかしくなりました。
Firefoxでサイトを確認してみると、それまで画像が表示されていたところが表示されなくなっている。。。

ソースをチェックすると、画像メディアを追加してサムネイルを表示していた部分が以下のようになっていました。

<img src="/images/sample-300x250.jpg" alt="サンプル" width="300" height="250" class="size-medium wp-image-3114" srcset="/images/sample-300x250.jpg 300w, /images/sample.jpg 525w" sizes="(max-width: 300px) 100vw, 300px" />

「srcset」や「sizes」など見慣れない属性が追加されています。

どうやら、レスポンシブに対応するべく追加された新しい機能のようです。
ブラウザサイズに応じて画像を切り替えたり、Retinaディスプレイなど解像度の高いデバイスに対応したりと、
レスポンシブサイトにおいて、あらゆるデバイスに対して最適な画像を動的に出力してくれるようです。
つまり、画像が荒れたり、必要もないのに全てのサイズの画像を読み込んだりといったリスクを避けることができるようです。
※この技術の詳細についてはまた次回の宿題とします。。。

PHPの関数「unserialize」でエラーが発生する場合の対処方法です。

久しぶりにドツボにはまりました。。。
「serialize」で処理されたデータについて「unserialize」で元に戻そうとしたのですが、どうしてもエラーになってしまいます。

unserialize($data);
unserialize(): Error at offset xxx of xxx bytes

私のケースでは、FuelPHPでユーザ管理のモデルを作成し、プロフィールフィールドにデータを格納したときのお話です。
拡張性を持たせたテーブルのプロフィールフィールドは、1つのカラムに配列をシリアライズしたデータを格納します。
そのデータをSQLで取り出し、「unserialize」した時にエラーになってしまうのです。
ちなみに、現象が発生した環境は以下の通りです。

  • Windows 7 64bit Professional
  • Apache 2.4
  • PHP 5.4
  • FuelPHP 1.7
  • MySQL 5.5

ネットで調べてみると、似たような現象がちらほら見受けられます。

FuelPHPのValidationクラスを使ってフォームの項目チェックを実装します

例えば、フォームで入力された「ユーザ名」の入力必須をチェックします。

ユーザ名:<input type="text" name="username" value="">

「投稿する」などsubmitボタン押下時に、コントローラ内でValidationを実行します。
上記のHTMLからポストされた「ユーザ名」の必須チェックを行う場合、以下のように記述します。

$val = Validation::forge();
$val->add('username', 'ユーザ名')
	->add_rule('required');
if($val->run()){
	// チェックOK
}else{
	// 入力エラー
}

関数「add」の第1引数に要素名、第2引数に要素のラベルを設定します。ラベルはエラーメッセージの表示の際などに利用されます。
「add_rule」に「required」を設定することで必須チェックをします。
「run」でValidationを実行し、入力内容に問題がなければtrueが返されます。この判定で、DBへのデータの入出力や、どのviewで画面を表示するかなどの処理を分岐させることができます。

ヘッダ、フッタやサイドメニューなど共通部品をテンプレート化するため、FuelPHPのTemplateコントローラを導入してみます。

CMSでサイトを構築する場合に、各ページのヘッダ、フッタなどの共通部分については一元管理したいですよね。
FuelPHPでその方法を探していました。
View部分の機能で実現すると思い込み、ドキュメントを読んでいたのですが、出てきたキーワードが「ビューの入れ子」。
その名と通り、Viewの中でさらにViewを読み込むということですが、何だかスマートじゃない。。。

その他をいろいろと調べていたら「Templateコントローラ」という機能を見つけました。
FuelPHPではコントローラでレイアウトのテンプレートを定義するのですね。

さて、以下、導入方法です。
ちなみに今回確認したのは「FuelPHP 1.7.3」です

ある日突然、PHPの日付関数「date()」と「strtotime()」からワーニングメッセージが表示されるようになりました。
さくらレンタルサーバ上で個人で運用しているCMSを長らく放置していた私が悪いのですが。。

特にPHPの設定を変更したわけでもなく、気が付いたらそうなっていたわけで、明確な原因は不明です。
恐らくさくらレンタルサーバ側でセキュリティアップデートなどがあったのでしょう。
詳細は後ほど調べてみます。

WordPressを常時SSL対応させます。

先日、GoogleがSEOの観点でSSLを導入したページを優遇することを発表しました。
ただ、明確な効果があるほど重点はおいていないともいわれていますが、特に大きな弊害もないので、全コンテンツSSL化を実施してみます。

WordPressのSSL化については「お問い合わせフォームのみSSL化する」や「管理画面のみSSL化する」のは難しいといった話題がよく聞かれます。
そこで、今回はシンプルにオープンなコンテンツも含め「常時SSL化」します。

設定変更

WordPressの管理画面にログインします。

メニュー「設定」⇒「一般」を開き、以下の「http://~」となっている項目を「https://~」に変更します

WordPress アドレス (URL) : http://~
サイトアドレス (URL) : http://~

WordPressの設定は以上です。

Monthly Archives

Search