PHPプロ!TIPS+

1. mysql_set_charset関数を使ってみる

mysql_set_charset関数はPHP-5.2.3から追加されたMySQLのクライアント側の文字コードまで設定することができる関数です。

バージョン4.1以降のMySQLを使用している場合、MySQLのデフォルト文字コードを修正するために、SET NAMES utf8とすることがよくあるかと思います。「SET NAMES utf8」というクエリを発行すると、MySQLサーバのcharacter_set_client、character_set_connection、character_set_resultという文字コードを指定することができます。

設定される変数の中にcharacter_set_clientというものがあるのですが、これはサーバに接続しているクライアントの文字コードをサーバ側で設定するためのものです。この変数を設定することで、サーバ側のクライアントの文字コードを設定することはできますが、クライアント側の文字コードは設定されません。

そのため、クライアントの文字コードに影響されるmysql_real_escape_string関数に対する設定を行うことができません。そのため、今まではMySQL自体のデフォルト文字コードを変更する必要がありました。ディストリビューション付属のパッケージでは大抵の場合は、latin1に設定されているので、ソースからインストールする必要がありました。

しかし、改良版のMySQLエクステンション(mysqli)ではmysqli_set_charset関数が存在しており、それによってクライアント側の文字コードと、サーバ側の文字コードの両方を設定することができました。PHP-5.2.3で追加されたmysql_set_charset関数もmysqli_set_charset関数と同じ動作をします。

では早速使用してみましょう。

<?php
$link 
mysql_connect("localhost""root");
mysql_select_db("test");

echo 
"default: " mysql_client_encoding() . "\n";

mysql_query("SET NAMES 'utf8'");
echo 
"SET NAMES utf8: " .  mysql_client_encoding(). "\n";

mysql_set_charset("utf8");
echo 
"mysql_set_charset: " mysql_client_encoding() . "\n";

この結果は以下のようになります。

default: latin1
SET NAMES utf8: latin1
mysql_set_charset: utf8

SET NAMESでは変更できなかったクライアントの文字コードを変更することができました。ではこれで、何がうれしいのかというと、sjis、jis、utf-16を使ったりくらいのもので、実用性は薄いかもしれません…。

文字のエスケープではまったときは、この関数を思い出してみると解決の糸口が見つかるかもしれません。

2. PEAR_PackageProjectorでライブラリパッケージを作ろう

様々な開発を行っていく上で、自社用/自分用のライブラリが出来上がっていくことなどもあるかと思います。
1、2のPHPスクリプトファイルで済む量であればとりあえず普通にコピーすればいいかな、などと考えられますが、ライブラリの量が肥大化してくると使用するにもパッケージングしたり、バージョン管理を行ってやる必要が出始めます。

さらに、別途PEARライブラリを利用していたりすると、これらの依存関係も絡んで管理や新規環境の構築が非常に面倒になってきます。

そのような場合に非常に便利なのが、PEARのパッケージ管理システムです。自分用ライブラリをPEARパッケージとして管理してやれば、バージョン情報や依存関係も記述でき、インストールもアップデートも、pearコマンド一発で可能になります。

今回は、そんなPHPスクリプトの管理にうってつけなPEARパッケージを手軽に作成できるライブラリ、PEAR_PackageProjectorをご紹介します。

PEAR_PackageProjectorは、ブログ 「過去と他人はかえられないが、未来と自分はかえられる」の管理人magiwo氏が開発を行っているライブラリで、現在のバージョンは0.1.3のベータ版です。

なお、このパッケージはWindows / Linuxの両方で動作しますが、ここではLinux上の場合に話を限って説明していきます。Windows上でも基本的には同じなので、細かい部分を読み替えていっていただければ同様に扱えると思います。

PEARパッケージを作成するライブラリだけあって、インストールは当然PEARコマンドを利用できます。

ですが、このライブラリは

  • PHP_CodeSniffer
  • Console_Getargs
  • PEAR_PackageFileManager

という3つのライブラリを要求します。

このうちのConsole_GetargsとPEAR_PackageFileManagerは既にstableリリースになっているため自動的にまとめてインストールされるのですが、PHP_CodeSnifferはbeta扱いなので、PEAR_PackageProjectorよりも先に、別途手動でインストールする必要があります。

pear install PHP_CodeSniffer-beta
pear install http://servlet.sakura.ne.jp/download/PEAR_PackageProjector-0.1.3.tgz

とすれば、インストール完了です。

PEAR_PackageProjectorをインストールすると、pearprojというスクリプトが /usr/local/binに配置され、これを用いて各種処理を行っていきます。

それでは、パッケージの作成手順に入りましょう。

まず最初に、パッケージのプロジェクトを作成します。

プロジェクトを作成する任意のディレクトリで、以下のコマンドを実行します。

pearproj --create -p TestProject

すると、実行したディレクトリ以下にTestProject/ディレクトリが作成され、パッケージ生成に用いられる各種ファイルが生成されます。

なお、PHPのバージョンや環境によってはこのコマンドを実行する際に

PHP Notice:  Undefined index:  PWD in /usr/local/lib/php/PEAR/PackageProjector/Derictory.php on line 310PHP Warning:  mkdir(): Permission denied in /usr/local/lib/php/PEAR/PackageProjector/Derictory.php on line 299

などのエラーが発生することがあります(rootユーザーだと2行目のエラーは出力されず、ルートディレクトリ直下にプロジェクトディレクトリが生成されてしまいます)。

これは、PHPのスーパーグローバル変数である$_ENV が正しくカレントディレクトリを取得できていないために起こる問題なので、このようなエラーが出る場合は、/usr/local/lib/php/PEAR/PackageProjector/Derictory.php の310行目を

$tmp = (OS_WINDOWS) ? getcwd() :$_ENV['PWD'];
↓
$tmp = (OS_WINDOWS) ? getcwd() :getenv("PWD");

と変更すれば、問題なくプロジェクトが生成できるようになるかと思います。

生成されたTestProjectの中身は

TestProject/
  build                buildスクリプト
  build.bat            buildスクリプト(win用)
  build.conf           パッケージ情報設定ファイル
  desc.txt             パッケージの説明を記述するテキストファイル
  notes.txt            パッケージの更新履歴を記述するファイル
  sample.php           パッケージの動作サンプル/テスト記述用スケルトン
  release/             パッケージ生成先ディレクトリ
  src/                 ソースコード配置ディレクトリ
    TestProject.php    TestProjectクラスのスケルトン
    TestProject/       

という構成になっています。

この段階ではPEARパッケージを作成するためのスケルトンが用意されていますが、これに従う必要はありません。
src/ディレクトリの中をパッケージ化したいファイル群に置き換えてしまいましょう。

さて、次にすべきことはbuild.confの書き換えです。

このbuild.confは特に書き換えずともパッケージ化可能ですが、これを適切に変更することでバージョンの管理や依存関係などを設定できます。

例えば、HTTP_RequestというPEARパッケージを内部で使用しているライブラリの場合は、build.conf内に

[dep://HTTP_Request]
type = required

と記述しておけば、仮にHTTP_Requestパッケージがインストールされていない環境でも、TestProjectパッケージのインストールの際に、自動的にHTTP_Requestパッケージもインストールしてくれます。

最後に、プロジェクトディレクトリ上で

./build

とすれば、release/ディレクトリ内にTestProject-0.1.0.tgzというファイルが作成されます。

これで、パッケージ化が完了です。

あとは、このパッケージをインストールしたい環境上で、

pear install TestProject-0.1.0.tgz

とすれば、PEARパッケージとして展開することができ、依存ライブラリもまとめてインストールできます。

またバージョンを挙げた際のアップグレードも同様にpearコマンドから可能になります。

パッケージのアンインストールも、デフォルトのbuild.confで作成したパッケージであれば

pear uninstall __uri/TestProject

とするだけです。

煩雑になりやすいライブラリの管理ですが、PEAR_PackageProjectorを使えば手軽にPEARパッケージとして管理できるので、非常に便利です。

ライブラリの管理に困っていたら、ぜひ一度使ってみてはいかがでしょうか。

PEAR_PackageProjector:
http://servlet.sakura.ne.jp/wiki/index.php?PEAR_PackageProjector

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)