phpfarmを使って複数バージョンのPHPをインストール

先日 LL を複数入れる話をまとめて、なんで PHP にないんだよという話を書いたらツッコミをいただきました。その名も phpfarm なんと本家にありました^^;

使い方

必要なものは

  • フツーにコンパイルできる環境
  • Subversion
  • bash

です。以下のように使います。

$ svn co http://svn.php.net/repository/pear/ci/phpfarm/trunk/ phpfarm
$ cd phpfarm/src
$ ./compile.sh 入れたいバージョン

なんて簡単。

やってくれること

  1. source の取得、展開、コンパイル
  2. コンパイルオプションを設定する方法
    • 基本は options.sh で、バージョン毎に cutstom-options-{version}.sh を用意すればよい
  3. 指定のディレクトリへの CLI SAPI バイナリへの link の集約
  4. カスタム php.ini を準備する方法
    • 基本は custom-php.php で、同様に custom-php-{version}.ini を用意

やってくれないこと

rvm と違ってできないことがたくさんあります。

  1. インストール可能なバージョンの確認
  2. インストール済みバイナリを切り替えて指定のバージョンを起動する
  3. httpd.conf 周り

特に 3 が面倒になるかなぁという感じですね。

一応 CLI バイナリは一カ所に集まっているので SAPI によらず動かせるコードを書くようにしていれば、複数バージョンでのテストなどもなんとか動かせそうに思います。

Apache の mod_php については 複数の mod_php を LoadModule するのはできないような気がするので、仮想マシンを PHP の数だけ立てるような感じにするか、いちいち httpd.conf を書き換えて Apache を再起動する切り替えツールを自前で書くしかないんじゃないでしょうか。他の LL に比べるとだいぶ面倒な感じになりますね。

※ ちなみに自分が以前 PHP 4 から 5 への移行を行った際は複数のサーバを立てて NFS でコードを共有して1 テストしました。その都度再起動しないのであれば OS 丸ごと増やすのが楽なのかなと思います。

入れ終わった様子

phpfarm ROOT
|-- inst
|   |-- bin
|   |   |-- php-4.4.9        -> ../inst/php-4.4.9/bin/php
|   |   |-- php-5.3.3        -> ../inst/php-5.3.3/bin/php
|   |   |-- php-cgi-5.3.3    -> ../inst/php-5.3.3/bin/php-cgi
|   |   |-- php-config-5.3.3 -> ../inst/php-5.3.3/bin/php-config
|   |   |-- phpize-5.3.3     -> ../inst/php-5.3.3/bin/phpize
|   |   `-- pyrus-5.3.3      -> ../inst/php-5.3.3/bin/pyrus
|   |-- php-4.4.9
|   |   |-- bin
|   |   |-- include
|   |   |-- lib
|   |   `-- man
|   `-- php-5.3.3
|       |-- bin
|       |-- include
|       |-- lib
|       |-- man
|       `-- pear
`-- src
    |-- bzips
    |-- php-4.4.9
    `-- php-5.3.3

これで、phpfarm の inst/bin に PATH が通っていれば一応複数バージョンを使い分けることができる道理です。

pear, pecl 周り

pear ついては make で入れる方法が提供されるような雰囲気のファイルが src/php-{version}/pear 以下にあるのですが、Makefile がないので機能しません。手で適当に go-pear で入れるのが正解のようです。

試しに上の状態で 4.4.9 用と 5.3.3 用に pear を入れてみましたが、4.4.9 は pear list を出すだけでなんかすごい量のエラーのような警告のようなメッセージが出て、5.3.3 は go-pear でのインストールの段階で大量の deprecated の警告が出ます。

なんというか、pear, pecl までこなれていないうえに、PHP の過渡期っぷりを感じてしまいます。5.1, 5.2 辺りでお茶を濁すならわざわざ自分でコンパイルしなくても各種ディストリビューションのバイナリパッケージ使った方が簡単ですしねぇ。うーん、どうしたものやら。

まとめ

クセがつかめれば、できることは制限されますが OS 丸ごと増やすよりはまだ楽かもしれません。とは言え今ある phpfarm の sh script だけだと不便なのは間違いないので、自分用のツールを書き足す工夫は必要かと思います。

自分の場合はやっぱり Ruby で phpfarm wrapper 作るべきなんでしょうかねぇ。

  1. キャッシュやセッションなどはもちろん共有しない 

More

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Dev Jekyll