PHPプロ!TIPS+

1. sharedanceでWebサーバ間のセッション共有

大量のアクセスに対応するため、またWebサーバ故障時のリスクを減らすために、Webサーバを複数台使用する場合があるかと思います。そのような環境でPHPを使用する場合、セッション情報をどう管理するかが問題の一つとして出てきます。

今回はそんな時に使えるセッションサーバ、sharedanceを紹介します。sharedanceを使うと、複数のWebサーバ間でセッション情報を共有できるようになります。また、設定が簡単で、動作も比較的軽いのが特徴です。

では、早速インストール、設定方法を順に見ていきます。(以下の説明ではlinux環境を想定しています。)

1)libeventのインストール

sharedanceではlibeventというライブラリを使用するので、まずこれをインストールします。ソースコードを下記ホームページからダウンロードし、適当なディレクトリに展開します。

libeventのホームページ

http://www.monkey.org/~provos/libevent/

展開してできたディレクトリで

./configure
make

を実行後、rootユーザで

make install

を実行すればインストール完了です。

2)sharedanceのインストール

次に、sharedanceをインストールします。 こちらも、ソースコードを下記ホームページからをダウンロードし、適当なディレクトリに展開します。

sharedanceのホームページ

http://sharedance.pureftpd.org/project/sharedance

展開してできたディレクトリで

./configure
make

を実行後、rootユーザで

make install-strip

を実行すればインストール完了です。

3)sharedanceの起動

/usr/local/sbin/sharedanced --directory=/var/tmp/sharedance --deamonize

というようなコマンドでsharedanceを起動します。--directoryではsharedanceがデータを保存するディレクトリを指定しますが、ここでメモリ上のファイルシステムにあるディレクトリを指定すると、速度が格段に速くなります。このコマンド実行時に指定したディレクトリがないとsharedanceは起動しないので、先にディレクトリを作っておくようにしましょう。

また、sharedanceは1042番がデフォルトの待ち受けポートになっています。変更する場合はコマンドに

--port=(ポート番号)

をつけて実行します。

※それでもプログラムが起動しない場合

LD_LIBRARY_PATHの設定がうまくできていない可能性があります。bashの場合、

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

を実行後、上記のコマンドを実行して下さい。それでもダメな場合、起動時のオプションに

--ip=(sharedanceサーバのipアドレス)

を追加してコマンドを実行して下さい。

4)PHPの設定

次に、PHPでsharedanceを使用するように設定します。必要なPHPファイルがsharedanceを展開したディレクトリのphpディレクトリにあるので、これを適当なディレクトリにコピーして使用します。ここでは

/opt/sharedance

に必要なファイルをコピーしたとします。この中のsession_handler.phpで、セッションサーバのIPまたはホスト名を指定できるようになっています。SESSION_HANDLER_HOSTの値がデフォルトではlocalhostになっているので、これを環境に合わせて変更しておきます。

続いて、php.iniで以下の2箇所を変更します。

・auto_prepend_file
auto_prepend_file=/opt/sharedance/session_handler.php
・session.save_handler
session.save_handler = user

あとはapacheを再起動するだけです。

実際にセッションを利用したスクリプトにアクセスしてみましょう。うまく動作している場合、起動時に指定したディレクトリ内にファイルが作成されているはずです。

※大量のアクセスに対応するには?

大量のアクセスが予想される場合は、sharedance起動前に下記のようなコマンドを実行します。

/sbin/sysctl -w fs.file-max=65536
ulimit -n 65536
/sbin/sysctl -w net.ipv4.ip_local_port_range="1024 65000"

2. Smarty内でPHP関数を使う

Smartyユーザーの皆さんは既にご存知の通り修正子が用意されており、変数を加工して出力する事が出来ます。

{assign var="corporation" value="asial corporation"}
{$corporation|capitalize}

(上記のような既存の修正子が用途に合わない場合 || 必要とあらば) pulginsの中にmodifierファイルを作成して好きなように変数を加工することができます。

これ以外にも暗黙的な修正子としてPHP関数を修正子として利用する事ができるのです。以下に使用例を記述します。

{assign var="password" value="Secret Password"}
{$password|md5}

勿論、md5をかけるmodifierファイルを作成していなくても動作します。

{assign var="corporation" value="asial corporation"}
{$corporation|capitalize|strtr:" ":"-"}

上記のように引数を持つ場合はSmarty変数が第1引数となり、第2引数以降は:で区切って渡します。このような使い方にはあまり遭遇しないと思いますが、頭の隅に入れておけば必ず役に立つ日がきます!

また、Smartyのif文の条件式にもPHP関数がそのまま使う事が出来ます。

<select name="regist_year">
{foreach from=$year_list item=year}
  <option value="{$year|escape}"{if date("Y") == $year}
selected="selected"{/if}>{$year|escape}</option>
{/foreach}
</select>

下記のようにSmarty変数を判定の対象とすることも出来ます。

{if is_numeric($data)}数値です{else}数値ではありません{/if}

Smartyのテンプレートはあくまでビューなので、PHP関数の過度な使用はお勧め できません。ですが、ちょっとした時にこういった使い方ができることを知っていると、何かと便利な事もあるんじゃないでしょうか。

3. XdebugとWinCacheGrindを使って、パフォーマンス測定を行おう

Xdebugは、PHPにデバッグ機能を実装するためのモジュールです。もともとPHPには言語レベルでのデバッグ機能やプロファイラーが用意されておらず、モジュールをインストールする必要がありました。PHPでこの機能を実現するためのモジュールとして、以下のようなものがあります。

  1. Xdebug (http://xdebug.org/
  2. DBG(http://dd.cron.ru/
  3. Advanced PHP Debugger(http://pecl.php.net/package/apd

今回はプロファイラーも内蔵し、最新版であるPHP 5.1にも対応したXdebugエクステンションを使って、プロファイルを行う方法を説明します。

Xdebugのインストール

Xdebugは、以下のとおりインストールします。

1.モジュールの作成

XdebugはPECLの1つなので、Unixシステムの場合はpeclコマンドによりコンパイルして作成します。Windowsシステムの場合は、PHPのバージョン別にコンパイルされたモジュールをダウンロードすることが一番の近道です。

・Unixシステムの場合

pecl install xdebug-beta

あるいは

pear install xdebug-beta (peclコマンドが存在しない場合)

・Windowsシステムの場合

PECL4WIN(http://pecl4win.php.net/)より、コンパイルされたWindows版モジュールをダウンロード

2.PHPに組み込む

Xdebugのモジュールのファイルは、php.iniで記述されているextension_dirディレクトリに保存します。これをPHPに組み込むには、php.iniに以下の行を追加します。Xdebugモジュールの拡張子は、Windowsの場合は.dll、Unix系の場合は.soとなります。

・Unixシステムの場合

extension=xdebug.so

・Windowsシステムの場合

extension_ts=xdebug.dll

Webサーバーを再起動し、phpinfo()関数の出力にxdebugエクステンションの欄が表示されたら、インストール成功です(http://www.phppro.jp/phptips/sample/xdebug1.png)

Xdebugでプロファイリング

先ほどのphp.iniの後ろに、以下の行を追記します。

;プロファイリングを有効に
xdebug.profiler_enable = 1
;プロファイリング結果の出力ディレクトリ
xdebug.profiler_output_dir = "/path/to/output/directory"

もう一度Webサーバーを再起動して、PHPスクリプトを実行してみましょう。出力ディレクトリに、cachegrind.out.から始まるファイル名が作成されたと思います。これが、プロファイリングの結果ファイルです。

プロファイリング結果を確認する

このファイル形式は、WinCacheGrindというソフトウェアで視覚的に表示できます。WinCacheGrind(http://sourceforge.net/projects/wincachegrind/)にアクセスし、ファイルをダウンロードします。セットアップを完了すると、WinCacheGrindが起動します。

このソフトウェアは、KDEウィンドウマネージャにて提供されているKCacheGrindをWindows環境に移植したものです。よって、LinuxユーザーはKDE環境下KCacheGrindを使っても読み込むことができます。

実際にサンプルのファイルのプロファイリング結果を読み込んだ結果が画面2(http://www.phppro.jp/phptips/sample/xdebug2.png)です。今回は詳しく説明しませんが、各処理について、どの程度の時間がかかっているのか集計されます。たとえばこの結果では、require_once関数、DB->connectメソッドなどに多くの時間が割かれていることが分かります。

なお、Xdebugには本来の機能であるデバッガも搭載されています。これについては、またの機会に説明したいと思います。処理が遅いなと思ったら、Xdebug+WinCacheGrindを使ってプロファイリングを行ってみると良いでしょう。

バックナンバーについて

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

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

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