CentOS上のPHPからOracle10gへ接続
お久しぶりの投稿です(笑)
サーバのリプレースも終わり、社内システムの環境も一新されようとしています。
一部のシステムは今後PHPへの移行と考えています。
テスト環境でUbuntuからOracleへの接続をしてPHPで書いていたのですが、
今回CentOSに移行することにしました。
前回はテスト環境の為にとりあえず動きゃいいやと思っていたのでメモを取らず・・・案の定接続にはまりました。
と、いう事でメモ書きを残しておきます。
※2014.1.15段階です
—–
(環境)
CentOS 6.5(64bit)
Oracle10g
※前提としてApacheとPHPのインストールは終わっている物とします。
—–
1.OracleInstantClientをダウンロード&インストール
http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
まずここではまりました。
どうやら最新バージョンではつながらないようです。
私が使用したバージョンは「Version 11.2.0.4.0 」です。
ここから下記の物をダウンロードしました。
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
サーバの適当なフォルダに置きコマンドを実行
# rpm -ivh oracle-instantclient11.2-*
2.peclのインストール
# yum install php-devel
※既にインストールしている場合は必要ありません。
3.PHPへの組み込み
# pecl install oci8
途中下記のメッセージが出てきて入力を求められます。
Please provide the path to the ORACLE_HOME directory. Use ‘instantclient,/path/to/instant/client/lib’ if you’re compiling with Oracle Instant Client [autodetect] :
その際、下記の通り入力します。(環境によりディレクトリは変わると思いますのでチェック)
instantclient,/usr/lib/oracle/11.2/client64/lib
このメッセージが出てくればoci8のインストールは完了です。
Build process completed successfully
Installing ‘/usr/lib64/php/modules/oci8.so’
install ok: channel://pecl.php.net/oci8-2.0.6
configuration option “php_ini” is not set to php.ini location
You should add “extension=oci8.so” to php.ini
メッセージの通り「php.ini」にextensionの記述を行います。
php.iniに直接記述しても良いようですが、いろいろなサイトを参考にしますと
/etc/php.dにoci8.iniというファイルを作ればよいようです。
(oci8.ini)
———
extension=oci8.so
[OCI8]
———
その後、httpdの再起動を
# service httpd restart
phpinfoにてOCI8が認識されている事を確認します。
4.SELINUXの無効化
ここで再びはまりました。
Oracleにアクセスしようとすると
「ORA-12546: TNS:permission denied」
と出て接続が出来ません。
tnsnames.oraが必要なのかと思い記述してみましたがダメ。
ORACLE_HOMEのパスかと思い試しましたがダメ。
Webで検索をしてみると、SELINUX?!
止めてたつもりだったものが動いていました(^_^;
# setenforce 0
当然以降動かないように
/etc/selinux/config内の記述を
SELINUX=disabled
に変更しました。
これで無事接続が完了しましたε-(´∀`*)ホッ
なお、設定にあたり下記のサイトを参考にさせていただきました。
[Setup OCI8 Extension for PHP by pecl php-pear with Oracle instant Client]
http://www.milliondollarserver.com/setup-oci8-for-php-by-pecl-php-pear-with-oracle-instant-client/
これらの事は私のメモ書きです。
人それぞれ環境は違うと思いますが、参考になれば幸いです。
jQuery(JavaScript?)でメモリ解放
jQueryでAJAXをやっています。みなさんよく使う機能ですよね。
画面遷移無しで動的に画面を変えれるので便利です。
さて、ここで問題発生。
何度かDB抽出→表示を繰り返すとレスポンスが悪くなるんです。
私のところのサーバはメモリが512MBで動いている考えられない仕様。
DB廻りで解放してないのかなぁ・・・とチェックしてみてもちゃんと解放している。
調べてみたらJavaScriptってメモリリークがあるんですね(^^;
ってことで先人たちの知恵を拝借。
どうやらjQueryのイベントに対して解放するロジックを手で書いてやらないとダメみたいです。
————————————————————-
$(document).ready(function() {
$(‘#btnExecute’).click(function() {
//画面初期化
$(“#Tab1”).html(‘hogehoge’);
$(‘#btnExecute’).click() = null; //イベントに対してnullを送る
})
});
————————————————————-
これで解決しました。見る限りちゃんと解放されているようです。
C言語時代ではこの手の処理は当たり前だったそうですね。
#C言語は挫折した者です(^^;
Classic ASP と jQuery
前回にも書きました新システムの開発。
ClassicASP(以下ASP)とjQueryとの組み合わせで始めたわけですが、
やはり文字コードのところで嵌まりました(笑)
—–
IIS(ASP) → Shift_JIS
Ajax → UTF-8
DB(Oracle10g) →Shift_JIS
—–
Oracleは現行で基幹が動いているので文字コードの変更は不可能です。(実はOracleあまり詳しくない)
ASPで生成されたフォームからjQueryでデータを投げてOracleに更新。Oracleからデータを抽出してASPにて表示。
要はこれだけ出来ればOK。
で、解決方法は・・・
—–
・ASPとAjaxの記述がされたJavaScriptのファイルはUTF-8で保存。
・ASPの一行目におまじないの書き込み。
<%@CODEPAGE=”65001″%>
↑UTF-8ですよ~という宣言らしい
—–
エディタによっては標準の文字コードがShift_JISなのをUTF-8で作る事を忘れないようにですね。
なので既存システムに組み込むには少々手間かもしれません(Shift_JISで書かれたページの日本語が文字化けする)
これでOracleにデータを書き込んだら文字化けしなくなりました。
ただAccess2010からODBC接続でも文字化けは無しの模様です。
基本の部分が出来たのであとは増殖させるのみです。
※この内容は私のメモです。利用の際は自己責任で。
新システム開発 序章
会社にて新規システムの開発案件があります。
私は入社して1年ほどなので口出しは出来ませんが、わかっているのは実行環境が5年前以上前に導入された物(WindowsServer2003のSP無し!)
さらに20世紀に開発されたと思われる某社製の常駐アプリが基幹で動いている為に、変にサービスパックを入れるとどうなるかわからない状況。これはベンダーにも確認済み。
ASP.NETでの開発が出来ればと思っていたのですが、SP3を入れれないので.Net Framework4が入れれない。(ツールはVS2010があるのですが・・・)
そして予算が無いのでサーバは当面使い回し・・・どうにも出来ない(^_^;
クライアントも10年選手が多数あり、同じく.Net Frameworkなんぞ入れたら笑える状況になります。
営業所が多いので配布の事も考えるとWEBで開発がいいのかなと。
理想はPHPで開発なんですが、環境が作れないのでClassic ASPでどうにかしのごうと思っています。
でもそれだけでは面白くないので環境は下のようにします(というかこれ以上出来ない)。
———-
IIS5.0+ASP+jQuery+Oracle10g
———-
はい。非同期通信をやります。文字コードまわりで悩むかと(笑)
ASPとOracleに入っているデータはShift-JIS、jQueryはUTF-8。
がんばってまいります(笑)