AmazonLinuxでPHP5.6とpostgresqlのモジュールをインストールしてみたのですが、8.4系で古い。。。
<h2><a name="module_pdo_pgsql">pdo_pgsql</a></h2>
<table>
<tr class="h"><th>PDO Driver for PostgreSQL</th><th>enabled</th></tr>
<tr><td class="e">PostgreSQL(libpq) Version </td><td class="v">8.4.20 </td></tr>
・・・
<h2><a name="module_pgsql">pgsql</a></h2>
<table>
<tr class="h"><th>PostgreSQL Support</th><th>enabled</th></tr>
<tr><td class="e">PostgreSQL(libpq) Version </td><td class="v">8.4.20 </td></tr>
実際にはPostgreSQL9.4.4を使いたいので上記も9.4.4に合わせるよにした時のメモ。
参考
- PostgreSQL(libpq) Version を合わせる
- VirtualBoxで作るCentOS+nginxの検証環境WebサーバのPHP関連(pdo_pgsql、pgsql)のバージョンを合わせる
やること
そもそもPHPのextensionの話などよくわかってなかったのですが、以下がすごい分かりやすかったです。
[PHP]pecl,phpize,extensionという単語を見て頭痛がするあなたへの処方箋
今回は上記のCで書かれたライブラリの設定を行って.soを作る必要があり、要はビルドします。(もし、ビルドせずにやる方法をご存知の方がいらっしゃれば教えていただけるとありがたいです。)
環境
- Amazon Linux AMI 2015.03.1
また、以前書いた記事のnginx、PHP5.6のインストール及びPHP-fpmでの接続までを実施した状態とします。
AmazonLinuxにnginx+PHP5.6+PHP-fpm+PHP-redis環境を作る
準備
Cのビルドをするのでそれ用の色々(gccなど)をまとめてインストールします。
$sudo yum groupinstall "Development Tools"
次に今回のやりたい要件(PostgreSQLのモジュールのインストール)のために必要なモジュールをインストールします。
$sudo yum install php-pear php56-devel postgresql94.x86_64 postgresql94-devel.x86_64
また、あとで.soは置き換えますが、PHPのpostgresqlモジュールはインストールしておきます。(iniファイルの作成だけ予め行っておくために。iniファイルを自分で変更する場合には実施不要)
$sudo yum install php56-pgsql.x86_64
module_pgsqlのインストール
module_pgsqlはPHPの本体に入っているようなので現在インストールしているPHPのソースコードを取得します。(本例では5.6.12)
$wget --trust-server-names http://jp2.php.net/get/php-5.6.12.tar.gz/from/this/mirror
解凍後、ビルドします。
$tar -zxvf php-5.6.12.tar.gz
$cd php-5.6.12/ext/pgsql/
$phpize
$./configure
$make
$make test
$sudo make install
上記によって.soの置きかわりが実施されています。
次にサービス再起動。
$sudo service nginx stop
$sudo service php-fpm stop
$sudo service php-fpm start
$sudo service nginx start
$wget http://localhost/phpinfo.php
結果が変わってました。
<h2><a name="module_pgsql">pgsql</a></h2>
<table>
<tr class="h"><th>PostgreSQL Support</th><th>enabled</th></tr>
<tr><td class="e">PostgreSQL(libpq) Version </td><td class="v">9.4.4 </td></tr>
pod_pgsqlのインストール
やってみます。
pod_pgsqlのソースコードもPHP本体にあるので先ほどダウンロードしたものを利用します。
$cd php-5.6.12/ext/pod_pgsql/
$phpize
$./configure
・・・
configure: error: Cannot find php_pdo_driver.h.
ERROR: `/var/tmp/PDO_PGSQL/configure' failed
!?
エラーになります。。。ただし、findするとphp_pdo_driver.hは存在します。。
$sudo find / -name php_pdo_driver.h
/usr/include/php-zts/5.6/php/ext/pdo/php_pdo_driver.h
/usr/include/php/5.6/php/ext/pdo/php_pdo_driver.h
configureをみて見ます。以下抜粋。
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PDO includes" >&5
$as_echo_n "checking for PDO includes... " >&6; }
if ${pdo_cv_inc_path+:} false; then :
$as_echo_n "(cached) " >&6
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PDO includes" >&5
$as_echo_n "checking for PDO includes... " >&6; }
if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then
pdo_cv_inc_path=$abs_srcdir/ext
elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then
pdo_cv_inc_path=$abs_srcdir/ext
elif test -f $prefix/include/php/ext/pdo/php_pdo_driver.h; then
pdo_cv_inc_path=$prefix/include/php/ext
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pdo_cv_inc_path" >&5
$as_echo "$pdo_cv_inc_path" >&6; }
if test -n "$pdo_cv_inc_path"; then
:
else
as_fn_error $? "Cannot find php_pdo_driver.h." "$LINENO" 5
fi
ここでエラーになっているっぽい。以下のような似た記事もありました。
PHP5.3.2のpdo_mysqlインストールで少しハマったところメモ
上記のように/usr/include/php
でから見えるようにするためにシンボリックリンクを貼ります。
$sudo ln -s /usr/include/php/5.6/php/ext /usr/include/php/ext
$sudo ln -s /usr/include/php/5.6/php/include /usr/include/php/include
$sudo ln -s /usr/include/php/5.6/php/main /usr/include/php/main
$sudo ln -s /usr/include/php/5.6/php/sapi /usr/include/php/sapi
$sudo ln -s /usr/include/php/5.6/php/TSRM /usr/include/php/TSRM
$sudo ln -s /usr/include/php/5.6/php/Zend /usr/include/php/Zend
これで無事configureが通るようになりました。
このままインストールまでします。
$./configure
$make
$make test
$sudo make install
これでpdo_pgsql.soが置き換わったはずなので確認してみます。
$sudo service nginx stop
$sudo service php-fpm stop
$sudo service php-fpm start
$sudo service nginx start
$wget http://localhost/phpinfo.php
以下のように9.44になっていました。
<h2><a name="module_pdo_pgsql">pdo_pgsql</a></h2>
<table>
<tr class="h"><th>PDO Driver for PostgreSQL</th><th>enabled</th></tr>
<tr><td class="e">PostgreSQL(libpq) Version </td><td class="v">9.4.4 </td></tr>
テストしてみる
本当にDBに接続出来るかスクリプトを作成して確認してみます。RDSでPostgreSQLを作成し、値は各自設定状態に合わせておいて下さい。
<?php
$dsn = 'pgsql:dbname={dbname} host={host} port=5432';
$user = '{user}';
$password = '{password}';
try{
$dbh = new PDO($dsn, $user, $password);
print('OK!!!!<br>');
}catch (PDOException $e){
print('Error:'.$e->getMessage());
die();
}
?>
これでアクセスしてみます。
$curl http://localhost/connect.php
OK!!!!<br>
大丈夫のようです!