先日 PHP を 5.2 にバージョンアップを実行して使用していたのですが、pearのパッケージもカレンダーパッケージをインストールをしようとしたところ正常に実行することが出来ませんでした。
# pear install Calendar-beta WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update Did not download optional dependencies: pear/Date, use --alldeps to download automatically pear/Calendar requires PEAR Installer (version >= 1.5.0), installed version is 1.4.9 pear/Calendar can optionally use package "pear/Date" No valid packages found install failed |
どうやら、PEARのバージョン自体が低いようです。
1.5.0以降でないとインストール出来ないとのことなので早速アップグレードを実行。
# pear upgrade PEAR WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update pear/PEAR dependency package "pear/Console_Getopt" downloaded version 1.3.1 is not the recommended version 1.2.3, but may be compatible, use --force to install pear/Archive_Tar requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9 pear/Console_Getopt requires PEAR Installer (version >= 1.8.0), installed version is 1.4.9 No valid packages found upgrade failed |
ぬう・・・これもバージョンアップが出来ないようです。
しかも、今度は1.5.4以降、さらには1.8.0以降でないと 駄目とか言ってきます。
とりあえず、1.5.4にアップデートをさせようと PEAR のバージョンを 1.5.4 を指定して直接アップデートをかけてみます。
# pear upgrade PEAR-1.5.4 WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update Did not download optional dependencies: pear/XML_RPC, use --alldeps to download automatically pear/PEAR dependency package "pear/Console_Getopt" downloaded version 1.3.1 is not the recommended version 1.2.2, but may be compatible, use --force to install pear/Console_Getopt requires PEAR Installer (version >= 1.8.0), installed version is 1.4.9 downloading Archive_Tar-1.3.2.tgz ... Starting to download Archive_Tar-1.3.2.tgz (17,150 bytes) ......done: 17,150 bytes upgrade ok: channel://pear.php.net/Archive_Tar-1.3.2 |
おっと、どうやら動きがあったようです。
しかし、それでも 1.8.0 の PEAR を要求してきます。
それではと、1.8.0を指定。
# pear upgrade PEAR-1.8.0 WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update pear/PEAR dependency package "pear/Archive_Tar" installed version 1.3.8 is not the recommended version 1.3.3, but may be compatible, use --force to install pear/PEAR dependency package "pear/Console_Getopt" downloaded version 1.3.1 is not the recommended version 1.2.3, but may be compatible, use --force to install pear/Archive_Tar requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9 pear/Console_Getopt requires PEAR Installer (version >= 1.8.0), installed version is 1.4.9 No valid packages found upgrade failed |
ありゃ、 1.5.4 を再度要求されました。
やはり 1.5.4 自体が正常にインストールが出来ていないようです。
これではインストール出来ないループになってしまっていますのでここから打開策を見つけないといけません。
再度 1.5.4 のインストールを敢行すると表記が変わっていました。
# pear upgrade PEAR-1.5.4 WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update pear/PEAR dependency package "pear/Console_Getopt" downloaded version 1.3.1 is not the recommended version 1.2.2, but may be compatible, use --force to install pear/Console_Getopt requires PEAR Installer (version >= 1.8.0), installed version is 1.4.9 No valid packages found upgrade failed |
use –force to install つまり、強制インストールをしろと言うことらしいです。
その前にチャンネルを更新しろというワーニングが出ているのでそれを改善してみようと実行するも・・・
# pear update-channels HTTP error, got response: HTTP/1.1 410 Gone Didn't receive 200 OK from remote server. (HTTP/1.1 410 Gone) |
すがすがしいぐらいに即答されました
強制インストールしてもあまり正常に動作した経験が少ないので気が進まないのですが、このままだと手詰まりなので渋々実行。
# pear upgrade --force PEAR-1.5.4 WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update Did not download optional dependencies: pear/XML_RPC, use --alldeps to download automatically warning: pear/PEAR dependency package "pear/Console_Getopt" downloaded version 1.3.1 is not the recommended version 1.2.2 warning: pear/Console_Getopt requires PEAR Installer (version >= 1.8.0), installed version is 1.4.9 downloading PEAR-1.5.4.tgz ... Starting to download PEAR-1.5.4.tgz (293,070 bytes) .............................................................done: 293,070 bytes downloading Console_Getopt-1.3.1.tgz ... Starting to download Console_Getopt-1.3.1.tgz (4,471 bytes) ...done: 4,471 bytes upgrade ok: channel://pear.php.net/Console_Getopt-1.3.1 upgrade ok: channel://pear.php.net/PEAR-1.5.4 PEAR: Optional feature webinstaller available (PEAR's web-based installer) PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer) PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer) To install use "pear install pear/PEAR#featurename" |
どうやら無事、 1.5.4 へのアップグレードは出来ました。
では、続いて最新版へのバージョンアップを実行してみます。
# pear upgrade PEAR WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update downloading PEAR-1.9.4.tgz ... Starting to download PEAR-1.9.4.tgz (296,332 bytes) .............................................................done: 296,332 bytes downloading Archive_Tar-1.3.8.tgz ... Starting to download Archive_Tar-1.3.8.tgz (17,995 bytes) ...done: 17,995 bytes upgrade ok: channel://pear.php.net/Archive_Tar-1.3.8 upgrade ok: channel://pear.php.net/PEAR-1.9.4 PEAR: Optional feature webinstaller available (PEAR's web-based installer) PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer) PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer) To install use "pear install pear/PEAR#featurename" |
こちらも無事通りました。
強制実行もたまには良い結果をもたらすようです。
先ほど実行できなかったチャンネルのアップデートです。
# pear update-channels Updating channel "doc.php.net" Update of Channel "doc.php.net" succeeded Updating channel "pear.php.net" Update of Channel "pear.php.net" succeeded Updating channel "pecl.php.net" Channel "pecl.php.net" is up to date |
今度はきっちりアップデートを実行してくれました。
PEARのバージョンが低かったのがすべての元凶みたいですね。
最後に目的だったカレンダーモジュールを入れます。
# pear install Calendar-beta WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update downloading Calendar-0.5.5.tgz ... Starting to download Calendar-0.5.5.tgz (58,159 bytes) ..............done: 58,159 bytes install ok: channel://pear.php.net/Calendar-0.5.5 |
はい、こちらもすんなりとインストールすることが出来ました。
たまにpearのメンテナンスもしてあげないとアップデートが非常に面倒になったりするようです。
バージョンアップは定期的に
CentOS などの Linux で、PHP5.2にバージョンアップさせるときyumではアップグレードできるリポジトリが無いためそのままでバージョンアップすることが出来ません。
最近は、phpMyAadminなどでも普通にPHP 5.2 以上を要求してくるようになってきたので 5.2 を比較的容易にバージョンアップさせてみることにしました。
PHP 5.2をインストールするためには c5-testing のリポジトリを追加させます。
# cd /etc/yum.repos.d # wget https://dev.centos.org/centos/5/CentOS-Testing.repo --2011-12-02 15:56:37-- https://dev.centos.org/centos/5/CentOS-Testing.repo Resolving dev.centos.org... 204.15.73.242 Connecting to dev.centos.org|204.15.73.242|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 710 [text/plain] Saving to: `CentOS-Testing.repo' 100%[================================================>] 710 --.-K/s in 0s 2011-12-02 15:56:37 (67.7 MB/s) - `CentOS-Testing.repo' saved [710/710] |
これでリポジトリを取得できました。
次にリポジトリのプリオリティを設定する必要があります。
# vi /etc/yum.repos.d/CentOS-Testing.repo [c5-testing] name=CentOS-5 Testing baseurl=https://dev.centos.org/centos/$releasever/testing/$basearch/ enabled=0 gpgcheck=1 gpgkey=https://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing # CentOS-Testing: # !!!! CAUTION !!!! # This repository is a proving grounds for packages on their way to CentOSPlus and CentOS # They may or may not replace core CentOS packages, and are not guaranteed to function pro # These packages build and install, but are waiting for feedback from testers as to # functionality and stability. Packages in this repository will come and go during the # development period, so it should not be left enabled or used on production systems witho # consideration. |
このファイルにプリオリティ設定を追加します。
gpgkey の次の行に 「 priority=1 」を追加します。
gpgcheck=1 gpgkey=https://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing priority=1 # CentOS-Testing: # !!!! CAUTION !!!! |
上記のような感じで追加すればOKです。
これで、アップデートの指定が可能になりました。
yum でのアップデートの指定は
# yum --enablerepo=c5-testing update php |
でアップデートが実行されます。
依存性などが発生しなければこれで完了出来るはずです。
Smarty を利用してPHPのプログラムを開発していくことが多いのですが最近新しくサーバーを立ち上げてみました。
PHPや、ライブラリ系、MySQLなどのデータベース系などを刷新して、新しいリリースバージョン を使ってのサーバー構築です。
新しいバージョンでの構築は今までの処理系を見直す良いチャンスだと思います。
さて、そんなこんなでさくさくと設定を進めていたのですが最終段階のWEBシステムをアップロードしてシステムの稼働チェックをした際に見慣れないエラーが発生しました。
Fatal error: Uncaught exception 'SmartyException' with message 'PHP5 requires you to call __construct() instead of Smarty()' in /usr/include/php/include/Smarty/sysplugins/smarty_internal_templatebase.php:755 |
PHPのクラス定義などの仕様変更などもあって、今までの呼び出し方ではよろしくない様子。
下記は修正前のクラス定義の例文です。
require('Smarty/Smarty.class.php'); class Smarty_PICMO extends Smarty { function Smarty_PICMO() { $this->Smarty(); $this->template_dir = '任意のパス'; $this->compile_dir = '任意のパス'; $this->config_dir = '任意のパス'; $this->cache_dir = '任意のパス'; } } |
下記のように変更する必要があります。
require('Smarty/Smarty.class.php'); class Smarty_PICMO extends Smarty { function __construct() { parent::__construct(); $this->template_dir = '任意のパス'; $this->compile_dir = '任意のパス'; $this->config_dir = '任意のパス'; $this->cache_dir = '任意のパス'; } } |
組み上がったプログラムがバージョンアップによって動かなくなるとかなり背筋が凍る思いをしますが・・・
幸いこの程度の修正で済んでよかったと喜ぶべきだと思います。
僕の作ったプログラムはテンプレート呼び出し位置をセレクターで切り替えていたので全ソース書き換えになりましたが
サーバーのクリーンインストールして、当サーバーは構築してきましたがどうやらPHPにGDモジュールが組み込まれていないことが発覚しました。^^;;
必要なモジュールを次々とインストールさせていきましたがGDは直接動作に必要なく気がつくまでに時間がかかってのではないかと。
とりあえず、入れないことにはWordPressで画像の縮尺やCAPTCHが使えない。
インストールまでの記録を記述していきます。
サーバーの状態
- CentOS 5.6
- PHP 5.2.16
- 64bit Operating System
現状
# yum install php-gd Loaded plugins: fastestmirror, priorities Loading mirror speeds from cached hostfile * base: rsync.atworks.co.jp * extras: rsync.atworks.co.jp * rpmforge: fr2.rpmfind.net * updates: rsync.atworks.co.jp 72 packages excluded due to repository priority protections Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package php-gd.x86_64 0:5.1.6-27.el5_5.3 set to be updated --> Processing Dependency: php-common = 5.1.6-27.el5_5.3 for package: php-gd --> Finished Dependency Resolution php-gd-5.1.6-27.el5_5.3.x86_64 from base has depsolving problems --> Missing Dependency: php-common = 5.1.6-27.el5_5.3 is needed by package php-gd-5.1.6-27.el5_5.3.x86_64 (base) Error: Missing Dependency: php-common = 5.1.6-27.el5_5.3 is needed by package php-gd-5.1.6-27.el5_5.3.x86_64 (base) You could try using --skip-broken to work around the problem You could try running: package-cleanup --problems package-cleanup --dupes rpm -Va --nofiles --nodigest |
これと同様の現象と戦ったブログはこちらです。
ワン!ワワン!ニャ~!
こちらの方は、一度 php-common を yum remove させる方法をとっておられます。
作事を実行しようとすると依存関係のための下記のような削除プログラムがでます。
==================================================================================================================== Package Arch Version Repository Size ==================================================================================================================== Removing: php-common x86_64 5.2.16-jason.1 installed 1.6 M Removing for dependencies: mod_suphp x86_64 0.7.1-1.el5.rf installed 2.1 M php x86_64 5.2.16-jason.1 installed 11 M php-cli x86_64 5.2.16-jason.1 installed 6.6 M php-devel x86_64 5.2.16-jason.1 installed 2.7 M php-ldap x86_64 5.2.16-jason.1 installed 136 k php-mbstring x86_64 5.2.16-jason.1 installed 3.0 M php-mcrypt x86_64 5.2.16-jason.1 installed 110 k php-mysql x86_64 5.2.16-jason.1 installed 733 k php-pdo x86_64 5.2.16-jason.1 installed 408 k php-pear noarch 1:1.9.1-1.jason.1 installed 2.1 M Transaction Summary ==================================================================================================================== Remove 11 Package(s) Reinstall 0 Package(s) Downgrade 0 Package(s) |
最悪この方法でも良いのですが、これは最終手段として別の方法を模索したいと思います。
試行錯誤
僕の取った解決方は、GD自体はすでにyumで入っていますので残りはphp-GDモジュールのみ。
これだけ何とかすればいいので、rpmパッケージで直接GDモジュールを組み込めないかとかをトライしてみました。
rpm パッケージを探してきて、rpm -ivh で実行するも案の定依存性エラー
そりゃ、yumとやっていることは一緒ですからエラーが帰ってくるのはあたりまえですね。
ちょっと期待していたのが、–force と –nodeps オプション
–force 強制的にインストールを実行する
–nodeps 依存性を無視してインストール
まず、forceの結果はインストール自体が上手くいきませんでした^^;;
nodepsはインストール自体は無事に完了できます。
php.iniにextention=gd.soでモジュールを指定して、apacheを再起動すると、モジュール読み込みエラーがログに出力されます orz
依存性もなにも、php-common自体はすでに導入済みのハズなのでこれで行けそうなもんですがそんな単純な問題ではないようです。
解決方
さすがにコレは出来るだろうと思って最後まで暖めていたのが、ソースコードからのコンパイルインストール。
結論から言ってこれは上手くいきました。
まずは、環境が整っているかを確認します。
# gdlib-config --version 2.0.33 # php -v 5.2.16 # locate libjpeg /usr/lib/libjpeg.so.62 /usr/lib/libjpeg.so.62.0.0 /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/libjpeg.so /usr/lib64/libjpeg.so /usr/lib64/libjpeg.so.62 /usr/lib64/libjpeg.so.62.0.0 ~省略~ # locate libpng/usr/lib/libpng.so.3 /usr/lib/libpng.so.3.10.0 /usr/lib/libpng12.so.0 /usr/lib/libpng12.so.0.10.0 /usr/lib64/libpng.a /usr/lib64/libpng.so /usr/lib64/libpng.so.3 /usr/lib64/libpng.so.3.10.0 /usr/lib64/libpng12.a /usr/lib64/libpng12.so /usr/lib64/libpng12.so.0 /usr/lib64/libpng12.so.0.10.0 |
上記ですべてそろっていることが確認出来ました。
libjpeg と libpng はyumでインストール出来るので入っていない場合はインストールしておきます。
続いてインストールされているphpと同一のバージョンのソースコードを取ってきます。
php-gdモジュールのソースコードはphpの言語ソースコードに同梱されています。
phpの各バージョンはこちらからダウンロードできます。
https://www.php.net/downloads.php
僕のサーバーにはいっているphpのバージョンは 5.2.16 ですので同じバージョンのソースコードをダウンロード、展開します。
GDモジュールのソースコードはext/gdの中に入っています。
# tar zxvf php-5.2.16.tar.gz # cd php-5.2.16/ext/gd # phpize Configuring for: PHP Api Version: 20041225 Zend Module Api No: 20060613 Zend Extension Api No: 220060519 aclocal # ./configure ~中略~ checking for the location of libjpeg... no checking for the location of libpng... no checking for the location of libz... no checking for the location of libXpm... no checking for FreeType 1.x support... no checking for FreeType 2... no checking for T1lib support... no checking whether to enable truetype string function in GD... no checking whether to enable JIS-mapped Japanese font support in GD... no checking for fabsf... no checking for floorf... no If configure fails try --with-jpeg-dir=<DIR> configure: error: libpng.(a|so) not found. |
なにおっ
さきほどlibpngの存在を確認下にもかかわらず、libpngが見つからないというエラー。
今度は明示的にconfigureにディレクトリを指定してあげることにします。
./configure --enable-gd-native-ttf --enable-gd-jis-conv --enable-shared --wi th-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/usr --with-xpm-dir=/u sr --with-ttf=/usr --with-freetype-dir=/usr --with-t1lib=/usr ~中略~ checking for gawk... gawk checking for GD support... yes, shared checking for the location of libjpeg... /usr checking for the location of libpng... /usr checking for the location of libz... /usr checking for the location of libXpm... /usr checking for FreeType 1.x support... /usr checking for FreeType 2... /usr checking for T1lib support... /usr checking whether to enable truetype string function in GD... yes checking whether to enable JIS-mapped Japanese font support in GD... yes configure: error: libjpeg.(a|so) not found. |
orz
libpngは無事認識した物のこんどはlibjpegですか、そうですかそうですか。
ディレクトリを指定して、pngは認識してjpegが認識しない・・・
この違いはどこだろうと考えたところ、libにlibjpeg.soが入っていないw
単純に64bit OSなので、libではなく、lib64を見に行かなければなりません。
32bit OSでしたら、おそらくこの問題に引っかからずに無事configureが通ったのではないかと。
では、configure にlibではなくlib64を見に行く指定を追加します。
–with-libdir=lib64
がそれにあたります。
# ./configure --with-libdir=lib64 --enable-gd-native-ttf --enable-gd-jis-conv --enable-shared --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/u sr --with-xpm-dir=/usr --with-ttf=/usr --with-freetype-dir=/usr --with-t1lib=/usr ~中略~ checking whether to enable truetype string function in GD... yes checking whether to enable JIS-mapped Japanese font support in GD... yes checking for jpeg_read_header in -ljpeg... yes checking for png_write_image in -lpng... yes checking for XpmFreeXpmImage in -lXpm... yes checking for FT_New_Face in -lfreetype... yes checking for FreeType 1 support... no - FreeType 2.x is to be used instead configure: error: Your t1lib distribution is not installed correctly. Please reinstall it. |
お・・・
またエラーです。
t1libが入っていないか再インストールとのことなので・・・
# yum install t1lib.x86_64 t1lib-devel.x86_64 |
でインストール
再度configureを実行させます。
# ./configure --with-libdir=lib64 --enable-gd-native-ttf --enable-gd-jis-conv --enable-shared --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/u sr --with-xpm-dir=/usr --with-ttf=/usr --with-freetype-dir=/usr --with-t1lib=/usr ~中略~ checking dynamic linker characteristics... GNU/Linux ld.so checking how to hardcode library paths into programs... immediate configure: creating ./config.status config.status: creating config.h |
やったー!
無事configureが実行されました。
続いて
# make ---------------------------------------------------------------------- Libraries have been installed in: /home/admin/src/php/php-5.2.16/ext/gd/modules If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,--rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- Build complete. Don't forget to run 'make test'. # make install |
無事、makeもmake installも通りました。
これでphpの所定の位置にモジュールが出力されているハズですので・・・
php.iniのextentionの書かれているあたりに下記を追加します。
extension=gd.so
で、apacheを再起動させログを確認。。。
エラー無し。
では、phpinfoで確認
ジャッジャーン
無事、GDモジュールが認識いたしました。
結構大変な作業でした。
よほどな理由がなければ、やはりyumでphp-commonをremoveさせてから再インストールさせたほうが簡単で早いと思います。