CentOS ODBC接続方法

============================================================
CentOS ODBC接続方法
============================================================
サーバ(192.168.1.1)      PostgreSQL  
クライアント(192.168.1.2) ODBCで、USER hogeにて接続

                                                                                                                      • -
サーバ PostgreSQL
                                                                                                                      • -
$ rpm -qa | grep postgresql-odbc postgresql-odbc-7.3-8.RHEL4.1 /var/lib/pgsql/data/pg_hba.conf host all all 192.168.1.2 255.255.255.255 trust クライアントから接続可能なように許可をあたえておく
                                                                                                                      • -
クライアント側(ODBC接続側)調査
                                                                                                                      • -
# rpm -qa | grep ODBC unixODBC-2.2.11-1.RHEL4.1 unixODBC-devel-2.2.11-1.RHEL4.1 # locate odbc | grep psql | grep so ................. /usr/lib64/libodbcpsql.so .................
                                                                                                                      • -
クライアント ODBC設定例
                                                                                                                      • -
$ vi /home/hoge/.odbc.ini [ODBC Data Sources] test_20070604 = Posrgre SQL ODBC Data Source 20070604 [test_20070604] ;;;Driver = /usr/lib/libodbcpsql.so Driver = /usr/lib64/libodbcpsql.so ;;;64版は、ドライバーの格納場所が異なる為、注意する Servername = 192.168.1.1 (postgresql server ip) ;Port = 5432 Database = template1 (接続DB) ;Protocol = 6.4 ;ReadOnly = 0 ConnSettings = set client_encoding to UNICODE $ isql test_20070604 postgres
                                                                                                                        • -
PostgreSQL => 文字コードを考慮し、きちんと設定しないと、selectできない
                                                                                                                        • -
# set client_encoding to euc_jp; # SELECT china_string from t_china_data ; ERROR: character 0xe5bca0 of encoding "UNICODE" has no equivalent in "EUC_JP" (UNICODEで格納された中国語の文字を閲覧しようとした) # set client_encoding to UNICODE; # SELECT china_string from t_china_data ; (問題なし)
                                                                                                                      • -
[ダメな例] 上記より、間違って「ConnSettings」をすると、selectがこけるので注意する
                                                                                                                      • -
$ vi /home/hoge/.odbc.ini ConnSettings = set client_encoding to EUC_JP

network接続をpingで調査する方法


1) まず、どのネットワークからアクセスされているか調査
$ ssh root@http-server
# cd /var/log/httpd
# less ssl_access_log* | grep userid | more

ダメなIPをわりだし、アクセス時間、ユーザID
218.90.147.134 <-中国ぽい

2) pingにて確認
$ ssh root@http-server
ping 218.90.147.134 -c 10
> 10 packets transmitted, 6 received, 40% packet loss, time 9062ms

PHPのコードをcppで記述する方法

[参考]
http://phpspot.org/blog/archives/2006/05/phpc.html

[環境]
Fedora Core release 6 (Zod)
php-5.1.6-3.4.fc6

[事前準備]
http://sourceforge.net/projects/binaryphp/
ソースのダウンロード

$ tar xfvz BinaryPHP-POC.tar.gz
$ cd BinaryPHP-POC
$ vi BinaryPHP-POC/tokenflow.php
19行目が二重に定義されている為コメントアウト
// var $defines = array();
$ less examples/helloworld.php

$ php convert.php --if examples/helloworld.php --of examples/helloworld

$ less examples/irc.php
$ php convert.php --if examples/irc.php --of examples/irc

sambaが極端に遅くなった件 => ldapのパラメータを変更することで対応

# strace -r -o strace.log getent group
> 0.000120 getpeername(4, {sa_family=AF_INET, sin_port=htons(389), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
> (省略)
> 3.104881 read(4, "0\f\2\1\1a\7\n", 8) = 8 <= 3秒かかっている


[memoryサイズを増加させることで対応]
# vi /etc/openldap/slapd.conf
sizelimit 2000
cachesize 2000
dbcachesize 5000000

getentが遅い件 => nameserverへのアクセスが遅い為

getentが遅い件 => nameserverへのアクセスが遅い為

# strace -r -o strace.log getent group

0.000088 connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("172.16.250.3")}, 28) = 0 ※nameserverにアクセス
0.000138 fcntl(4, F_GETFL) = 0x2 (flags O_RDWR)
0.000078 fcntl(4, F_SETFL, O_RDWR|O_NONBLOCK) = 0
0.000080 gettimeofday({1176982087, 259651}, NULL) = 0
0.000086 poll([{fd=4, events=POLLOUT, revents=POLLOUT}], 1, 0) = 1
0.000093 sendto(4, "\315d\1\0\0\1\0\0\0\0\0\0\ngfile-test\0033si\2co\2j"..., 38, MSG_NOSIGNAL, NULL, 0) = 38
0.000114 poll([{fd=4, events=POLLIN}], 1, 5000) = 0
4.996302 socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 5 ※ここでひっかかる
0.000082 connect(5, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("172.16.250.4")}, 28) = 0

                                                                                                                                              • -

# less /etc/resolv.conf

                                                                                                                                              • -

(変更前)
nameserver 172.16.250.3
nameserver 172.16.250.4

(変更後)
#nameserver 172.16.250.3
#nameserver 172.16.250.4
上記のようにコメントアウトしたら、早くなった

magic_quotes_gpcを強制的に外す | この先生きのこるにはより

よくよく見たら、array_mapの有意義な使い方が書かれていた。
配列から値になるまで再帰的に呼び出し、
値になったらstripslashesで値を変更。

この使いかたは常識なんだろうけど、知らなかった。ううう。恥。
でも、いろいろと他にも利用できそうだ。

$data = "hoge\\fuga\'hogege";
$data[1]
= "hoge\\fuga\'hogege";
$data[1][] = "hoge\\fuga\'hogege";

var_dump($data);
var_dump(stripslashes_deep($data));

function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}