Shoyan blog

Php-idnkitをインストールする

php-idnkitをインストールしたのでメモ。
OSはubuntu、PHPのバージョンは5.6.24で行った。

php-idnkitはidnkitをPHPから使えるようにするPHPの拡張モジュール。
拡張モジュールなのでPHPをコンパイルし直す必要はない。モジュールをコンパイルして、php.iniのextensionに指定すれば使えるようになる。

idnkitのインストール

php-idnkitはあくまでidnkitをPHPから使えるようにする拡張モジュールなのでidnkitがないと動作しない。
まずはidnkitをインストールする。

idnkitはJPNICが提供しており、以下からソースコードをダウンロードすることができる。

1
2
3
4
5
6
$ wget https://www.nic.ad.jp/ja/idn/idnkit/download/sources/idnkit-1.0-src.tar.gz
$ tar -zxf idnkit-1.0-src.tar.gz
$ cd idnkit-1.0-src && \
    ./configure && \
    make && \
    make install

php-idnkitをインストール

続いてphp-idnkitをインストールする。
そのままではエラーとなったので以下のパッチをあてた。

php-idnkit.patch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--- xxx/idnkit.c
+++ yyy/idnkit.c
@@ -36,7 +36,11 @@ static int le_idnkit;
  *
  * Every user visible function must have an entry in idnkit_functions[].
  */
+#if ZEND_MODULE_API_NO >= 20100525
+zend_function_entry idnkit_functions[] = {
+#else
 function_entry idnkit_functions[] = {
+#endif
    PHP_FE(idnkit_decodename,   NULL)
    PHP_FE(idnkit_encodename,   NULL)
    PHP_FE(idnkit_errno,        NULL)
@@ -104,7 +108,7 @@ PHP_MINIT_FUNCTION(idnkit)
    idn_nameinit(1);

    /* get idnkit version */
-   REGISTER_STRING_CONSTANT("IDNKIT_VERSION", (char*)idn_version_getstring(), CONST_CS | CONST_PERSISTENT);
+   REGISTER_STRING_CONSTANT("IDNKIT_VERSION", "1.0", CONST_CS | CONST_PERSISTENT);

    /* idnkit actions */
    REGISTER_LONG_CONSTANT("IDNKIT_DELIMMAP",       IDN_DELIMMAP,       CONST_CS | CONST_PERSISTENT);
1
2
3
4
5
6
7
8
$ wget http://www.sera.desuyo.net/idnkit/php-idnkit-20031204.tar.gz
$ tar -zxf php-idnkit-20031204.tar.gz
$ cd idnkit && \
    patch -lsp1 < /tmp/php-idnkit.patch && \
    phpize && \
    ./configure && \
    make && \
    make install

php.iniにextensionを指定

最後にphp.iniにextensionを指定を指定する。
以下は、/usr/local/lib/php.ini にphp.iniがある場合の設定例。

1
$ echo "extension=idnkit.so" >> /usr/local/lib/php.ini

以下のコマンドが動作すればOK。

1
2
$ php -a
> echo idnkit_encodename(mb_convert_encoding("日本語JPドメイン名.jp", "UTF-8", "auto"));

Comments