PHP界隈、Web界隈、サーバー界隈の話題をねり歩いてご紹介します。
xCache を使ってみる(Windows版でも使えるアクセラレーター)
PHPでのWebシステム運用で必須ともいえるアクセラレーターですが。(そもそもPHPアクセラレーターって何よッ!?って方はコチラ
の記事が参考になると思われます)
有名どころでは、 APC や eAccelerator がありますが、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 適用前
平均 Request per second 値:18.20
・xCache 適用後
平均 Request per second 値:27.92
ということで適用前と後で約 1.5 倍くらい性能が向上しています。
今回は検証にpukiwikiを使いこのような結果になりましたが、インクルードしているファイルの数などなど、プログラムの構成で得られる効果が異なるようですので、実際に導入するさいには必ず検証が必要ですね。
有名どころでは、 APC や eAccelerator がありますが、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 |
・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 |
ということで適用前と後で約 1.5 倍くらい性能が向上しています。
今回は検証にpukiwikiを使いこのような結果になりましたが、インクルードしているファイルの数などなど、プログラムの構成で得られる効果が異なるようですので、実際に導入するさいには必ず検証が必要ですね。
HTTP Request で https (SSL) 通信する
PEAR
の HTTP 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
→こちらも参照
知らなかったのでメモメモ "Φ( . . )
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
に変わり、ブラウザの進捗も表示された。
しかし、以下の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
に変わり、ブラウザの進捗も表示された。