これも仕事ネタです。
さくらのレンタルサーバーを使って拡張モジュールを使えるようにしてみた記録です。
どうも使えるモジュールが少ないように思うのは気のせい?
というわけで、とあるサイトを構築している人ですが、そのタイミングでmcryptのライブラリ処理が必要になる場面が出てきてしまいました。
レンタルサーバーを使っているとどうもこうなる場面が多いように思います。自分の自由にならないですからね。
もちろん内部テストでは自鯖を使っているので当たり前のごとくこんな問題は起こりません。
今回の方は(たぶん)比較的簡単なphp-mcryptを使えるようにしてみた編です。
といっても、パッケージとかではなくモジュールのコンパイル
つまりコンパイラが使える環境である必要があります。さくらのレンタルサーバーの場合はレンタルでも一定以上のプランであればターミナルログインができる上にコンパイラも使えるのでこれができます。
それでも手順がちょっと細かいのでいろいろと注意しながら進んでいきたいと思います。
まずは使用しているphpのバージョンを確認してみよう
これが意外と重要。さくらのレンタルサーバーの場合はphpのバージョンをいくつか選べるので確認しておく必要があります。
この記事を書いている段階で使えるのは以下の三つです。
- PHP 5.3.8 (標準のPHPもこれ)
- PHP 5.2.17
- PHP 4.4.9 (過去互換用)
今回の場合は最新のバージョンである5.3.8を使ってみることにします。
ターミナルでログインしてphpのソースコードを取得しよう
phpのダウンロードサイトからソースコードを取得してターミナルで作業ディレクトリに入れます。
もちろん、対象のバージョンと同じバージョンのソースコードを取得します。通常はダウンロード先のURLをブラウザでコピーしてwgetとtarで処理して完了、になります。
以下この記事では作業ディレクトリを/home/hoge/src/とします。(hogeの部分はさくらのレンタルサーバーにログインするときのログイン名になるはず)
また、この時点でphpモジュールのインストール先を/home/hoge/phplib/としておきます。
で、この位置にダウンロードしたファイルを解凍します。おそらく/home/hoge/src/php-5.3.8/以下で作業を行います。
対象となるモジュール位置でconfigureを行う
今回の場合はmcryptなので、/home/hoge/src/php-5.3.8/ext/mcrypt以下になります。それ以外のモジュールを使いたいときはそれぞれのディレクトリで作業を行います。
そして、そのディレクトリの中でおもむろに
./configure --prefix=/home/hoge/phplib --with-php-config=/usr/local/php/5.3.8/bin/php-config
と入力します。注意点が後ろの–with-php-configがないとまともでないモジュールを作ってしまうことになります。
なぜphpのバージョンを確認することが必要だったかはこの部分にあり、バージョンが5.2.17を使っているときは
./configure --prefix=/home/hoge/phplib --with-php-config=/usr/local/php/5.2.17/bin/php-config
と、バージョンにあったphp-configを呼び出させる用にする必要があります。
ちなみに、–with-php-configがないと、そのレンタルサーバーが持っているデフォルトのphp-configを参照する(/usr/local/bin/php-configを参照します。私の場合は5.2.17系になっていました)ので状態ががおかしくなるわけですね。
また、prefixも定めていますが、あまり意味はありません。間違えて入力したときにサーバーのシステム領域へのアクセスを行わないようにするための保険です。
モジュールをコンパイル
make
でコンパイルします。ちょっとよくわからないことが、php-mcryptにはlibmcryptが必要とか何とか書いてあるのですが、私の場合はlibmcryptがシステムにあるのか使っていないのかよくわかりませんが、
makeコマンドがほぼすんなりいきました。もちろん「ほぼすんなり」であって、一カ所修正が必要です。
それはmcrypt.cの283行目の定義にあります。直接コンパイルしているせいかよくわかりませんが、
PHP_FE(mcrypt_module_close, arginfo_mcrypt_module_close) PHP_FE_END };
のPHP_FE_ENDが定義されていない、というエラーが出ます。この部分を
PHP_FE(mcrypt_module_close, arginfo_mcrypt_module_close) {NULL,NULL,NULL} };
と書き変えてください。これでエラーは出ないはずです。
できあがったモジュールを直接php拡張モジュールパスにコピー
make installコマンドを使うのもいやなので直接コピーしちゃいます。
cp /home/hoge/src/php-5.3.8/ext/mcrypt/modules/mcrypt.so /home/hoge/phplib/ chmod 0755 /home/hoge/phplib/mcrypt.so
でOKです。
php.iniを変更してライブラリを読み込むように
最後にさくらのコントロールパネルからphp.iniを編集します。
拡張ライブラリを読み込むように変更するので、以下のような感じになります。
extension_dir = /home/hoge/phplib extension = mcrypt.so
で、これを保存して完了です。確認はphpinfo()を呼び出してみてちゃんとmcryptの応答があるかを確認してみてください。
なんかいろいろなページに振り回された
モジュールを組み込む作業なのでいろんなページを見ましたが、途中惑わされました。
というのも、mcryptで検索すると今回のモジュールとは関係ないモジュールの話になってやれmcryptだ、それをコンパイルするのにmhashが必要だ・・・という話に。
途中気がつくまで遅れてしまい、またもや数時間を無駄にすることに。いらいらしてターミナル上でいろいろと暴れてやりました。