職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

XAMPP環境でPHPからPostgreSQLに接続

Windows環境でPHP+PostgreSQLなものを作る必要に迫られたので環境構築をしました。WindowsでPostgreSQL使うのは久し振りということもあり、少しだけ躓いたので、メモを残しておきます。

PostgreSQL for Windows インストーラの入手

PostgreSQLはオープンソースなソフトウェアで、通常はソースコードでの配布です。Linuxなどの多くの環境ではソースコードからのビルドも、マニュアル(日本語版・原文)に従えば非常に簡単にできます。しかし、Windows機できちんとしたビルド環境を持つのは非常に面倒臭いので、バイナリでの配布のお世話になることになります。
注1:もちろんRPMなどのパッケージでの配布もあります。
注2:Windowsでのビルド環境の用意は、もしかしたら簡単なのかもしれませんが、筆者の食わず嫌いです。
注3:マニュアル(リンクは前述)では、Windowsユーザはバイナリを落とした方が良いよ、と言っています。

Windows向けのインストーラ、昔はJPUG(日本PostgreSQLユーザ会)をはじめとしていろんな団体が配布していたのですが、今ではJPUGは配布をやめてしまったようです。そのかわり、EnterpriseDB社のサイトからダウンロードすることが可能です。

インストール方法がわからない人は、少し古いですが、 WindowsでPostgreSQLを使ってみよう — Let's Postgres あたりを参考にすれば良いんじゃないかなと思います。

XAMPPのPHPから接続

さて、本題です。
PHPで接続テスト用のコードを書いても良いのですが、ここでは接続テストのために phpPgAdmin を使用します(必須という訳ではないですが、有ったら有ったで開発には便利ですし)。導入するには、

  1. zip版をダウンロードしてきてxamppのhtdocs配下に解凍
  2. phppgadmin/conf/config.inc.php 設定ファイルをいじる(詳細は後述)

という手順を踏めばOK。
恐らく上手く行かないだろう…と思いながら phpPgAdmin のURLを叩くと、案の定エラーになりました。
f:id:t_motooka:20140210131951p:plain
※エラーメッセージの言語は、ブラウザの言語設定によるようです。

さて、エラーメッセージ曰く「PHP再ビルドしてね(はぁと)」だそうですが、そんな面倒臭いことやるくらいならXAMPP利用しません。他の対処法を探しましょう。

php.ini

php.ini(xampp\php\php.ini)の1018行目あたりに、次のような設定があります。

;extension=php_pgsql.dll

この設定ファイルで読み込むDLLの設定をやっている訳ですが、見ての通り行頭にセミコロンがあり、コメントアウトされています。
このセミコロンを除去して有効にしましょう。PDO経由でも使いたいのなら、その近くにあるphp_pdo_pgsql.dllも有効にしとくと良いでしょう。
設定してから、XAMPPのコントロールパネルからApacheを再起動させると、今度は次のようなエラーが出ました。
f:id:t_motooka:20140210132130p:plain
先ほどのphp.iniに書いたlibpq.dllの実体が見つからない、ということのようです。XAMPPのディレクトリを見てみると、実体はxampp\php\libpq.dllとして置いてあるようです。どうやら、ここに探しにきてくれてないようです。

DLLを探してもらうために

Windowsでは通常(明示しない場合)、DLLは環境変数PATHが指している場所を探しにいくようです。なのでPATHにxampp\php\(もちろん実際は絶対パス)を追加すればOKです。注意しなければならないのは、このPATHの設定をした後はApacheの再起動ではなくてXAMPPコンパネ本体の再起動が必要だということです。
※PATHを設定しなくてもphp_pgsql.dllを読めているのは、php(Windows版バイナリ)の中で、extディレクトリの中を探索するように組み込まれているのでしょう。きっと(ソースは勘)。

ここまで一通り設定すると、XAMPPからApacheの起動も成功し、phpPgAdminの画面もキレイに見えます。ログインもできました。
f:id:t_motooka:20140210132146p:plain

開発環境としては、これで十分ですね。

phppgadmin/conf/config.inc.php設定ファイルでやるべきこと
  • 接続したいサーバの情報を $conf['servers'][0]['host'] などの連想配列に与えてあげる
  • もしもpostgresユーザなどの特権ユーザで接続したいのなら、 $conf['extra_login_security']ã‚’falseにしてあげる

という設定変更が必要です。特に後者のことは忘れがちなので合わせてメモしておきましょう(もちろん、外部に公開しているサーバでこんな危険な設定を入れたりしちゃダメですよ)。


バージョン情報

  • Windows 7 Home (64bits)
  • XAMPP 1.8.2
  • PostgreSQL 9.3.2
  • phpPgAdmin 5.1(※phpPgAdmin5.1はPostgreSQL9.3を公式にはサポートしていません)