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/

MySQLからOracle Database XEへマイグレーションする事が出来るツールOracle SQL Developerを使用してみました。

先月の記事の中では、MySQLOracle Database XEの使用メモリ数や、プロセスの動作を比較したのですが、MySQLのデータベースやテーブル、データ等をOracle Database XE上で動作させたいなー、となると、データベース設計をし直す等、余計な作業が発生する必要があるのでは無いかと思っていたのですが、MySQLからOracle Database XEへ簡単に移行が出来るツールがありました!

oracleのサイトにありますOracle SQL Developerというツールを使うと簡単にマイグレーション作業をする事ができます。

Oracle SQL Developerのインストール

Oracle SQL Developerは下記URLからダウンロード出来ます。
http://www.oracle.com/technology/global/jp/software/products/sql/sql121/sql121_dl.html


ダウンロードして、Oracle SQL Developerを起動すると、いきなりjavaのパスを入力して下さいと言われたので、JDKをインストールしました。

下記URLからダウンロード
http://download.java.net/jdk6/6u3/promoted/b05/index.html

Windows Offline Installation, Multi-language JDK fileをクリックしてJDKをダウンロードしました。

javaのパスを入力すると下記の画面が表示されました。
(ちなみに僕の環境(Windows XP)だとC:\Program Files\Java\jdk1.6.0_03\bin\java.exeになります。)

これでOracle SQL Developerのインストールが出来ました。

Oracle SQL Developerを使用して、MySQLOracle Database XEへ接続

インストールしただけでは、MySQLへアクセスする事が出来ないので、Tools > Preferences 画面の、
Database > Third Party JDBC Drivers 画面からJDBC Driverを追加します。

MySQL用のJDBC Driverは下記のサイトからダウンロード出来ます。
http://dev.mysql.com/downloads/connector/j/5.1.html

Add Entryボタンを押して、下記のファイルを指定しました。
C:/Program Files/sqldeveloper/mysql-connector-java-5.1.7/mysql-connector-java-5.1.7-bin.jar

これでMySQLに接続出来るようになりました。


Oracle SQL Developerを使用して、実際にMySQLに接続してみたいと思います。
左上のタブのFile > Newボタンを押して、データベースコネクションを作成します。
画面のOKを押すと下記の画面が表示されました。

MySQLタブをクリックして、入力欄にMySQLへのアクセス情報を入力してTESTボタンを押したところ、

上記のエラーが表示されました。

192.168.11.9(クライアントPC)からは接続出来ないというエラーのようです。

検索すると、下記のページを参考にすると解決できました。
http://dev.mysql.com/doc/refman/4.1/ja/access-denied.html

userテーブルに192.168.11.9を許可するようにデータを追加して、コマンドで mysqladmin flush-privileges -u root -p[パスワード]を実行すると解決し、無事接続できることを確認できました。

localhost以外からMySQLに接続する設定の方法を始めて知りました!

その後、上記のMySQLのデータベースコネクション追加の方法と同じように、oracleのデータベースコネクションを追加しました。(この作業はすんなり出来ました。)

これで、マイグレーションの準備が完了です。

実際にマイグレーションを実行

マイグレーションを実行するには、Migration > Quick Migrationの画面を開きます。

Verifyのボタンを押してマイグレーションが実行出来るかテストした後、Migrateボタンを押すことでマイグレーションを実行する事が出来ます。

おおお!超簡単!

まとめ

JDBC Driverのダウンロード&インストールや、接続するMySQLの設定の変更等でつまずいてしまうところもあったのですが、接続情報を設定するだけで、簡単にマイグレーション作業が出来てしまってびっくりしました。



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

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

Oracle Database XEがミッションクリティカルに強いのかMySQLと比較して検証してみました。

Oracle Database XEがミッションクリティカルに強いのかMySQLと比較して検証してみました。

色々なブログや記事で、oracleのデータベースはミッションクリティカルに強いというのを良く目にしますが、実際のところどうなのか、oracleユーザーで動作しているプロセスを殺してどのように動くのか検証してみました。

oracleのプロセスの検証

下記がoracleのプロセス群です。

  • xe_pmon_XE
  • xe_psp0_XE
  • xe_mman_XE
  • xe_dbw0_XE
  • xe_lgwr_XE
  • xe_ckpt_XE
  • xe_smon_XE
  • xe_reco_XE
  • xe_cjq0_XE
  • xe_mmon_XE
  • xe_mmnl_XE
  • xe_d000_XE
  • xe_s000_XE
  • xe_s001_XE
  • xe_s002_XE
  • xe_s003_XE
  • xe_qmnc_XE
  • xe_q001_XE
  • xe_q000_XE

xe_pmon_XEプロセスの検証

ps ax | grep xe_pmon_XE
kill -9 5626

killコマンドでプロセスが終了。
その他のoracle権限で動作していたプロセスも数秒後終了しました。

PMONプロセスはユーザープロセスに障害が発生したときに、回復処理を行うプロセスのようです。
心強いプロセスです。
/etc/init.d/oracle-xe restartで動作し直しました。


xe_psp0_XEプロセスの検証

ps ax | grep xe_psp0_XE
kill -9 6042

killコマンドでプロセスが終了。
その他のoracle権限で動作していたプロセスも終了しました。
/etc/init.d/oracle-xe restartで動作し直しました。


xe_mman_XEプロセスの検証

ps ax | grep xe_mman_XE
kill -9 6046

killコマンドでプロセスが終了。
その他のoracle権限で動作していたプロセスも終了しました。
/etc/init.d/oracle-xe restartで動作し直しました。


xe_dbw0_XEプロセスの検証

ps ax | grep xe_dbw0_XE
kill -9 6210

killコマンドでプロセスが終了。
その他のoracle権限で動作していたプロセスも終了しました。
/etc/init.d/oracle-xe restartで動作し直しました。


xe_lgwr_XEプロセスの検証

ps ax | grep xe_lgwr_XE
kill -9 6220

killコマンドでプロセスが終了。
その他のoracle権限で動作していたプロセスも終了しました。

REDOログバッファで変更された内容を、REDOログファイルへ書き込むプロセスです。
/etc/init.d/oracle-xe restartで動作し直しました。


xe_ckpt_XEプロセスの検証

ps ax | grep xe_ckpt_XE
kill -9 6461

killコマンドでプロセスが終了。
その他のoracle権限で動作していたプロセスも終了しました。

特定のタイミングで、データベースライターと制御ファイルを更新し、データベースの整合性を維持するプロセスです。
/etc/init.d/oracle-xe restartで動作し直しました。


xe_smon_XEプロセスの検証

ps ax | grep xe_smon_XE
kill -9 6538

killコマンドでプロセスが終了。
その他のoracle権限で動作していたプロセスも終了しました。

SMONプロセスはデータベースの異常終了を検知し、データベースが起動したときに、回復処理を行うプロセスです。これも又心強いプロセスです。
/etc/init.d/oracle-xe restartで動作し直しました。


xe_reco_XEプロセスの検証

ps ax | grep xe_reco_XE
kill -9 6626

killコマンドでプロセスが終了。
その他のoracle権限で動作していたプロセスも終了しました。
/etc/init.d/oracle-xe restartで動作し直しました。


xe_cjq0_XEプロセスの検証

ps ax | grep xe_cjq0_XE
kill -9 6703

killコマンドでプロセスが終了。
数秒後違うPIDで復活!


xe_mmon_XEプロセスの検証

ps ax | grep xe_mmon_XE
kill -9 6784

killコマンドでプロセスが終了。
数秒後違うPIDで復活!


xe_mmnl_XEプロセスの検証

ps ax | grep xe_mmnl_XE
kill -9 6876

killコマンドでプロセスが終了。
数秒後違うPIDで復活!


xe_qmnc_XEプロセスの検証

ps ax | grep xe_qmnc_XE
kill -9 6876

killコマンドでプロセスが終了。
様子が変わらず。
/etc/init.d/oracle-xe restartで動作し直しました。



xe_d000_XEプロセスの検証

ps ax | grep xe_d000_XE
ps ax | grep xe_s000_XE
ps ax | grep xe_s001_XE
ps ax | grep xe_s002_XE
ps ax | grep xe_s003_XE
ps ax | grep xe_q000_XE
ps ax | grep xe_q001_XE
kill -9 6966
kill -9 6968
kill -9 6970
kill -9 6972
kill -9 6974

killコマンドでプロセスが終了。
数秒後違うPIDで復活!おお!

プロセスが万が一強制終了しても、強制終了したプロセスを復活させる機能があるなんて!凄い!

MySQLのプロセスの検証

mysql - 5.0.45-7の場合下記2つのプロセスが起動している。

  • /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --log-err…
  • /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysql

/usr/libexec/mysqldのプロセスを終了させると、先程のoracleのプロセスのようにすぐ復活した。
しかし、/bin/sh /usr/bin/mysqld_safeのプロセスを先に終了させてから、
/usr/libexec/mysqldのプロセスを終了させると、MySQLのプロセスは完全に終了してしまいました。

おそらく、/bin/sh /usr/bin/mysqld_safeのプロセスが/usr/libexec/mysqldのプロセスを監視しているのでしょう。

まとめ

上記のような結果になりましたが、oracleのプロセスは複数のプロセス同士が監視をし合うという安全な作りになっているが、MySQLは2つしかプロセスが存在しないのでoracleに比べると脆いような印象を受けました!



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

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

Oracle Application ExpressとphpMyAdminのインストール方法を比較しました。

Oracle Database XEの場合、Oracle Application Expressが自動的にインストールされるので、GUIでの管理ツールに困る事はありません。

しかし、MySQLの場合管理ツールが提供されていないので、phpMyAdminというOSSをインストールして使用します。(一番有名かな?)

インストール方法は、まずphpMyAdminのサイトでダウンロードします。
(php,php-mysqlのパッケージがインストールされている必要があります。)

phpMyAdmin
http://www.phpmyadmin.net/home_page/ownloads.php

一度ローカルにダウンロードしてサーバーにアップロードするのも良いのですが、サーバーから直接ダウンロードする方が楽です。

cd /var/www/html
wget http://nchc.dl.sourceforge.net/sourceforge/phpmyadmin/phpMyAdmin-2.11.9.4-all-languages.zip

次に解凍、ディレクトリ名の変更、zipファイルの削除をします。

unzip phpMyAdmin-2.11.9.4-all-languages.zip
mv phpMyAdmin-2.11.9.4-all-languages phpMyAdmin
rm -f phpMyAdmin-2.11.9.4-all-languages.zip

次にconfigファイルを編集します。

cd phpMyAdmin
mv config.sample.inc.php config.inc.php
vi config.inc.php

$cfg['blowfish_secret'] = '';
↓
$cfg['blowfish_secret'] = '任意の文字列';

ブラウザからアクセスします。
http://192.168.11.3/phpMyAdmin/

下記に”mcrypt拡張をロードできません”という記述がある場合、php-mcryptのパッケージをインストールすることをお薦めします。

php-mcryptのパッケージをインストールすると下記のような画面になります。

これがphpMyAdminのインストール方法です。



(先月から下書き眠らせてあったのですが、別に眠らせなくても良いかと思って記事にしました。)


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

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

Oracle Database XEのリスナープロセスを落としたらどうなるのか確認してみました。

Oracle Database XEのリスナープロセスを落としたらどうなるのかなーと思い、プロセスを削除しました。

リスナーのプロセスの削除

kill -9 4910

その後、oracle-xeを再起動するとリスナープロセスも立ち上がるかなーなんて思っていたのですが、
立ち上がりませんでした…。

/etc/init.d/oracle-xe restart

エラーログの確認

tail /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/listener.log


NSLSNR for Linux: Version 10.2.0.1.0 - Production on 26-1月 -2009 03:44:47

Copyright (c) 1991, 2005, Oracle. All rights reserved.

システム・パラメータ・ファイルは/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/listener.oraです。
ログ・メッセージを/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/listener.logに書き込みました。
トレース情報を/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/trace/listener.trcに書き込みました。
トレース・レベルは現在0です。

pid=5379で起動しました
リスニング・エラーです: (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))
TNS-12555: TNS: 許可が拒否されました。
TNS-12560: TNS: プロトコル・アダプタ・エラー
TNS-00525: 操作するには権限が不十分です。
Linux Error: 1: Operation not permitted

解決策が思い浮かばず、OTNのサイトで質問をしたのですが解決出来ませんでした。
http://otn.oracle.co.jp/forum/thread.jspa?threadID=35005125

最終手段としてRPMパッケージの再インストールをしたのですが、それでもリスナープロセスを起動する事が出来ませんでした。

上記のような現象を解決された方がこの記事を見てくれていたのならば、コメントお願いします!



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

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

Oracle Database XEをphpからCRUD(CREATE,READ,UPDATE,DELETE)を実行しました。

Oracle Database XEをphpから実行する為に色々調べました。

標準関数で出来ないかなと探したのですが、なかなか見つからず…。

OTNのZend Core for Oracleというのをインストールしてみたのですが、インストールに失敗してphp.iniがおかしな事になってしまいました!

php.iniのバックアップしておけば良かったと後悔。(php5.2.6になってるし…)

ZendCoreについて
http://www.oracle.com/technology/tech/php/zendcore/index.html

結局元に戻す方法がわからなかったので、OSからインストール。
その後、Oracle Database XEをインストールし直しました。


http://www.oracle.com/technology/global/jp/tech/php/htdocs/php-oracle-tutorial.html

上記のチュートリアルに紹介されているoci8関数をインストールしても、oracleへ接続出来そうなので、
peclでoci8関数をインストールしました。

pecl install oci8

oci8関数をインストール後、phpから利用する為に、
php.iniにextension=oci8.soを追加しapacheを再起動しました。

/var/www/html/test.phpを作成。(チュートリアル丸写し)

<?php
  $conn = oci_connect('hr', 'hrpw', '//localhost/XE');

  $stid = oci_parse($conn, 'select city from locations');
  oci_execute($stid);

  print '<table border="1">';
  while ($row = oci_fetch_array($stid, OCI_RETURN_NULLS)) {
    print '<tr>';
    foreach ($row as $item) {
      print '<td>'.($item?htmlentities($item):' ').'</td>';
    }
    print '</tr>';
  }
  print '</table>';
?> 

コマンドラインから実行すると、
環境変数ORACLE_HOMEの値がないというエラーが表示されました。

php test.php

PHP Warning:  oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME is set and points to the right directory in /var/www/html/test.php on line 2
PHP Warning:  oci_parse() expects parameter 1 to be resource, boolean given in /var/www/html/test.php on line 4
PHP Warning:  oci_execute() expects parameter 1 to be resource, null given in /var/www/html/test.php on line 5

なので.bashrcに以下を記述

. /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh
source .bashrc

そしてコマンドラインから再度phpを実行

php test.php

<table border="1"><tr><td>city1</td><td>city1</td></tr></table>

やっとSQLを実行できました。

しかし、ブラウザからアクセスするとまだ真っ白の画面が表示され、エラーログに下記が記述されていました。

tail /var/log/httpd/error_log

[Wed Jan 21 08:44:44 2009] [error] [client 192.168.11.8] PHP Warning:  oci_connect() [<a href='function.oci-connect'>function.oci-connect</a>]: OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME is set and points to the right directory in /var/www/html/test.php on line 2
[Wed Jan 21 08:44:44 2009] [error] [client 192.168.11.8] PHP Warning:  oci_parse() expects parameter 1 to be resource, boolean given in /var/www/html/test.php on line 5
[Wed Jan 21 08:44:44 2009] [error] [client 192.168.11.8] PHP Warning:  oci_execute() expects parameter 1 to be resource, null given in /var/www/html/test.php on line 6
[Wed Jan 21 08:44:44 2009] [error] [client 192.168.11.8] PHP Warning:  oci_fetch_array() expects parameter 1 to be resource, null given in /var/www/html/test.php on line 9

apache経由だと環境変数ORACLE_HOMEが定義されていないようです。

かなり強引ですが、/etc/init.d/httpdのstart時に無理やり定義してみました。

vi /etc/init.d/httpd

start() {
       
        ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server

        echo -n $"Starting $prog: "
        check13 || exit 1
        LANG=$HTTPD_LANG daemon $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

これでやっとブラウザ経由でSQLを実行する事が確認できました。



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

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