PEARパッケージImage_Colorful 0.1.1-stableをリリースしました。

PEARパッケージImage_Colorful 0.1.1-stableをリリースしました。

  • setColorsメソッドの追加
  • setRedメソッドの追加
  • setGreenメソッドの追加
  • setBlueメソッドの追加
  • addColorsメソッドの追加


http://imagecolorful.com/

PEAR Image_Colorfulパッケージのインストール方法

PEAR Image_Colorfulパッケージの使用方法(コンストラクタとメソッドについて)

  • コンストラクタ $image = new Image_Colorful([画像の幅(px)], [画像の高さ(px)], [横の分割数], [縦の分割数]);
  • getGenerateImageメソッド $image->getGenerateImage([画像タイプ(jpg/png/gif)]);
  • saveGenerateImageメソッド $image->saveGenerateImage([画像ファイル名], [画像タイプ(jpg/png/gif)]);
  • addTextsメソッド $image->addTexts([文字列], [フォントのパス], [文字サイズ], [横の位置(x)], [縦の位置(y), [文字色(配列) : array(0,0,0)]]);
  • addColorsメソッド $image->addColors([赤の数値を追加(-255〜255), [緑の数値を追加(-255〜255)], [青の数値を追加(-255〜255)])
  • addRedメソッド $image->addRed([赤の数値を追加(-255〜255)]);
  • addGreenメソッド $image->addGreen([緑の数値を追加(-255〜255)]);
  • addBlueメソッド $image->addBlue([青の数値を追加(-255〜255)]);
  • setColorsメソッド $image->setColors([赤の数値を固定(0〜255), [緑の数値を固定(0〜255)], [青の数値を固定(0〜255)])
  • setRedメソッド $image->setRed([赤の数値を固定(0〜255)]);
  • setGreenメソッド $image->setGreen([緑の数値を固定(0〜255)]);
  • setBlueメソッド $image->setBlue([青の数値を固定(0〜255)]);

サンプルソース

ヘッダー部分に表示されている画像のソースです。

<?php
require_once('Image/Image_Colorful.php');

$image = new Image_Colorful(685,100,60,1);
$image->addColors('100','100','0');
$image->addTexts("春なのでカラフルなPHPのパッケージを作ってみました。", '../font/unip.ttf', '23', '20', '40');
$image->addTexts('camelmasa', '../font/unip.ttf', '25', '520', '85');
$image->getGenerateImage('png');
?>

[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

PEARパッケージImage_Colorful 0.1.0-stableをリリースしました。

PEARパッケージImage_Colorful 0.1.0-stableをリリースしました。

http://imagecolorful.com/

先日のエントリーでprocessingでカラフルな動画を作っていて、phpでも作れたら面白いなあと思い、カラフルな画像を生成するパッケージを作ってみました。

あまり実用性がありませんが、こういったパッケージを作るのが始めてなので少し緊張しています。

PEAR Image_Colorfulパッケージのインストール方法

PEAR Image_Colorfulパッケージの使用方法(コンストラクタとメソッドについて)

  • コンストラクタ $image = new Image_Colorful([画像の幅(px)], [画像の高さ(px)], [横の分割数], [縦の分割数]);
  • getGenerateImageメソッド $image->getGenerateImage([画像タイプ(jpg/png/gif)]);
  • saveGenerateImageメソッド $image->saveGenerateImage([画像ファイル名], [画像タイプ(jpg/png/gif)]);
  • addTextsメソッド $image->addTexts([文字列], [フォントのパス], [文字サイズ], [横の位置(x)], [縦の位置(y), [文字色(配列) : array(0,0,0)]]);
  • addRedメソッド $image->addRed([赤の数値を追加(-255〜255)]);
  • addGreenメソッド $image->addGreen([緑の数値を追加(-255〜255)]);
  • addBlueメソッド $image->addBlue([青の数値を追加(-255〜255)]);

サンプルソース

ヘッダー部分に表示されている画像のソースです。

<?php
require_once('Image/Image_Colorful.php');

$image = new Image_Colorful(685,100,60,1);
$image->addRed('100');
$image->addGreen('100');
$image->addTexts("春なのでカラフルなPHPのパッケージを作ってみました。", '../font/unip.ttf', '23', '20', '40');
$image->addTexts('camelmasa', '../font/unip.ttf', '25', '520', '85');
$image->getGenerateImage('png');
?>

[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

phpを使用してOracle Database XEとMySQLへのコネクションプーリングの方法・性能を比較しました。Oracle Database XE編

MySQLのコネクションプーリングは約2倍の性能結果が出ました。(同時100接続で100万回リクエストのApache Benchを実行した場合)

Oracle Database XEでのコネクションプーリングはどうでしょうか?検証してみたいと思います。


まずはOracle Database XEのコネクションプーリングしない方法で検証です。

コネクションプーリングしないプログラムで100万回リクエストのApache Benchを実行

下記のスクリプトを実行
oracle_connect.php

<?php
  $link = oci_connect('system', '[パスワード]', 'xe');
  $result = oci_parse($link, "SELECT 1;");
  oci_close($link);
?>

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/oracle_connect.php 

Apache Benchの実行結果

[root@www html]# ab -n 1000000 -c 100 http://localhost/oracle_connect.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /oracle_connect.php
Document Length: 0 bytes

Concurrency Level: 100
Time taken for tests: 1259.278234 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 190000000 bytes
HTML transferred: 0 bytes
Requests per second: 794.11 [#/sec] (mean)
Time per request: 125.928 [ms] (mean)
Time per request: 1.259 [ms] (mean, across all concurrent requests)
Transfer rate: 147.34 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 18.5 0 691
Processing: 0 122 249.2 61 9350
Waiting: 0 115 238.9 61 9349
Total: 0 125 251.4 61 9350

Percentage of the requests served within a certain time (ms)
50% 61
66% 63
75% 77
80% 100
90% 208
95% 383
98% 907
99% 1378
100% 9350 (longest request)

Time taken for tests: 1259.278234 secondsなので、約21分かかりました。
かなり遅い結果ですねー…。

逆にコネクションプーリングした際とどれ位差があるのか気になります。


コネクションプーリングの検証をする前に気になった記事がありましたのでこちらも検証しました。

oci_pconnectの第4引数を指定するとパフォーマンス向上 - Do You PHP はてブロ


コネクションプーリングしないプログラムで100万回リクエストのApache Benchを実行(接続時キャラクタセットを指定)

下記のスクリプトを実行
oracle_connect2.php

<?php
  $link = oci_connect('system', '[パスワード]', 'xe', 'JA16SJIS');
  $result = oci_parse($link, "SELECT 1;");
  oci_close($link);
?>

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/oracle_connect2.php 

Apache Benchの実行結果

[root@www html]# ab -n 1000000 -c 100 http://localhost/oracle_connect2.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /oracle_connect2.php
Document Length: 0 bytes

Concurrency Level: 100
Time taken for tests: 1176.803295 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 190000000 bytes
HTML transferred: 0 bytes
Requests per second: 849.76 [#/sec] (mean)
Time per request: 117.680 [ms] (mean)
Time per request: 1.177 [ms] (mean, across all concurrent requests)
Transfer rate: 157.67 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 21.7 0 609
Processing: 0 113 227.8 54 7051
Waiting: 0 104 213.3 54 7050
Total: 0 117 231.5 54 7051

Percentage of the requests served within a certain time (ms)
50% 54
66% 57
75% 75
80% 92
90% 209
95% 376
98% 765
99% 1358
100% 7051 (longest request)

Time taken for tests: 1176.803295 secondsなので、約20分かかりました。
さほど変わらず遅いですが、id:shimookaさんの記事の通り少し早くなりましたね。


次にOracle Database XEのコネクションプーリングの検証をしたいと思います!

コネクションプーリングするプログラムで100万回リクエストのApache Benchを実行

下記のスクリプトを実行
oracle_pconnect.php

<?php
  $link = oci_pconnect('system', '[パスワード]', 'xe');
  $result = oci_parse($link, "SELECT 1;");
  oci_close($link);
?>

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/oracle_pconnect.php 

Apache Benchの実行結果

[root@www html]# ab -n 1000000 -c 100 http://localhost/oracle_pconnect.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /oracle_pconnect.php
Document Length: 0 bytes

Concurrency Level: 100
Time taken for tests: 505.614765 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 190001710 bytes
HTML transferred: 0 bytes
Requests per second: 1977.79 [#/sec] (mean)
Time per request: 50.561 [ms] (mean)
Time per request: 0.506 [ms] (mean, across all concurrent requests)
Transfer rate: 366.98 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 5 10.3 1 319
Processing: 0 44 127.2 24 8470
Waiting: 0 33 117.1 12 8460
Total: 0 49 128.9 28 8476

Percentage of the requests served within a certain time (ms)
50% 28
66% 58
75% 61
80% 63
90% 83
95% 103
98% 189
99% 455
100% 8476 (longest request)

Time taken for tests: 505.614765 secondsなので、約8分かかりました。
約2倍強処理速度が向上しました。

コネクションプーリングするプログラムで100万回リクエストのApache Benchを実行(接続時キャラクタセットを指定)

下記のスクリプトを実行
oracle_pconnect2.php

<?php
  $link = oci_pconnect('system', '[パスワード]', 'xe', 'JA16SJIS');
  $result = oci_parse($link, "SELECT 1;");
  oci_close($link);
?>

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/oracle_pconnect2.php 

Apache Benchの実行結果

[root@www html]# ab -n 1000000 -c 100 http://localhost/oracle_pconnect2.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /oracle_pconnect2.php
Document Length: 0 bytes

Concurrency Level: 100
Time taken for tests: 380.586453 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 190000190 bytes
HTML transferred: 0 bytes
Requests per second: 2627.52 [#/sec] (mean)
Time per request: 38.059 [ms] (mean)
Time per request: 0.381 [ms] (mean, across all concurrent requests)
Transfer rate: 487.53 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 3 8.6 0 297
Processing: 0 33 122.2 5 6322
Waiting: 0 25 114.2 3 6321
Total: 0 37 123.7 6 6325

Percentage of the requests served within a certain time (ms)
50% 6
66% 47
75% 52
80% 54
90% 65
95% 87
98% 138
99% 379
100% 6325 (longest request)

Time taken for tests: 380.586453 secondsなので、約6分かかりました。
こちらも約2倍強処理速度が向上しました。
コネクションプーリングをしないMySQL並に速度が向上した結果が出ました。

まとめ

処理速度はやはりMySQLに分がありますね。さすがです。
しかし、無償のOracle Database XEをコネクションプーリングをする事で、同時接続時の処理速度の向上が図れる事がわかりました。
これを知る事・体験する事が出来て良い検証だったなーと思いました。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

phpを使用してOracle Database XEとMySQLへのコネクションプーリングの方法・性能を比較しました。MySQL編 その3

前回の検証では、コネクションプーリングの利点を理解する事が出来たのですが、Apache Benchでの検証をするとどうなるかというコメントで終了していました。
今回Apache Benchでの検証をしたいと思います。


phpを使用してOracle Database XEとMySQLへのコネクションプーリングの方法・性能を比較しました。MySQL編 - @camelmasaの開発日記


phpを使用してOracle Database XEとMySQLへのコネクションプーリングの方法・性能を比較しました。MySQL編 その2 - @camelmasaの開発日記

mysql_connect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続しない場合)

mysql_connect.php

<?php
  $start = array_sum(explode(" ",microtime()));

  $link = mysql_connect('localhost', 'root', '[パスワード]');
  mysql_select_db('mysql_connect', $link);
  for($i=0;$i<1000000;$i++){
    $result = mysql_query("SELECT 1;");
  }
  mysql_close($link);

  $end = array_sum(explode(" ",microtime()));
  echo "\n".$end - $start;
?>

このスクリプトを下記に修正。
mysql_connect2.php

<?php
  $link = mysql_connect('localhost', 'root', '[パスワード]');
  mysql_select_db('mysql_connect', $link);
  $result = mysql_query("SELECT 1;");
  mysql_close($link);
?>

上記のコネクションプーリングしないプログラムで100万回リクエストのApache Benchを実行

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/mysql_connect2.php

Apache Benchの実行結果

[root@www time2]# ab -n 1000000 -c 100 http://localhost/mysql_connect2.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /mysql_connect2.php
Document Length: 1 bytes

Concurrency Level: 100
Time taken for tests: 364.58800 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 191000000 bytes
HTML transferred: 1000000 bytes
Requests per second: 2746.81 [#/sec] (mean)
Time per request: 36.406 [ms] (mean)
Time per request: 0.364 [ms] (mean, across all concurrent requests)
Transfer rate: 512.34 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 14.0 0 347
Processing: 0 33 140.2 4 7507
Waiting: 0 25 100.9 3 7486
Total: 0 35 143.5 4 7507

Percentage of the requests served within a certain time (ms)
50% 4
66% 9
75% 15
80% 22
90% 99
95% 192
98% 302
99% 394
100% 7507 (longest request)

Time taken for tests: 364.58800 secondsと出力されているので、6分以上かかった事になります。
結構かかりますね。

mysql_pconnect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続しない場合)

mysql_pconnect.php

<?php
  $start = array_sum(explode(" ",microtime()));

  $link = mysql_pconnect('localhost', 'root', '[パスワード]');
  mysql_select_db('mysql_connect', $link);
  for($i=0;$i<1000000;$i++){
    $result = mysql_query("SELECT 1;");
  }
  //mysql_close($link);

  $end = array_sum(explode(" ",microtime()));
  echo "\n".$end - $start;
?>

このスクリプトを下記に修正。

mysql_pconnect2.php

<?php
  $link = mysql_pconnect('localhost', 'root', '[パスワード]');
  mysql_select_db('mysql_connect', $link);
  $result = mysql_query("SELECT 1;");
?>

for文部分を外して上記のコネクションプーリングをしたプログラムでApache Benchを実行しました。

上記のコネクションプーリングをするプログラムで100万回リクエストのApache Benchを実行

Apache Benchの実行

ab -n 1000000 -c 100 http://localhost/mysql_pconnect2.php

Apache Benchの実行結果

[root@www time2]# ab -n 1000000 -c 100 http://localhost/mysql_pconnect2.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 100000 requests
Completed 200000 requests
Completed 300000 requests
Completed 400000 requests
Completed 500000 requests
Completed 600000 requests
Completed 700000 requests
Completed 800000 requests
Completed 900000 requests
Finished 1000000 requests


Server Software: Apache/2.2.3
Server Hostname: localhost
Server Port: 80

Document Path: /mysql_pconnect2.php
Document Length: 1 bytes

Concurrency Level: 100
Time taken for tests: 195.267289 seconds
Complete requests: 1000000
Failed requests: 0
Write errors: 0
Total transferred: 191000000 bytes
HTML transferred: 1000000 bytes
Requests per second: 5121.19 [#/sec] (mean)
Time per request: 19.527 [ms] (mean)
Time per request: 0.195 [ms] (mean, across all concurrent requests)
Transfer rate: 955.22 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 3.4 0 235
Processing: 0 18 43.3 14 2793
Waiting: 0 14 23.2 13 2480
Total: 0 19 43.6 15 2793

Percentage of the requests served within a certain time (ms)
50% 15
66% 17
75% 19
80% 20
90% 24
95% 30
98% 61
99% 114
100% 2793 (longest request)

Time taken for tests: 195.267289 secondsと出力されているので、3分以上かかった事になります。

まとめ

コネクションプーリングをした方が約2倍早く終了しました。
http接続等で同時接続が沢山ある時はコネクションプーリングはかなり効果的なのがわかりました。
今後MySQLを使用したアプリケーションを作成する時は、コネクションプーリングも考慮しようと思います。

次こそはphp + Oracle Database XEのコネクションプーリングを検証したいと思います!



[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

phpを使用してOracle Database XEとMySQLへのコネクションプーリングの方法・性能を比較しました。MySQL編 その2

前回の記事の検証では、いまいちコネクションプーリング自体を理解していない状態での検証でした。
その為、良い結果を出す事が出来ませんでしたので再度挑戦しました。

前回の記事
http://d.hatena.ne.jp/camelmasa/20090225/1235515758

コネクションプーリングの利点が引き出せなかった原因

  • ディスク上に書き込みが発生してしまうINSERTクエリを発行していた。
  • execでphpを実行した為

id:sh2さんコメント有難う御座います。



また、mixiにてさぁやさんからもご指摘を頂きました。

MySQLコミュニティ
http://mixi.jp/view_bbs.pl?id=40155421&comment_count=2&comm_id=2234

コメントもあったようですが,exec で php プロセスを毎回立ち上げては,pconnect を使ってないのと一緒ですよね

単純に,

for(;;) {
$dbh = mysql_pconnect(...);
}

という場合と,

for(;;) {
$dbh = mysql_connect();
mysql_close($dbh);
}

のコードで比べてみてはいかがでしょうか?

なるほど。
僕は『スクリプトの実行が終了してもMySQLとの接続が閉じられないということ』という事でexec関数で1万回phpスクリプトを実行してしまいました。そういう意味では無いという事ですね。

さぁやさん有難う御座いました。

さぁやさんのmixi
http://mixi.jp/show_friend.pl?id=379328



前回の反省を踏まえ、スクリプトSQL部分を、書き込みが発生しないSELECTクエリに変更し、さぁやさんが提供して頂いたソースで検証してみたいと思います。
また、for文内でMySQLに毎回接続しない方法でも検証してみたいと思います。

mysql_connect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続)

mysql_connect.php

<?php
  $start = array_sum(explode(" ",microtime()));

  for($i=0;$i<1000000;$i++){
    $link = mysql_connect('localhost', 'root', '[パスワード]');
    mysql_select_db('mysql_connect', $link);
    $result = mysql_query("SELECT 1;");
    mysql_close($link);
  }

  $end = array_sum(explode(" ",microtime()));
  echo "\n".$end - $start;
?>

実行結果

  • 137.99708008766
  • 127.38695812225
  • 141.63528704643
  • 133.98114085197
  • 142.13206601143

平均130秒程度といった結果でした。


mysql_pconnect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続)

mysql_pconnect.php

<?php
  $start = array_sum(explode(" ",microtime()));

  for($i=0;$i<1000000;$i++){
    $link = mysql_pconnect('localhost', 'root', '[パスワード]');
    mysql_select_db('mysql_connect', $link);
    $result = mysql_query("SELECT 1;");
    //mysql_close($link);
  }

  $end = array_sum(explode(" ",microtime()));
  echo "\n".$end - $start;
?>

実行結果

  • 78.858249902725
  • 62.917754888535
  • 59.676470994949
  • 76.271098852158
  • 65.784828901291

平均70秒程度といった結果でした。


mysql_connect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続しない場合)

mysql_connect.php

<?php
  $start = array_sum(explode(" ",microtime()));

  $link = mysql_connect('localhost', 'root', '[パスワード]');
  mysql_select_db('mysql_connect', $link);
  for($i=0;$i<1000000;$i++){
    $result = mysql_query("SELECT 1;");
  }
  mysql_close($link);

  $end = array_sum(explode(" ",microtime()));
  echo "\n".$end - $start;
?>

実行結果

  • 26.621978998184
  • 27.744408845901
  • 27.353181123734
  • 22.033998966217
  • 21.772191047668

平均24秒程度といった結果でした。


mysql_pconnect関数でSELECTクエリ100万回の速度実験(for文内でMySQLに毎回接続しない場合)

mysql_pconnect.php

<?php
  $start = array_sum(explode(" ",microtime()));

  $link = mysql_pconnect('localhost', 'root', '[パスワード]');
  mysql_select_db('mysql_connect', $link);
  for($i=0;$i<1000000;$i++){
    $result = mysql_query("SELECT 1;");
  }
  //mysql_close($link);

  $end = array_sum(explode(" ",microtime()));
  echo "\n".$end - $start;
?>

実行結果

  • 21.91073012352
  • 28.815995931625
  • 21.802286863327
  • 26.527863025665
  • 24.077289104462

こちらも平均24秒程度といった結果でした。

まとめ

for文内等でMySQLに毎回接続しなくてはいけないケース(どうゆうケースか想定出来ませんが…)php + MySQLでのコネクションプーリングの利点を確認する事が出来ました。
しかし、for文内でMySQLの接続をする必要が無ければ、コネクションプーリングする必要性が無いという結果が出ました。



次こそはphp + Oracle Database XEのコネクションプーリングを検証したいと思います!

[追記]
次回もid:sh2さんやmixiでのさぁやさんからご指摘を頂きab (Apache Bench)によるコネクションプーリングの検証を行いたいと思います。
ご指摘有難うございます。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

phpを使用してOracle Database XEとMySQLへのコネクションプーリングの方法・性能を比較しました。MySQL編

まず始めに

文章が長くなってしまったので、MySQL編とOracle Database XE編に分けて記事にしたいと思います。

[追記]
コメント欄にてご指摘頂いた件がありますので、下記検証結果は今のところ正しいと言えないかもしれません。
僕がこのように検証しましたという程度で読んで頂けると幸いです。
再度違う方法で検証&報告します。


最近”コネクションプーリング”というのを知りました。

コネクションプーリングとは

データベースにアクセスする時、アクセスのたびに接続(コネクション)を確立するのではなく、あらかじめ一定数のコネクションを確立しておき、それを使い回す手法。データベースアクセスの負荷を減らすために用いられる。



引用元:コネクションプーリング 【connection pooling】 | ソフトウェア用語辞典
http://ew.hitachi-system.co.jp/w/E382B3E3838DE382AFE382B7E383A7E383B3E38397E383BCE383AAE383B3E382B0.html

色々php,mysql関連の本読みましたけど、コネクションプーリングについて触れている本ってあったかな?
コネクションプーリングをウェブで調べてみると賛否両論あるみたいですけども、実際のとこ動作させてみないとわからないもんで。

そこで、phpを使用して、Oracle Database XEとMySQLへのコネクションプーリングの方法・性能を比較しました。

処理性能を比較する方法

まず処理性能を比較する為のスクリプトは、下記の実行時間を表示する標準関数を使用します。

time.php
<?php
  $start = microtime();

  for($i=0;$i<10000;$i++){}

  $end = microtime();
  echo "\n".$end - $start;
?>

実行すると

php time.php
0.000884

こんな感じで実行時間が表示されます。
この実行時間で処理性能を比較したいと思います。

参考サイト
http://nakayalog.net/?p=235


まずphp + MySQLを使用してコネクションプーリングを利用する方法を調べました。

mysql_pconnect関数
http://jp2.php.net/manual/ja/function.mysql-pconnect.php

持続的データベース接続についての詳しい説明
http://jp2.php.net/manual/ja/features.persistent-connections.php

mysql_pconnect関数を使用すると、スクリプトの実行が終了してもMySQLとの接続が閉じられないということらしいです。
じゃあ、いつMySQLとの接続が切れるんだって話だけども…。

まあまあ早速実験開始です。


mysql_connect関数でINSERTクエリ1万回の速度実験

mysql_connectデータベースの作成

CREATE DATABASE `mysql_connect` ;

test_tableテーブルの作成

CREATE TABLE `mysql_connect`.`test_table` (
`test_field` INT NOT NULL ,
PRIMARY KEY ( `test_field` )
) ENGINE = InnoDB

mysql_connect.phpの作成

<?php
$link = mysql_connect('localhost', 'root', '[パスワード]');
mysql_select_db('mysql_connect', $link);

$result = mysql_query("INSERT INTO `mysql_connect`.`test_table` (
                       `test_field`
                       ) VALUES (
                       ".$argv[1]."
                       );");
mysql_close($link);
?>

mysql_connect.php用のtime.phpの作成

<?php
  $start = microtime();

  for($i=0;$i<10000;$i++){
    exec("php mysql_connect.php $i");
  }

  $end = microtime();
  echo "\n".$end - $start;
?>


それでは実行です。

php time.php
-0.16822

っておい!マイナスってなんだよ!過去行っちゃいましたよ。

なんでだろーと思って、time.phpを下記に修正してデバッグ

<?php
  $start = microtime();

  for($i=0;$i<10000;$i++){
    exec("php mysql_connect.php $i");
    echo microtime()."\n";//ここを追加しました。
  }

  $end = microtime();
  echo "\n".$end - $start;
?>

実行結果

0.13497400 1235517635
0.21877200 1235517635
0.30137900 1235517635
0.38148700 1235517635
0.46109300 1235517635
0.51826300 1235517635
0.57506100 1235517635
0.64548400 1235517635
0.72877100 1235517635
0.80903100 1235517635
0.89188100 1235517635
0.97485400 1235517635
0.12529500 1235517636
0.20909600 1235517636
0.29497800 1235517636
0.37752300 1235517636
0.46024800 1235517636
0.54040300 1235517636
0.60471400 1235517636
0.66184100 1235517636
0.71674400 1235517636
0.77201900 1235517636
0.82703400 1235517636
…

なるほど、[コンマ 秒]って事ですね。

では、それ用にtime.phpを下記の様に修正

mysql_connect.php用のtime.phpの作成(修正版)

<?php
  $start = array_sum(explode(" ",microtime()));

  for($i=0;$i<10000;$i++){
    exec("php mysql_connect.php $i");
  }

  $end = array_sum(explode(" ",microtime()));
  echo "\n".$end - $start;
?>


それでは再度実行です。

php time.php
785.43530797958

かなり時間かかりましたね。
InnoDBというのも遅い原因かもしれません。


mysql_pconnect関数でINSERTクエリ1万回の速度実験

データベースとテーブルは先程のを使用します。

mysql_pconnect.phpの作成

<?php
$link = mysql_pconnect('localhost', 'root', '[パスワード]');
mysql_select_db('mysql_connect', $link);

$result = mysql_query("INSERT INTO `mysql_connect`.`test_table` (
                       `test_field`
                       ) VALUES (
                       ".$argv[1]."
                       );");
?>

mysql_close()を使用した行を削除しただけですが、きちんとコネクションプーリング出きるでしょうか?

mysql_pconnect.php用のtime.phpの作成

<?php
  $start = array_sum(explode(" ",microtime()));

  for($i=0;$i<10000;$i++){
    exec("php mysql_pconnect.php $i");
  }

  $end = array_sum(explode(" ",microtime()));
  echo "\n".$end - $start;
?>

それでは実行です。

php time.php
775.68468093872

10秒短くなったけど…少し違う感じがするなあ。


MySQLコネクションプーリングの結果

一応速度の向上を測る事が出来ましたが、微々たる速度向上という結果でした。


php + MySQLでの結果は良い結果は出ませんでしたが、改善方法をお知りの方は教えて下さい!

次のエントリーではphp + Oracle Database XEのコネクションプーリングを検証したいと思います!

[追記]
id:sh2さんからご指摘頂きました!
同じような検証をされたようです。
http://d.hatena.ne.jp/sh2/20081104/



[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

symfony1.0.19でコツコツ勉強してから、symfony1.2系へ入ろうと思ったけど、即効今日からsymfony1.2系の勉強をします。

きっかけは、symfony1.0.19に慣れ始めたというのと、下記のプレゼンテーションを見たからです。

symfony 1.2を支えるサブフレームワーク

http://www.slideshare.net/fivestar/symfony-12-presentation

後、結構symfony1.2系の情報が出始めてるからです。


symfony 1.2では何が新しくなったの?

http://www.exgear.jp/blog/symfony_whats_new_12/

TRAJOIN - Translate Jointly

http://trajoin.1ms.jp/

日本語でよめるJobeet情報 まとめ

http://d.hatena.ne.jp/brtRiver/20081204/1228381733

sfFormのメッセージの日本語化を試してみる

http://d.hatena.ne.jp/Yukkuri/20081024/1224842751

plugin関連

jpsimplemailplugin

http://develop.ddo.jp/new-tech/php/framework/symfony/plugin/jpsimplemailplugin


上記の情報を利用させて頂いて、symfony1.2を勉強しようと思います。
又、id:courantさんからお誘い頂いたwassrへも参加させて頂こうと思います。
http://wassr.jp/channel/symfony



[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/