モジュールをインストールできないと思ったら

2009/06/30 | CLI, PDO

VPSを何台か借りているが、VPSというのは、その内情(インストール方法)を知っておかないと、恐ろしく手間取る可能性があることを改めて知った。

格安でVPSを借りているのだが、そこにはpdo_mysqlがインストールされていなかった。そこでpdo_mysqlをインストールしようとして四苦八苦したので、メモを残しておく(現状報告として、現時点ではインストールできていない)。

まず最初にしたことはRPMパッケージ探し。OSはCentOSであることがわかっているが念のため、バージョンを確認。

more /etc/redhat-release

これでバージョンが確認できた(ちなみにOSはCentOS4.7だった)。次に当該バージョンでRPMが提供されているかどうかウェブで調べる。結構調べたつもりだけど、結果として見つけられなかった。「さて、どうしようか」と考えて、次にPECLでのインストールを試みる。これには事前にいろいろなパッケージを入れておく必要がある。yumコマンドでインストールした。

yum –enablerepo=centosplus -y install php-devel php-pear mysql-devel httpd-devel

yumのリポジトリでcentosplusというのを有効にしておく必要があるみたい。ちなみにyオプションは、何を聞かれても「y」と答えなさい、という意味。ここまででPECLコマンドが利用できるようになった(PECLは確かPEARに含まれていたと思った)。そこでコマンドラインで、コマンド一発。

pecl install pdo_mysql

とりあえず応答メッセージの下のほうにcompleteと書いてあるので、いちおうOKっぽい。で、最終作業。php.iniに必要な情報(extension_dirやextension)を記述してapacheを再起動。しかしphpinfoにはpdo_mysqlは現れない。それどころかエラー。

PHP Warning: PHP Startup: pdo_mysql: Unable to initialize module
Module compiled with module API=20050922, debug=0, thread-safety=0
PHP compiled with module API=20060613, debug=0, thread-safety=0
These options need to match
in Unknown on line 0

ん~。どうやらバージョンが違うようだ。どうしてこんな食い違いが起こるんだろう。

その後、いろいろやってみたけどやっぱり動かない。なぜこんなことがおきるんだ。と思ってウェブを調べていたら、英語サイトにヒントが見つかった。そのサイトには、以下のコマンドを試してみろと書いてあった。

php -v
/usr/bin/php -v
/usr/local/bin/php -v

ん~、どういうことだろうと思いつつ、コマンドを打ってみたら、あれまぁ、結果が違うじゃん。バージョンとか。もしやと思って、rpmコマンドでインストールされているPHPのバージョンを調べてみた。そしてphpinfoでもバージョンを確認。そして愕然。

バージョンが違う。少し考えてわかった。PHPはrpmでインストールじゃなくて、コンパイルしてインストールされているんだ。しかもいろいろ調べてみたら、どうもapacheも手作業でインストールされているっぽい(だって設定ファイルの位置がRedHat系の場所と違うんだもん)。てことは、簡単お手軽RPM(もしくはyum)でインストールしようが、何しようが反映されないし、ディスクの肥やしになるだけってことか(性格にはCLI版PHPには反映されるわけだが)。

VPSにしても専用サーバにしても、開発の重要な要素である、PHPやapache、データベース周りはどのようにインストールされているのか知っておく必要がありそうだ。そもそも今回自分が借りているサーバだからいろいろできたけど、そうじゃなかったらサーバ屋さんに有償対応をお願いしたところだけど・・・、自分でやってみて初めて状況がわかったよ。

ということで、問題のpdo_mysqlはいまだにインストールできていない。今度また時間があったら再度チャレンジする予定。自分の家にあるPCにインストールしてあるんだったらとりあえずやっちゃうんだけど、レンタルしているサーバだから再インストールになったらまた費用がかかるから無理はしないことにした。

Smartyテンプレート内でPHPスクリプトを書くときに

2009/03/16 | Smarty

すでにテンプレート内でロジックを書くということ自体がいけないのだが、それでもどうしてもやらなければいけないときがある(というかそのほうがソースがきれいになる)。

Smartyは専用タグを使うPHPのテンプレートエンジンだけど、テンプレートの中にPHPプログラムを直接書くこともできる(書かないでいいものなら書かないほうがいい)。例えばこんなふうに。

{php}
print(‘This is PHP script’);
{/php} 

そもそもこういうふうな処理をかかなければならないわけだから、何らかの変数処理というのも必要になるわけだし、変数だってテンプレートにSmarty変数として使用していたものを使いたくなるのも人情だ。そんな場合は、こういう具合に書く。

$smarty->assign(‘myText’,’This is PHP script’);

{php}
print($this->get_template_vars(‘myText’);
{/php} 

プログラム本体内でmyTextという名前でアサインされた変数を、テンプレート内のPHPスクリプトから呼び出す例だ。ミソは「get_template_vars」メソッド。Smarty関数を書くときにも時々使ったりする。これを使って呼び出せばいい。

でも、やらなくてすむのなら、やらないほうがいい。

画像を作って日本語文字列を表示

画像を操作する関数としてGD関数群が用意されている。で、それらの関数を使うと、拡大とか縮小とかトリミングとかいろいろできる。さらに画像の中に文字を書き込むこともできる。でもって、さらに、マルチバイトな文字も書き込むことができる。それがimagettftext関数だ。

imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )

ただし、一手間かけないといけない。7つ目の引数「フォントファイル」の指定だ。たいていの場合、レンタルサーバにはそんなものは用意されていないので、自前で準備する必要がある。で、使えるフォントはこちらのがいいようです。

M+とIPAフォントの合成フォント

請求書フォームとかPDF出力したりするのにもつかえそう。

Exifを処理する

2009/02/25 | PHPライブラリ

PHP5ってほんと便利。新しい関数を見つけるたびに思う。

今日見つけたのはExifを扱うライブラリ。最近のデジカメでは大抵採用されている、画像ファイルにデータを付加するための約束事。JPEGとTIFFに対応しているらしい。いつも思うことだけど、JPEGが先かExifが先か(鶏が先か卵が先か、みたいな)。

PHP5ではExifも読むことができる。一番簡単なのはExif拡張モジュールを使うこと。外部ライブラリなしでExifを読むことができるのだけれど、–enable-exif付きでPHPコンパイルされている必要がある。意外とレンタルサーバとかだと敷居が高いかもしれない。調べてみると他にも方法がある。sourceforgeに登録されているPELというライブラリだ。

http://pel.sourceforge.net/

すべてPHPのみで実装されているらしい(Exif拡張モジュールなしでやってるのかな・・・すごい)。名前からしてJPEGとExifのためのライブラリだろう。ソースを読めばExifとJPEGの知識が増えそうだ(読まないけど)。最近のデジカメでも携帯のカメラでもいろんな機能が付いてるので、画像だけで、GPS位置情報とかも取得できるかもしれない。まぁ、そういう必要に迫られて調べているので、時間を作ってスクリプトを一つ書いてみることにしよう。

Smartyのフィルタ

2008/11/28 | Smarty

携帯サイト等シフトJISでサイトを構築する場合、Smartyを使うことにしている。PHP自体はシフトJISでの記述はNGなのでUTF-8で記述し、テンプレートHTMLをシフトJISで記述して使用している。素でそのまま使ってしまうと文字化けしてしまうので、テンプレートを読み込む際にいったん文字コードをUTF-8に変換し、出力するときに再度シフトJISに変換するような処理をしている。

そのときに便利な機能がSmartyのフィルタだ。フィルタにはプレフィルタ、ポストフィルタ、アウトプットフィルタの3種類があり、用途は以下のとおり。

  • プレフィルタ(prefilter)
    テンプレートをコンパイルする際(コンパイル前)にテンプレートファイルに対して処理が施される。
  • ポストフィルタ(postfilter)
    テンプレートをコンパイルする際(コンパイル後)にテンプレートファイルに対して処理が施される。
  • アウトプットフィルタ(outputfilter)
    コンパイルされたテンプレートに対して出力用の変数がアサイン等され、実際に出力する際に処理が施される。

実は最初勘違いしていた。プレフィルタとポストフィルタだけだと思っていた。テンプレート読み込み時にプレフィルタにかけられ、HTML出力時にポストフィルタにかけられると思っていた。Smartyを使った処理を記述する際に、希望通りの動作をしてくれないのでマニュアルを読み直してみて初めて知った。ちょっと恥ずかしい。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net