老板要俺安装个 OpenPNE , 无奈之下试验了一下。
安装完毕后发现不能上传图片, Google 了一下,找到了一个解决方案,顺便在这里记录一下。
服务器原本的PHP配置:
'./configure'发现没有安装 GD library,于是补上。当然特别要注意的是 jpeg 的支持。
'--with-mysql=/usr/local/mysql'
'--with-apxs2=/usr/local/apache2/bin/apxs'
'--with-openssl=/usr/local/ssl'
'--enable-mbstring=all'
'--enable-mbregex'
'--with-zlib'
'--with-dom'
'--with-oci8-instant-client=/usr/local/kdx/instantclient10_1'
'--enable-sigchild'
JPEG Library 的安装:
# wget http://www.ijg.org/files/jpegsrc.v6b.tar.gz这里如果忘记了 --enable-shared , 会导致 GD 在 configure 的时候找不到 jpeg library。(虽然这里不使用自己编译的 GD)
# tar -zxvf jpegsrc.v6b.tar.gz
# cd jpeg-6b
# ./configure --enable-shared
# make && make install
libpng 的安装:
# wget ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.2.10-no-config.tar.gz
# tar -zxvf libpng-1.2.10-no-config.tar.gz
# cd libpng-1.2.10
# cp ./scripts/makefile.linux .
# mv makefile.linux makefile
# make && make install
ext/gd/gd.lo(.text+0x1198): In function `zif_imagecolormatch':
/usr/local/src/php-4.4.2/ext/gd/gd.c:836: undefined reference to `gdImageColorMatch'
ext/gd/gd.lo(.text+0x2b68): In function `zif_imagerotate':
/usr/local/src/php-4.4.2/ext/gd/gd.c:1149: undefined reference to `gdImageRotate'
ext/gd/gd.lo(.text+0x5801): In function `zif_imageline':
/usr/local/src/php-4.4.2/ext/gd/gd.c:2228: undefined reference to `gdImageAALine'
ext/gd/gd.lo(.text+0x6874): In function `zif_imageellipse':
/usr/local/src/php-4.4.2/ext/gd/gd.c:2367: undefined reference to `gdImageEllipse'
ext/gd/gd.lo(.text+0x9795): In function `zif_imageantialias':
/usr/local/src/php-4.4.2/ext/gd/gd.c:3904: undefined reference to `gdImageAntialias'
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1
然后重新编译一下PHP,其实只要加上一个
--with-gd \
--with-jpeg-dir \
--with-png-dir 就OK了。
注意:
PHP编译中,如果使用 --with-gd 将编译 php 自带的 GD library,从而得到以下结果

添加了 --with-jpeg-dir --with-png-dir 后的 phpinfo()

OpenPNE で画像アップ成功
結局、PHP が標準で JPEG をサポートしていなかっただけで・・・
[OpenPNE]
一切、画像がアップ出来ない状況だったので調査&対応しました。画像のアップロードで実行される do.php から呼ばれている webapp/lib/t_framework/module_execute.php の中を見て、どこで落ちてしまうのかをチェック。どうも、画像をアップすると lib/tejimaya/db_common.php からの結果が返ってこない様子。
そこで、今度は db_common.php の中の関数をチェック。その中の t_check_image_format 関数の中で呼ばれている imagecreatefromjpeg 関数が反応しないことをやっと突き止めた。何せ、PHP のソースをこんなに真面目に読んだのも初めてなので、ここまでで半日を費やしました。(^^; とほほほ・・・(Perl なら 15分で済んでそうな内容だ・・・(^^;)で、imagecreatefromjpeg 関数。
この関数は GD ライブラリを使うようなので、phpinfo() で gd の状況をチェックしてみると、GIF Read Support、GIF Create Support、PNG Support は enabled なのに、JPEG ファイルに関しては何の表示も無し・・・。試しに GIF ファイルや PNG ファイルをアップしてみると無事アップ出来た。JPEG だけ駄目なのね。とほほほ・・・ググってみると、今時の PHP は JPEG を標準サポートしていないようです。何でですかねぇ???Windows BMP ファイルは標準サポートのようなので、いったい何を考えているのやら・・・です。
ちなみに OpenPNE を動かしている FreeBSD 機には、ちゃんと Jpeglib がインストールされています。
/var/db/pkg/jpeg-6b_3/+CONTENTS を見ると、/usr/local 以下にインストールされていることが判ります。確かに、/usr/local/lib/libjpeg.a が存在しています。
そこで、-with-jpeg-dir=/usr/local オプションをつけて PHP の再 make をすることになります・・・やれやれ。(^^;ということで、
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pgsql --enable-mbstring --enable-mbregex --with-dom --with-zlib-dir=/usr/local/include --with-iconv=/usr/local --with-gd --enable-zend-multibyte --with-mysql=/usr/local/lib/mysql --with-jpeg-dir=/usr/local
というオプション付きで PHP を configure し、改めて make, make install したところ、gd 情報に JPG Support enabled が追加され、無事、JPEG 画像をアップ出来るようになりました。やれやれ・・・いやぁ、でも、こうやって異常原因を見ていくと、けっこう言語仕様がわかってきて良いという面もあります。漠然とソースを眺めていても身には付きませんから。
しかし、何せ PHP のステートメントもよく知らないし、当然 PHP 用の統合開発環境のようなものも持ってませんから、状況調べるのに、ソース内に、
@$file = fopen('/tmp/pne_debug_log', "a");
fputs($file, 'm=' . $_REQUEST['m'] . "\n");
fclose($file);
みたいなログ吐く処理を埋め込みまくるという原始的な方法でデバッグしました。(^^;
他人に見られると格好悪いので、そろそろ Eclipse の PHP プラグインなんか試してみようかな・・・と思う今日この頃。(でも、一人でやってると秀丸エディタとかでぱぱっと作るのが一番楽なんだよね)
评论 (1 条)
kaugummi
2006年06月22日 12:39
发表于 2006 年 06 月 22 日 12:39
你好,我也在玩OpenPNE,可以交流一下,hehe...