[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 (中略)
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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