[Ubuntu][PHP][PDO] UbuntuでPDOを使うときには、php5-devパッケージが必要。

いただいた情報を元に、早速PDOをインストールしました。

$ sudo pecl install pdo                                      [~]
Password:
Sorry, try again.
Password:
downloading PDO-1.0.3.tgz ...
Starting to download PDO-1.0.3.tgz (52,613 bytes)
.............done: 52,613 bytes
12 source files, building
running: phpize
sh: phpize: not found
ERROR: `phpize' failed

しかし、上の通り、phpizeがないというエラーになります。さて、phpizeというファイルはどのパッケージに含まれるのでしょうか? 不勉強なもので私はその方法を知りません。なのでGoogleに問い合わせたところ、php5-devをインストールする、という情報を得ることができました。php5-devをインストールすると、

$ dpkg --search phpize                                   [~/bin]
php5-dev: /usr/bin/phpize5
php5-dev: /usr/lib/php5/build/phpize.m4
php5-dev: /usr/share/man/man1/phpize5.1.gz

のように、php5-devパッケージからインストールできました。ところでこの無印の(-devではないphp5)に含まれないphpizeとは、何者なのでしょうか? manが用意されているので、読んでみます。

    
NAME phpize - prepare a PHP extension for compiling SYNOPSIS phpize [options] DESCRIPTION phpize is a shell script to prepare PHP extension for compiling.

PHP拡張をコンパイルするとか書いてあります。なんだかよく分かりません。phpizeはシェルスクリプトだと書いてあるので、遠慮なく読んでみます。

$ which phpize                                               [~]
/usr/bin/phpize

でこのファイルを開いて...といきたいところですが、zshがファイル名補完の途中で気になるものを表示しました。

$ ll /usr/bin/php                                            [~]
php@          php-config5*  phpize@       
php-config@   php5*         phpize5*  

phpizeには、phpizeの他に、phpize5があるというのです。このphpize5が本来使用されるべきphpizeではないかと、気になります。phpizeがシンボリックリンクであることも気になります。では、まずphpizeのシンボリックリンクをたどってみましょう。

$ ll /usr/bin/phpize                                         [~]
lrwxrwxrwx 1 root root 24 2006-12-17 03:33 /usr/bin/phpize -> /etc/alternatives/phpize
$ ll /etc/alternatives/phpize                                [~]
lrwxrwxrwx 1 root root 16 2006-12-17 03:33 /etc/alternatives/phpize -> /usr/bin/phpize5

とまあこのように、実はphpizeの実体は/usr/bin/phpize5なのでした。疑問が晴れたところで、改めてphpizeを読みます。

#!/bin/sh

# Variable declaration
prefix='/usr'
exec_prefix="`eval echo ${prefix}`"
phpdir="$prefix/lib/php5/build"
includedir="$prefix/include/php5"
builddir="`pwd`"

FILES_BUILD="mkdep.awk scan_makefile_in.awk shtool libtool.m4"
(中略)

     phpize_check_shtool

     phpize_check_autotools

     phpize_autotools
     ;;
esac

exit 0

よく分かりませんでした。よくわかりませんでしたが、PHPの拡張をコンパイルするというよりは、コンパイルの準備をしているように見受けられます。考えていてもしかたがないので、実際の挙動を実行して見てみましょう。

$ sudo pecl install pdo                                      [~]
Password:
downloading PDO-1.0.3.tgz ...
Starting to download PDO-1.0.3.tgz (52,613 bytes)
.............done: 52,613 bytes
12 source files, building
running: phpize  
Configuring for: 
PHP Api Version:         20041225
Zend Module Api No:      20050922
Zend Extension Api No:   220051025
building in /var/tmp/pear-build-root/PDO-1.0.3
running: /tmp/tmpUYfbez/PDO-1.0.3/configure
checking for grep that handles long lines and -e... /bin/grep
(中略)
          • -
Libraries have been installed in: /var/tmp/pear-build-root/PDO-1.0.3/modules If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,--rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages.
                                                                                                                                          • -
Build complete. (It is safe to ignore warnings about tempnam and tmpnam). running: make INSTALL_ROOT="/var/tmp/pear-build-root/install-PDO-1.0.3" install Installing shared extensions: /var/tmp/pear-build-root/install-PDO-1.0.3/usr/lib/php5/20051025/ Installing header files: /var/tmp/pear-build-root/install-PDO-1.0.3/usr/include/php/ Installing PDO headers: /var/tmp/pear-build-root/install-PDO-1.0.3/usr/include/php/ext/pdo/ running: find "/var/tmp/pear-build-root/install-PDO-1.0.3" -ls 6463251 0 drwxr-xr-x 3 root root 16 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3 395427 0 drwxr-xr-x 4 root root 30 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr 2153844 0 drwxr-xr-x 3 root root 17 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/lib 4196102 0 drwxr-xr-x 3 root root 21 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/lib/php5 6463252 0 drwxr-xr-x 2 root root 19 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/lib/php5/20051025 6463253 232 -rwxr-xr-x 1 root root 236997 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/lib/php5/20051025/pdo.so 8443927 0 drwxr-xr-x 3 root root 16 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/include 10520530 0 drwxr-xr-x 3 root root 16 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/include/php 12658257 0 drwxr-xr-x 3 root root 16 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/include/php/ext 14737725 0 drwxr-xr-x 2 root root 45 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/include/php/ext/pdo 14750986 4 -rw-r--r-- 1 root root 3016 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/include/php/ext/pdo/php_pdo.h 14737726 24 -rw-r--r-- 1 root root 23679 12月 17 04:04 /var/tmp/pear-build-root/install-PDO-1.0.3/usr/include/php/ext/pdo/php_pdo_driver.h Build process completed successfully Installing '/var/tmp/pear-build-root/install-PDO-1.0.3//usr/lib/php5/20051025/pdo.so' Installing '/var/tmp/pear-build-root/install-PDO-1.0.3//usr/include/php/ext/pdo/php_pdo.h' Installing '/var/tmp/pear-build-root/install-PDO-1.0.3//usr/include/php/ext/pdo/php_pdo_driver.h' install ok: channel://pecl.php.net/PDO-1.0.3 You should add "extension=pdo.so" to php.ini

PDOのコンパイルが始まりました。どうやら、phpizeは本当にコンパイルと関係があるようです。これを踏まえて、もう一度phpizeの内部を見てみます。気になった部分を抜き出します。

(中略)
prefix='/usr'
(中略)
phpdir="$prefix/lib/php5/build"
(中略)
FILES_BUILD="mkdep.awk scan_makefile_in.awk shtool libtool.m4"
FILES="acinclude.m4 Makefile.global config.sub config.guess ltmain.sh run-tests*.php"
(中略)
phpize_copy_files()
{
  test -d build || mkdir build

  (cd "$phpdir" && cp $FILES_BUILD "$builddir"/build)
  (cd "$phpdir" && cp $FILES "$builddir")
  (cd "$builddir" && cat acinclude.m4 ./build/libtool.m4 > aclocal.m4)
}
(中略)

これによると、どうやら/usr/lib/php5/buildというディレクトリの中にあるファイルをコンパイルするためのディレクトリにコピーしているようです。/usr/lib/php5/buildには、以下のものがありました。

$ ll /usr/lib/php5/build                                     [~]
合計 152
 -rw-r--r-- 1 root root  4308 2006-11-02 21:49 Makefile.global
 -rw-r--r-- 1 root root 66336 2006-11-02 21:49 acinclude.m4
 lrwxrwxrwx 1 root root    32 2006-12-17 03:32 config.guess ->  ../../../share/misc/config.guess
 lrwxrwxrwx 1 root root    30 2006-12-17 03:32 config.sub -> ../../../share/misc/config.sub
 lrwxrwxrwx 1 root root    33 2006-12-17 03:32 libtool.m4 -> ../../../share/libtool/libtool.m4
 lrwxrwxrwx 1 root root    32 2006-12-17 03:32 ltmain.sh -> ../../../share/libtool/ltmain.sh
 -rw-r--r-- 1 root root  2278 2006-11-02 21:49 mkdep.awk
 -rw-r--r-- 1 root root  2691 2006-11-02 21:49 phpize.m4
 -rw-r--r-- 1 root root 54642 2006-11-02 21:49 run-tests.php
 -rw-r--r-- 1 root root   410 2006-11-02 21:49 scan_makefile_in.awk
 lrwxrwxrwx 1 root root    19 2006-12-17 03:32 shtool -> ../../../bin/shtool

phpizeは、コンパイルに必要なファイルをコピーした上で、コンパイルを実行しているのだと思われます。では、peclコマンドでダウンロードしたファイルには、何が含まれているのでしょうか?

$ pecl download pdo                                          [~]
downloading PDO-1.0.3.tgz ...
Starting to download PDO-1.0.3.tgz (52,613 bytes)
.............done: 52,613 bytes
File /home/tom/PDO-1.0.3.tgz downloaded
$ zcat PDO-1.0.3.tgz|tar x                                   [~]
$ cd PDO-1.0.3                                               [~]
$ ls                                               [~/PDO-1.0.3]
CREDITS        config.m4   pdo_dbh.c          pdo_stmt.c
Makefile.frag  config.w32  pdo_sql_parser.c   php_pdo.h
README         pdo.c       pdo_sql_parser.re  php_pdo_driver.h
TODO           pdo.php     pdo_sqlstate.c     php_pdo_int.h

インストールした際、configureが実行されたように見えたのですが、それらしきスクリプトがありません。どうやら本当にphpizeは、パッケージに足りないファイルを付け足してコンパイルするためのもののようです。

と、ここまでだらだら書いてきましたが、この記事で本当にいいたいのは、表題の通り、「UbuntuでPDOを使うときには、php5-devパッケージが必要」だ、ということです。ちなみにできあがったpdo.soは、

 $ ll /usr/lib/php5/20051025/pdo.so                           [~]
 -rwxr-xr-x 1 root root 236997 2006-12-17 04:04 /usr/lib/php5/20051025/pdo.so

にありました。

また、各データベース用の拡張モジュールも、別途用意する必要があります。例えば、SQLiteの場合、

$ sudo pecl install pdo_sqlite                               [~]
downloading PDO_SQLITE-1.0.1.tgz ...
Starting to download PDO_SQLITE-1.0.1.tgz (868,469 bytes)
........................................done: 868,469 bytes
111 source files, building
running: phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20050922
Zend Extension Api No:   220051025
building in /var/tmp/pear-build-root/PDO_SQLITE-1.0.1
running: /tmp/tmpvJeWHt/PDO_SQLITE-1.0.1/configure
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for a sed that does not truncate output... /bin/sed
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
(中略)
8443928 1124 -rwxr-xr-x   1 root     root      1147023 12月 17 04:40 /var/tmp/pear-build-root/install-PDO_SQLITE-1.0.1/usr/lib/php5/20051025/pdo_sqlite.so

Build process completed successfully
Installing '/var/tmp/pear-build-root/install-PDO_SQLITE-1.0.1//usr/lib/php5/20051025/pdo_sqlite.so'
install ok: channel://pecl.php.net/PDO_SQLITE-1.0.1
You should add "extension=pdo_sqlite.so" to php.ini

となります。

またログの最後の行にも書いてありますが、/etc/php5/apache2/php.iniに以下の行を追記する必要があります。

extension=pdo.so
extension=pdo_sqlite.so