PHPの最近のブログ記事

pear で次のようなメッセージが出たら、更新パッケージを取ってくる先が古いかもしれないってことらしい。

WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update

こんなときは、

$ pear channel-update pear.php.net

で更新される。

CentOS 5 に PHP のモジュールである Imagick を入れてみる。

Apache2.2とPHP5.2は事前にインストールしておくこと。→(参照

まずImageMagickをインストール。

# yum install ImageMagick ImageMagick-devel

で、Imagickをインストール。

# cd ~
# mkdir src
# cd src
# pecl bundle imagick-3.0.0
# cd imagick-3.0.0
# phpize
# ./configure
# make

これで ~/src/imagick-3.0.0/modules の下に imagick.so ができる。

これをphpが見えるようにする。

# mkdir -p /usr/local/lib/php/ext
# cp ~/src/imagick-3.0.0/modules/imagick.so /usr/local/lib/php/ext

php.ini を編集。

php.ini は PHPのソースを展開したディレクトリの下に
php.ini-dist というのがあるので、これを /usr/local/lib の下にコピる。

# cp ~/src/php-5.2.14/php.ini-dist /usr/local/lib/php.ini
(↑PHPのソースの場所は展開した場所で)

php.ini を開いて、extension_dir を書き換える。

; Directory in which the loadable extensions (modules) reside.
#extension_dir = "./"
extension_dir = "/usr/local/lib/php/ext"

で、imagick.so を追記(どこでもいい)。

extension=imagick.so

これで、Apache を(再)起動。

# /etc/rc.d/init.d/httpd restart

これで phpinfo() を表示してみる。

imagick の項目が有効になっていればOK。

# 上記の pecl コマンドは pecl install imagick-3.0.0 とするとコンパイルまでやってくれる。
# その場合は /usr/local/lib/php/extensions/no-debug-non-zts-20060613/ の下に imagick.so ができる。
CentOS 5 は、パッケージ管理(yum)を使うと、
PHP5.1がインストールされる。

ので、PHP5.2をインストールするメモ。

ちなみに、Apache2.2とMySQL5に関してはそのままyumで入る。

# yum install httpd httpd-devel
# yum install mysql mysql-devel

PHP はソースから構築するので、
Apache と MySQL は devel もインスコしておく必要がある。

上記が終わったら PHP5.2 をインストール。

# cd ~
# mkdir src
# cd src
# wget http://jp2.php.net/get/php-5.2.14.tar.gz
# tar zxvf php-5.2.14.tar.gz
# cd php-5.2.14
# ./configure
--with-apxs2=/usr/sbin/apxs
--enable-mbstring
--enable-mbregex
--enable-zend-multibyte
--with-gd
--enable-gd-native-ttf
--with-zlib
--with-mysql
# make
# make install

※configureの他のオプションはお好みで。


PHPが動くように、httpd.conf を変更。

# vi /etc/httpd/conf/httpd.conf

# ↓LoadModule が並んでる一番最後に追加。
# もしかしたらphpのインストールで追記されてるかもしれない
# その場合はここは不要。
LoadModule php5_module modules/libphp5.so

# どこでもいいので追記。
AddType application/x-httpd-php .php

# DirectoryIndex で index.php も有効にする。
DirectoryIndex index.html index.html.var index.php

これでApacheを起動。

# /etc/rc.d/init.d/httpd start

PHPがApache上で動くか確認。

<?php phpinfo(); ?>

とだけ書いたファイルを /var/www/html に保存。

名前は phpinfo.php とでもする。

このファイルに読み取り権限を与えておく。

# chmod 666 /var/www/html/phpinfo.php

ブラウザでこのファイルにアクセス。

http://localhost/phpinfo.php

情報が表示されればとりあえずOK。

フォルダの中身をごそっと入れ替えて php.ini だけ流用しようと考えたけど、
go-pear.bat がうまくいかず。

どうも、php_pdo.dll と php_zip.dll がPHP5.3のextにはない。
他にもあったものがなかったり、その逆もあったりがありそうだったので、
しょうがなく php.ini からつくり直すことに。

とりあえず、

extention=php_pdo.dll
extention=php_zip.dll

はコメントアウト。

これで、もう一度 go-pear.bat。

すると

phar "C:\php\PEAR\go-pear.phar" does not have a signaturePHP ...云々

とかいうエラーが出てこれまた上手くいかず。

頼みの綱の Google先生に聞いてみたところ、

Windows 版 PHP 5.3 の go-pear.bat がエラーになる
http://ameblo.jp/phpwalker/archive1-200912.html

ということらしい。ほほうっ!

ということで、go-pear.phar を以下のように修正。

@ECHO OFF
set PHP_BIN=php.exe
%PHP_BIN% -d output_buffering=0 -d phar.require_hash=0 PEAR\go-pear.phar pause

php.ini の phar.require_hash を修正。。。

あれ?そんな項目ないな。

どうもPHP5.3から新しくできたエントリらしい。
ので、PHP5.3付属のphp.ini-developmentを参考にエントリーごと追加。

[Phar]
; http://php.net/phar.require-hash
phar.require_hash = Off

これで go-pear.bat を実行。

上手くいった!

Apacheを起動してphpinfo()を表示してみる。

すると、dateのところで

It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function.

というようなエラーになっているぞ?

Google先生ー!

PHP5.3のdate関数でIt is not safe to rely on the system's timezone settings.
http://d.hatena.ne.jp/replication/20100321/1269097359

ほうほう。5.1以降ではtimezoneの設定をしないとエラーになるんですね。

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo

これでいいかな。

改めて phpinfo()を表示してみると、万事成功。

でも、PHP5.2でもtimezone設定してなかったんだけど、
そっちは上手く動いてたなぁ。

まぁ、動いたからいいや。
厳密に言えば PHP の Imagick が使えない件。

ググってここにたどり着いた人の為に最初にいっておきますが、この問題、私は解決できてません!

環境はこう。

  • Windows 7 Professional
  • PHP 5.2.14
  • Apache 2.2.x
  • ImageMagick 6.6.5
ただ、この場合 Apache は多分関係ない。

だって、

php -v

ってやっただけで発症するんだから。

手順はこう。

1. Apache 2.2 をインストール。
これは普通にインスコ。多分今回の問題に関係ないので詳細略。

2. PHP 5.2.14 をインストール。
http://www.php.net/downloads.php から PHP 5.2.14 zip package というのをダウンロード。インスコ。ここで5.3.x を使わないのは、5.3系だと PHP単独ですら上手く起動できない感じだったから。5.2系ならPHPだけなら問題なく動作するので問題切り分けの為に5.2系にする。あと、Installer もあるけど、Installerで入れると、ext 周りが全く入ってないので最初からextも入ってるzipの方を採用(しかし、何でInstallerにext入れてないんだろ?)。ここは C:\php5 に入れる。このパスは環境変数 PATH に追加する。

3. ImageMagick 6.6.5 をインストール。
http://imagemagick.org/download/www/binary-releases.html#windows から ImageMagick-6.6.5-4-Q16-windows-dll.exe というのをダウンロード。インスコ。スペースを含むようなパス(C:\Program Files とか)にインスコすると調子が良くないらしいので、C:\ImageMagick に入れる。あと、MAGICK_HOME という環境変数をつくってこのパスを設定、それを PATH に追加する。

4. Imagick を配備。
以前の PHP には ext に最初から php_imagick.dll も入ってたんだけど、5.2.14 のパッケージには入ってなかった。ただ、従来も、最初から入ってる php_imagick.dll は上手く動かないという報告が多かった。で、大抵はどっかからダウンロードしてきて配備する。いろいろググると、以下のようなところがあたる。

http://valokuva.org/outside-blog-content/imagick-windows-builds/080709/
http://valokuva.org/builds/

どっちも同じドメインだけど、配布物が違うのはこれ如何に?まぁそれは置いといて、結論をいうと、どれを使ってもダメでした。とりあえずここは上のサイトから一番新しいと思われる php_imagick_dyn-Q16.dll というのをダウンロードして、C:\php\ext にコピー。

5. VC++ 2008 再頒布可能パッケージをインストール。
どうも 上記の dll はVCでコンパイルされていて、それをうまく動かすにはこれが必要らしい。
http://www.microsoft.com/downloads/details.aspx?familyid=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=ja

6. php.ini 書き換え。
extension_dir = "c:/php5/ext"
extension=php_imagick_dyn-Q16.dll
という項目を追加する。

これで、コマンドプロンプトから

php -v

と打ち込むと、バージョン情報自体は表示されるが、ほどなく

CLIは動作を停止しました
というダイアログも表示される。

このキーワードでググっても、php_mysqli.dll が悪さをしてるんだというようなものばかりひっかかって、Imagick の話はない。php_mysqli.dll はすこぶる元気に動いてるんですが。当然、php_mysqli.dllをコメントアウトしても状況変わらず。php_imagick_dyn-Q16.dllをコメントアウトすれば、上記メッセージは出ない(つまり、正常動作)。

ちなみに、php_imagick_dyn-Q16.dll の代わりに php_imagick_ts.dll を使うと、

---------------------------
php.exe - エントリ ポイントが見つかりません
---------------------------
プロシージャ エントリ ポイント zend_replace_error_handling がダイナミック リンク ライブラリ php5ts.dll から見つかりませんでした。
というようなメッセージになる。

当然、この状態で Apache を起動しても、PHPから Imagick がロードできない。

かなり調べたんだけど、全く情報が得られず。これで悩んでるのって私だけかなぁ。
PHP の正規表現で使えるデリミタは "/" だけではなかった。

preg_match('/^abc$/', $str);


というような記述を常用しているのだけど、これは

preg_match('{^abc$}', $str);


とか

preg_match('(^abc$)', $str);


みたいに "{" と "}" や "(" と ")" でもいける。

# "{}" は perl では普通か?


何でこれに気づいたかというと、

preg_match('/^' . $pattern . '/', $str);


という風に、正規表現パターン指定に変数を使う場面があって、
そのパターンが "http://" とか "https://" みたいに "/" を含む場合、

preg_match('/^http///', $str);


とかになるので、この呼び出しが失敗していたのです。

まぁ、当然ですね。

で、その場合は

preg_match('/^http\/\//', $str);


という具合にエスケープしてやる必要があるけど、それがいちいち面倒。

そんなあなたに(主に私に) "/" 以外のデリミタ。

preg_match('{^http//}', $str);


とかしてやればOK。


ただ、文字列リテラルでシングルクォーテーションを使う分にはこれで良いけど、
ダブルクォーテーションで変数を展開する場合は別な問題があったり。

例えば、

$str = "abc";
print('$str');


とすると、

$str


とそのまま出力される。

$str = "abc";
print("$str");


とすると、$str の内容が展開されて

abc


と出力される。

そんなことは知ってるよって。

じゃ、これはどうですか。

$str = "abc";
print("$strrrr");



これは abcrrr とはならず、

$strrrr


とそのまま出力される。

こんなときどうするかというと、変数部分を { } で括りますよね。

$str = "abc";
print("{$str}rrr");


これなら

abcrrr


と出力される。


さて、件の正規表現です。

$pattern = "http://";
preg_match("{$pattern}", $str);


こう書くと、おかしなことになる。

preg_match("http://", $str);


となって、デリミタが消えてしまう。

なので、やるなら

preg_match("($pattern)", $str);


という風に { } 以外のデリミタを使うか、

preg_match("{" . $pattern . "}", $str);


とかすれば確実かな、と。


これは preg_match 以外の他の正規表現関数でも同じ。


さくらインターネットは ImageMagick が使えるらしい。


ただ、そのままでは直打ちしか使えない。つまり、PHP の Imagick クラスとかは使えない。

ということで、これを使えるようにする。

さくらにSSHでログイン。

/home/(user)/ の下に適当な作業ディレクトリをつくってそこで作業する。
ここは /home/(user)/src とでもする。
※(user) はさくらのユーザ名

$ cd ~
$ mkdir src
$ cd src
$ pecl bundle imagick-3.0.0
$ cd imagick
$ phpize
$ ./configure
$ make


これで modules の下に imagick.so ができる。

PHPの拡張モジュールを配備するディレクトリをつくる。
ここは /home/(user)/local/php/ext とでもする。

$ cd ~
$ mkdir -p local/php/ext
$ cp src/imagick/modules/* local/php/ext


最後に src ディレクトリは領域が勿体無いので消しておく。
$ cd ~
$ rm -rf src


さくらのサーバコントロールパネルを開く。
左メニューの「アプリケーションの設定」の「PHP設定の編集」を開く。

そこに次の2行を書いて「保存」。

extension_dir=/home/(user)/local/php/ext
extension=imagick.so


これで phpinfo() を表示してみる。

imagick の項目が表示されればOK。

これで PHP から Imagick クラスが使えるように!
Windows7 に以下の構成でインストール。

  • PHP 5.2.6
  • MySQL 5.1.51
  • Apache 2.2

これで MDB2 等を使って MySQL にアクセスするスクリプトを動かすと、
PHP が Apache ごと落ちるという悲しい現象。
しかも必ず落ちるのではなく、落ちないこともある。(一番困るパターン!)

Apache の error.log を見ると

[Sat Oct 23 22:59:35 2010] [notice] Parent: child process exited with status 1 -- Restarting.


などという素っ気ないメッセージ。

せめて、何で死んだのか遺言なり断末魔なりを残してくれ。

PHPやMySQLを最新モジュールにしてみたり、
ApacheやPHPで余計なモジュールをロードしないようにしてみたりと、
いろいろやったんだけど、全て空振り。

で、解決策、というか、結果的にこうしたらなおった、というのが
PHP をインストールしたフォルダの下にある libmysql.dll を
C:\Windows フォルダ直下に置いたらうまく動作するようになった。

これは私の予想なのだけど、
libmysql.dll というDLLは、実は MySQL の bin フォルダにもある。
(サイズとか微妙に違うので、PHP側のとは別モノだと思われる)
そして、PHP側、MySQL側両者にはしっかりパスが通っている。
どっちが動くかがすごく曖昧な状態(先に書いてある方が動く?)。

で、PHP のやつを Windows に置いたら上手く動いたということは、
MySQL側でなく、PHP側のDLLが動作するのが正しいということっぽい。

実際、PHP の ext フォルダにある php_mysql.dllとかは
こっちと連携してるんじゃないかな?
それが、何かの間違いでMySQL側のが動いたら落ちるとか、
そういうことじゃないかな?(かなりテキトーな予想)

この理屈が正しければ、MySQL側の libmysql.dll を殺すことでも
解決するんじゃないかと思われるけど、
Windowsフォルダにコピーしたら上手く動くようになったので、
今回はとりあえずそれで良しとする。

2017年2月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28        

アーカイブ

Powered by Movable Type 5.2.10