PHPのmodule_pgsqlとmodule_pdo_pgsqlのバージョンをpsqlと合わせた話

AmazonLinuxでPHP5.6とpostgresqlのモジュールをインストールしてみたのですが、8.4系で古い。。。

```bash
<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 を合わせる ](http://arpanet617.blog.fc2.com/blog-entry-18.html)
+ [VirtualBoxで作るCentOS+nginxの検証環境ＷｅｂサーバのPHP関連（pdo_pgsql、pgsql）のバージョンを合わせる](https://ttbbsky.net/virtualbox%E3%81%A7%E4%BD%9C%E3%82%8Bcentosnginx%E3%81%AE%E6%A4%9C%E8%A8%BC%E7%92%B0%E5%A2%83%EF%BD%97%EF%BD%85%EF%BD%82%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AEphp%E9%96%A2%E9%80%A3%EF%BC%88pdo_pgsql/)

# やること

そもそもPHPのextensionの話などよくわかってなかったのですが、以下がすごい分かりやすかったです。

[[PHP]pecl,phpize,extensionという単語を見て頭痛がするあなたへの処方箋](http://dqn.sakusakutto.jp/2015/07/php_extension_pecl_phpize.html)

今回は上記のCで書かれたライブラリの設定を行って.soを作る必要があり、要はビルドします。（もし、ビルドせずにやる方法をご存知の方がいらっしゃれば教えていただけるとありがたいです。）

# 環境

+ Amazon Linux AMI 2015.03.1

また、以前書いた記事のnginx、PHP5.6のインストール及びPHP-fpmでの接続までを実施した状態とします。

[AmazonLinuxにnginx+PHP5.6+PHP-fpm+PHP-redis環境を作る](http://qiita.com/toshihirock/items/77835f83f679423874ea)

# 準備

Cのビルドをするのでそれ用の色々(gccなど）をまとめてインストールします。

```bash
$sudo yum groupinstall "Development Tools"
```

次に今回のやりたい要件(PostgreSQLのモジュールのインストール）のために必要なモジュールをインストールします。

```bash
$sudo yum install php-pear php56-devel postgresql94.x86_64 postgresql94-devel.x86_64
```

また、あとで.soは置き換えますが、PHPのpostgresqlモジュールはインストールしておきます。(iniファイルの作成だけ予め行っておくために。iniファイルを自分で変更する場合には実施不要）

```bash
$sudo yum install php56-pgsql.x86_64
```
# module_pgsqlのインストール

module_pgsqlはPHPの本体に入っているようなので現在インストールしているPHPのソースコードを取得します。（本例では5.6.12)

```bash
$wget --trust-server-names http://jp2.php.net/get/php-5.6.12.tar.gz/from/this/mirror
```

解凍後、ビルドします。

```bash
$tar -zxvf php-5.6.12.tar.gz
$cd php-5.6.12/ext/pgsql/
$phpize
$./configure
$make
$make test
$sudo make install
```

上記によって.soの置きかわりが実施されています。
次にサービス再起動。

```bash
$sudo service nginx stop
$sudo service php-fpm stop
$sudo service php-fpm start
$sudo service nginx start
$wget http://localhost/phpinfo.php
```

結果が変わってました。

```bash
<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本体にあるので先ほどダウンロードしたものを利用します。

```bash
$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は存在します。。

```bash
$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インストールで少しハマったところメモ](http://blog.h13i32maru.jp/entry/20100918/1284811103)

上記のように`/usr/include/php`でから見えるようにするためにシンボリックリンクを貼ります。

```bash
$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が通るようになりました。
このままインストールまでします。

```bash
$./configure
$make
$make test
$sudo make install
```

これでpdo_pgsql.soが置き換わったはずなので確認してみます。

```bash
$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になっていました。

```bash
<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を作成し、値は各自設定状態に合わせておいて下さい。

```/var/www/connect.php
<?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();
}
?>
```

これでアクセスしてみます。

```bash
$curl http://localhost/connect.php
OK!!!!<br>
```

大丈夫のようです!