PHP Walker
PHP界隈、Web界隈、サーバー界隈の話題をねり歩いてご紹介します。
Amebaでブログを始めよう!
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>

xCache を使ってみる(Windows版でも使えるアクセラレーター)

PHPでのWebシステム運用で必須ともいえるアクセラレーターですが。(そもそもPHPアクセラレーターって何よッ!?って方はコチラ の記事が参考になると思われます)

有名どころでは、 APCeAccelerator がありますが、Windows版のPHPへの対応状況があまりよろしくないようです。
そこで色々と探したところ xCache がWindows版のPHP5.3にも対応しており、Windows + Apche + PHP5.3 なんて要件にも対応できるステキ・モジュールでした。



まずはダウンロード

まずはxCacheのサイトからWindows用にコンパイルされた最新版のモジュールをダウンロードしてきます。

ダウンロードは、、、
http://xcache.lighttpd.net/pub/Releases/1.3.0/
にアクセスします。

色々あって、「むむむむ・・・」ですが、自分の環境にあったzipファイルをファイル名のパターンで選びます。

ファイル名の「XCache-1.3.0」がxCacheのバージョンです。これは最新の1.3.0しかありません。ので割愛。
つぎに「php-9.9.9」とあり、これは対応するPHPのバージョンです。自分の環境のPHPのバージョンにあわせます。
つぎに「nts」と「win32」があります。「nts」は「None Thread Safe」の略でPHPをCGIとして使っている場合にはこちらを。「win32」はPHPをモジュールとして使っている場合はこちらを選びます。
最後に「VC6」と「VC9」がありますが、こちらは使っているWebサーバーによって、VC6=Apache、VC9=IISとなります。
(実際にはインストールされているPHPにあわせて選択します。PHPの選択についてはこちらの記事 もあわせてご覧ください)

以上の4(3?)パターンから選んだファイル名のzipファイルをダウンロードしておきます。



インストール&設定してみる

ダウンロードが終わったらzipファイルを解凍します。
そこに php_xcache.dll ファイルがありますので、これをPHPのインストールされたフォルダ(例えば C:\PHP)にあるextフォルダ(例えば2 C:\PHP\ext)のなかにコピーします。
php_xcache.dll と同じフォルダにある xcache.ini に記述されている内容を php.ini にコピペします。
[xcache-common] セクションの extension 指定子を自分の環境にあわせて書き換えます。
(extension_dirを適当に設定しているなら extension=php_xcache.dell でおk)

最後にWebサーバーを再起動します!!



ベンチマークを取ってみる

んでは、xCache適用前と後でどれくらいの変化があったのかベンチマークを取ってみます。

検証したPCのスペックは以下のとおり。
CPU:Intel Pentium Dual CPU E2140 1.6GHz
メモリ:2GB
OS:Windows VISTA Pro
Apache 2.0.63
PHP 5.3.2(PHPはモジュールで使ってます)

検証に使ったアプリケーションは、pukiwiki のバージョン 1.4.7 。

また、検証方法として、Apacheのabを使って「ab -n 1000 -c 10 http://localhost/wiki/」として、適用前と後で10回づつ測定。
「Request per second」値の最小値および最大値を省いた値の平均値を比較してみました。

・xCache 適用前
1回目 18.13
2回目 18.22
3回目 18.20
4回目 18.29
5回目 18.22
6回目 18.20
7回目 18.18
8回目 18.26
9回目 18.20
10回目 18.18
平均 Request per second 値:18.20

・xCache 適用後
1回目 27.70
2回目 27.82
3回目 27.77
4回目 28.05
5回目 27.69
6回目 28.00
7回目 27.90
8回目 28.08
9回目 28.07
10回目 28.18
平均 Request per second 値:27.92

ということで適用前と後で約 1.5 倍くらい性能が向上しています。

今回は検証にpukiwikiを使いこのような結果になりましたが、インクルードしているファイルの数などなど、プログラムの構成で得られる効果が異なるようですので、実際に導入するさいには必ず検証が必要ですね。

HTTP Request で https (SSL) 通信する

PEARHTTP Request を使って https(SSL) プロトコル通信を行なう際、PHPのモジュールとして OpenSSL が組み込まれていなければならなかった!

知らなかったのでメモメモ "Φ( . . )

PHPにOpenSSL モジュールが組み込まれているか確認するには、コマンドラインで...
php -m
を実行し、実行結果の[PHP Modules]以下に『openssl』の表示があれば組み込まれている。(もちろん、表示されなければ組み込まれていない)



Windows版では、php.ini の 『extension=php_openssl.dll』 記述子をコメントアウトするだけでOK!

_nix版では、PHPのコンパイル以前にまず OpenSSL を導入しておき、コンパイル時の ./configure オプションに『--with-openssl』を指定してコンパイルすればOK

→こちらも参照

Content-Length header が送信されない

PHPからzipファイルなどを読み込んで出力する際に Content-Length header を送信しておくと、ブラウザ側でダウンロードの進捗が表示されてユーザーにとって親切だと思う。

しかし、以下のPHPファイルを

<?php
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="a.zip"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize('a.zip'));
readfile('a.zip');
?>

実行するも LiveHTTPHeaders で確認するとヘッダーが

HTTP/1.x 200 OK
Date: Thu, 28 Jan 2010 08:09:10 GMT
Server: Apache
Content-Disposition: attachment; filename="a.zip"
Content-Transfer-Encoding: binary
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=4, max=48
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/octet-stream

となり、Content-Length header が出力されていない。もちろんブラウザでの進捗も表示されない。

調べた結果、Apache の mod_deflate (mod_gzip) が導入されているのが原因であった。
そこで、先述のPHPを以下のように変更することで対応できる。

<?php
apache_setenv('no-gzip', '1'); // ← apache環境変数に deflate(gzip) 無効をセット

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="a.zip"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize('a.zip'));
readfile('a.zip');
?>

ヘッダーも

HTTP/1.x 200 OK
Date: Thu, 28 Jan 2010 08:09:10 GMT
Server: Apache
Content-Disposition: attachment; filename="a.zip"
Content-Transfer-Encoding: binary
Content-Length: 4774298
Keep-Alive: timeout=4, max=48
Connection: Keep-Alive
Content-Type: application/octet-stream

に変わり、ブラウザの進捗も表示された。
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>