PHP(5.4.0以降)+SQLite IntegrationでローカルにWordPressを構築する

PHPのビルトインウェブサーバーとSQLiteでWordPressを動かせないかな? と思って調べてみたところ、「SQLite Integration」というプラグインを使えばできることが分かりました。

PHP(5.4.0以降)でビルトインウェブサーバーを使う - Sprint Life

実行環境

  • Windows 7 Professional 64bit
  • PHP 5.5.10(ビルトインウェブサーバーを使用するため5.4.0以降)
  • WordPress 3.8.1 日本語版

手順

  1. WordPress本体をダウンロード
  2. プラグイン「SQLite Integration」をダウンロード
  3. インストール前の準備
  4. WordPressのインストール

PHP本体のインストールとPATHの設定については省略しています。

WordPress本体をダウンロード

実行環境のところにも書きましたが、今回ダウンロードしたのは日本語版の3.8.1です。

WordPress › 日本語

プラグイン「SQLite Integration」をダウンロード

「SQLite Integration」はWordPressのDBとしてSQLiteを使うためのプラグインです。 通常のプラグインとは異なり、WordPressのインストール時にも使用する必要があります。

WordPress › SQLite Integration « WordPress Plugins

プラグインの詳細については以下のページを参照してください。

SQLite Integration(ja) | ユニマージュ

インストール前の準備

php.iniの編集

PHPでSQLiteを扱えるようにするため、php.iniの以下の行を変更します。

変更前: ;extension=php_pdo_sqlite.dll
変更後: extension=php_pdo_sqlite.dll

PHP本体をCドライブ以外にインストールしている場合は、 extension_dirを変更します。正しく設定できていないと、 PHPやサーバーの起動時に「指定されたモジュールが見つかりません」 というエラーが出るはずです。

変更前: 
; On windows:
; extension_dir = "ext"

変更後:
; On windows:
 extension_dir = T:\php\ext

T:\php\のところはPHPをインストールしたフォルダのパスに置き換えてください。

WordPress本体とプラグインのファイルを展開

WordPress本体とプラグインを、サーバーのドキュメントルートにするフォルダにファイルを展開します。 サーバーを起動したフォルダがドキュメントルートになるので、展開先は任意の場所でかまいません。

  • ダウンロードしたWordPress本体およびプラグインのファイルを展開する
  • 展開してできたプラグインのフォルダをwordpress\wp-content\pluginsに置く
  • プラグインのフォルダ内にあるdb.phpをwordpress\wp-contentにコピー

wp-config.phpの編集

wordpress\wp-config-sample.phpのファイル名をwp-config.phpに変更します。

リンク先にあるオンラインジェネレータで表示された内容をコピーして、 wp-config.php内にある以下の認証用のユニークキーを上書きします。

wp-config.php の編集 - WordPress Codex 日本語版

上書きする箇所

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

ローカルでしか使わないのでテーブルの接頭辞は変更しなくても問題ありませんが、 ここではwp_local_としました。

$table_prefix  = 'wp_local_';

データベースのファイルは、wordpress\wp-content\database.ht.sqliteが作成されます。 プラグインのオプションでMySQLとSQLiteを切り替えて使用したり、データベースのファイルを 保存するフォルダやファイル名を変更できますが、今回は設定していません。

ここまでできればインストールが可能です。

WordPressのインストール

PHPのビルトインウェブサーバーを起動して、http://localhost:8000/wordpress/wp-admin/install.phpにアクセスします。

php -S localhost:8000

サイトのタイトル、ユーザー名、パスワード、メールアドレスを入力します。 「検索エンジンのインデックスを許可する」はチェックを外してください。

「WordPressをインストール」のボタンをクリックします。

インストールが完了しました。

サーバーがApacheではないため警告メッセージとかぶってますが、左下にある「ログイン」ボタンをクリックします。 もしボタンをクリックしても反応がなければ、ウインドウのサイズを変更してボタンが見えるようにするか、 Tabキーを押してボタンにフォーカスを当ててEnterキーを。

インストール時に作成したユーザーでログインします。

問題がなければ管理画面が開けるはずです。

テスト投稿も完了。とりあえずこれでWordPressが使えるようになりました。

注意点としては以下の通りです。

  • ビルトインウェブサーバーは一般に公開するための機能ではないので、ローカルでの利用にとどめてください。
  • .htaccessなどApache特有の機能は使えません。パーマリンクの投稿名が日本語だとページが見つからなくなります。
  • SQL Integrationの利用により正常に動作しないプラグインがあるので、互換性や回避策はユニマージュさんのページを参照してください。

WordPressが公式にSQLiteをサポートしない現状では、SQLite Integrationへの依存度が高くなりますが、 ローカルにWordPressを構築する選択肢の一つとしていかがでしょうか。

PHP(5.4.0以降)でビルトインウェブサーバーを使う

PHPのプログラムをサーバーで動かすとき、テスト環境としてはもっぱらXAMPPが候補に上がりますが、 バージョンが5.4.0以降のCLIなら、PHPだけで起動できるサーバーが内蔵されています。

PHPのインストールおよびPATHが通っている前提で以下のコマンドを実行します。 今回試したのはWindowsですが、LinuxやMacでも基本的には同じはず。

php -S localhost:8000

8000はポート番号なので変更可能。特に必要がなければこのままでいいと思います。

実行するとこんな感じです。終了させるにはCtrl+C。

コマンドを実行したディレクトリがドキュメントルートになります。*1 以下の一行を書いたindex.phpを置いてみました。

<?php echo "Hello World!!!" ?>

ブラウザで確認。

Hello World!!!を表示

使いわけとしては、とりあえずプログラムを動かすだけならビルトインウェブサーバー、 MySQLを使うのであればXAMPPを導入。という感じでしょうか。

マニュアルのページにもある通り、あくまでローカルな環境で試すための機能なのでご注意を。

*1:オプションでドキュメントルートを指定することも可能

PHP+AtomPub+テキストではてなブログに投稿する

PHPでAtomPub(Atom Publishing Protocol)を使って、テキストファイルから はてなブログに投稿するスクリプトを書きました。

はてなブログAtomPub - Hatena Developer Center

先に言っておきますと、画像は使わず文章のみ書ければいい、 PHPが使いたいという人だけに限定されます。とりあえずやってみました感が満載です。

2014/04/11 0:22 追記

この記事ではOpenSSLを使用しており、PHP5.5.11においても配布されているdllが脆弱性に対応していないバージョンのため、dllを最新版(1.0.1g以降)のものに差し替えるか、PHPが更新されるまでは念の為利用しないでください

Shining Light Productions - Win32 OpenSSL

追記ここまで

実行環境

  • Windows 7 Professional 64bit
  • PHP 5.5.4*1

投稿処理の概要

処理の大ざっぱな流れは以下の通り。

  1. エントリ用のXMLを作成
  2. WSSE認証を通してエントリをPOST

エントリ用のデータをXMLで作成

冒頭のAtomPubのページに説明がありますが、テキストファイルから 投稿用のXMLを作成するため、以下の書式にしました。

  • 記事のタイトル
  • 記事のカテゴリ(カンマ区切りで複数設定可)
  • 空行
  • 本文

ファイル名をそのままタイトルに使わなかったのは、Windowsだとファイル名の文字コードが 内部的にShift-JISで、UTF-8に変換すると文字化けするケースがあるためです。 この書式に従ってテキストファイルを読み込んで、XMLにデータを流しこんでいます。

エントリ用のXML(hatena-blog-entry.php)

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app">
 <title><?= $title ?></title>
  <author><name><?= $hatena_id ?></name></author>
  <content type="text/plain">
<?= $content ?>

  </content>
  <updated><?= $update ?></updated>
<?php foreach($category as $val){ echo "  <category term=\"$val\" />\n";} ?>
  <app:control>
    <app:draft><?= $draft ?></app:draft>
  </app:control>
</entry>

WSSE認証を通してエントリをPOST

はてなサービスにおけるWSSE認証 - Hatena Developer Center

AtomPubを使用するためには、「OAuth認証」「WSSE認証」「Basic認証」のいずれかが必要。 WSSE認証を選択したのは、OAuth認証はアプリケーションの登録が必要なので除外、 Basic認証よりは安全そうだという理由からです。

スクリプトからのPOSTについてはPEARの「HTTP_Request2」というパッケージを使います。 HTTP_Requestをインストールしようとしたら、こちらはすでに更新が止まっているらしく、 HTTP_Request2を使うよう促されました。

準備

HTTP_Request2のインストール

PEARで以下のコマンドを実行。

pear install HTTP_Request2

Windows版PHPでのPEARの導入についてはこちらをどうぞ。

Windows版のPHPでPEARを使うためのメモ - Sprint Life

php.iniの変更

httpsで接続するためopen_sslを使用します。 php.iniの以下の行の;を削除。

変更前 ;extension=php_openssl.dll  
変更後 extension=php_openssl.dll

投稿処理のスクリプトの変更

コメントにも書いてありますが、以下の変数を自分のものに置き換えてください。 管理画面の「詳細設定」→「AtomPub」に記載されています。

$hatena_id = ""; // はてなID
$blog_id = ""; // ブログID
$api_key = ""; // APIキー

また、投稿か下書きかについては$draft(yes: 下書き no: 投稿)で制御しています。

使い方

  1. 投稿処理のスクリプトとXML、テキスト(entry.txt)を同じディレクトリに置く
  2. コマンドプロンプトからスクリプトを実行する

実行例

php hatena-atom-post.php > result.txt

処理が正常終了すると、投稿または下書きされたエントリがレスポンスとして返ってくるので、 実行結果を別のファイルに出力するようにしています。

注意事項

ローカルPCで自分だけが使うことを想定していますので、入力値のチェックなどは行なっていませんが、 試しにこの記事を投稿してみたところ、以下の状況を確認しました。投稿の内容によっては、 意図した結果にならない可能性があります。

  • 本文中にHTMLが含まれている場合は、あらかじめ特殊文字の変換をしないとエラーになる
  • 本文中のPHPのソースが表示されない

残念ながらこの記事自体は管理画面からの投稿です。

また、WSSE認証にはパスワードではなくAPIキーを使用しているので、 万が一APIキーがバレてもアカウントがのっとられることはないと思いますが、 APIキーを変更するまで、第三者がブログに投稿し放題の状態になってしまいます。

はてな各種APIでのパスワードによるWSSE認証を2014年3月5日に終了します(開発者向け) - Hatena Developer Blog

ソース

投稿処理のスクリプト(ファイル名は任意で拡張子はPHP。文字コードはUTF-8)

<?php
mb_internal_encoding("UTF-8");
mb_language("Japanese");
date_default_timezone_set("Asia/Tokyo");
require_once("HTTP/Request2.php"); 

// https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry
// 管理画面の「詳細設定」→「AtomPub」を参照
$hatena_id = ""; // はてなID
$blog_id = ""; // ブログID
$api_key = ""; // APIキー

// テキストファイルからエントリを作成
$fp = fopen('./entry.txt', 'r');
$title = trim(fgets($fp, 4096));
$category = fgetcsv($fp, 4096,',');
$blank = fgets($fp, 4096); 

$content = "";
while (($buffer = fgets($fp, 4096)) !== false) {
    $content = $content . $buffer;
}
fclose($fp);

$update = date('c');
$draft = "yes"; // yes: 下書き no: 投稿

ob_start();
include('./hatena-blog-entry.php');  
$entry = ob_get_contents();  
ob_end_clean();

//WSSEヘッダをつけてPOST
$nonce = sha1(md5(time()),true);
$nonce_base64 = base64_encode($nonce);
$created = date('c');
$pass_digest = base64_encode(sha1($nonce . $created . $api_key,true));
$wsse_header = "UsernameToken Username=\"$hatena_id\", PasswordDigest=\"$pass_digest\", Nonce=\"$nonce_base64\", Created=\"$created\" ";

$req = new HTTP_Request2();
$req->setConfig('ssl_verify_peer', false);
$req->setURL("https://blog.hatena.ne.jp/$hatena_id/$blog_id/atom/entry");
$req->setMethod(HTTP_Request2::METHOD_POST);

$req->setHeader('Accept','application/x.atom+xml, application/xml, text/xml, */*');
$req->setHeader('Content-Type', 'application/atom+xml');
$req->setHeader('Authorization', 'WSSE profile="UsernameToken"');
$req->setHeader('X-WSSE',$wsse_header);
$req->setBody($entry);
$response = $req->send();
    
echo $response->getBody();

?>

テキストファイルについては固定にしていますが、スクリプト実行時に引数として ファイルのパスを渡すことで、任意のファイルを使用できます。

変更前: $fp = fopen('./entry.txt', 'r');
変更後: $fp = fopen($argv[1], 'r');

おわりに

本当はエディタから直接投稿するところまでやるつもりでいたんですが、 スクリプトそのものの使いどころが、文章のみを投稿する場合に限定されそうなのでやめました。

PHPでAtomPubを使うサンプルとしてどこか役に立つところがあれば幸いです。

参考

*1:最低でも5.0以上。4系だと動きません

Windows版のPHPでPEARを使うためのメモ

PEARはPHPの拡張ライブラリ群。MacやLinuxだと標準で使えるみたいですが、Windowsだと別途インストールする必要があります。

Manual :: PEAR とは?

以下に自分がインストールした手順をメモ。PHP本体のインストールについては省略。

環境

  • Windows 7 Professional 64bit
  • PHP 5.5.4

準備

Manual :: PEAR パッケージマネージャの取得とインストール

http://pear.php.net/go-pear.phar からファイルをダウンロード。自分の環境では PHP本体をT:\php(OSとは別のドライブ)に置いているので、T:\php\pear\go-pear.pharに保存。

コマンドプロンプトでT:\php\pear\をカレントディレクトリにして

php go-pear.phar

を実行すると対話形式でインストールの初期設定が始まる。このとき、インストール先をSystemかlocalか選択できるが、 PHP本体のインストール先が標準と異なるためlocalとした。localだとPEARで使用するディレクトリの 設定がうまくいかないので、コマンドを実行する前にあらかじめユーザー環境変数を設定しておく必要がある。

コントロールパネル→システム→システムの詳細設定→詳細設定→詳細→環境変数

f:id:splicom:20140224141302j:plain

変数名: PHP_PEAR_SYSCONF_DIR
変数値: T:\php\pear

設定時にコマンドプロンプトを開いていた場合は閉じて開きなおす。

PEARのインストール

前述したコマンドを実行

php go-pear.phar

f:id:splicom:20140224141316j:plain

問題がなければEnterを押す。ディレクトリを個別に変更する場合は番号を入力。

f:id:splicom:20140224141330j:plain

Would you like to alter php.ini?と聞かれたらYとしておくと、PEARを使うためのインクルードパスが追記される。

;***** Added by go-pear
include_path=".;T:\PHP\pear\pear"
;*****

f:id:splicom:20140224141336j:plain

これでインストールが完了。

PEARのコマンドについては、T:\php\pear(PEARをインストールしたディレクトリ)をカレントディレクトリにして実行する。

よく使いそうなコマンド

ヘルプの確認

pear help または pear -?

パッケージのインストール

pear install パッケージ名

パッケージのアップグレード

pear upgrade パッケージ名

PEAR本体のアップグレード

pear upgrade

全てのアップグレード

pear upgrade-all

設定状態の確認

pear config-show

キャッシュのクリア

pear clear-cache

ユーザー環境変数を設定しなきゃいけないことが分からず苦労したけど、それ以外はすんなりと完了。 Windows版でもあらかじめPEARが使えるようになっているとありがたい。

参考