XAMPP に含まれる Apache,MySQL,PHP のバージョンの遷移

  以下の情報は古いものです。最新の情報は、[2007-11-04-1] XAMPP に含まれる Apache,MySQL,PHP のバージョンの遷移にあります。




  約一年ぶりに調査.

XAMPP      リリース日 Apache 2.x MySQL 4.x MySQL 5.x PHP 4.x    PHP 5.x
0.9        2003-07-22 2.0.47      4.0.14                4.3.3 rc2
1.0        2003-09-03 2.0.47      4.0.14                4.3.3     
1.1        2003-10-13 2.0.47      4.0.16                4.3.3     
1.2        2003-11-04 2.0.48      4.0.16                4.3.4     
1.3        2004-02-10 2.0.49      4.0.18                4.3.6     
1.4        2004-03-25 2.0.49      4.0.18                4.3.4     
1.4.2      2004-04-06 2.0.49      4.0.18                4.3.6     
1.4.3      2004-06-12 2.0.49      4.0.20a               4.3.7     
1.4.4      2004-07-03 2.0.50      4.0.20                4.3.7     
1.4.5      2004-07-14 2.0.50      4.0.20                4.3.8      5.0.0
1.4.6      2004-08-16 2.0.50      4.0.20                4.3.8      5.0.1
1.4.7      2004-09-18 2.0.51      4.0.21                4.3.8      5.0.1
1.4.8      2004-09-25 2.0.51      4.0.21                4.3.9      5.0.2
1.4.9      2004-10-02 2.0.52      4.0.21                4.3.9      5.0.2
1.4.10     2004-12-05 2.0.52      4.1.7                 4.3.9      5.0.2
1.4.11     2004-12-25 2.0.52      4.1.8                 4.3.10     5.0.3
1.4.12     2005-02-20 2.0.53      4.1.9                 4.3.10     5.0.3
1.4.13     2005-04-10 2.0.54      4.1.11                4.3.11     5.0.4
1.4.14     2005-06-19 2.0.54      4.1.12                4.3.11     5.0.4
1.4.15     2005-08-14 2.0.54      4.1.13                4.4.0      5.0.4
1.4.16     2005-10-03 2.0.54      4.1.14                4.4.0      5.0.5
1.5.0      2005-11-06 2.0.55                 5.0.15     4.4.1      5.0.5
1.5.0-pl1 2006-01-08 2.0.55                 5.0.15     4.4.1-pl1 5.0.5
1.5.1      2006-01-08 2.2.0                  5.0.18     4.4.1-pl1 5.1.1
1.5.2      2006-04-26 2.2.0                  5.0.20     4.4.2-pl1 5.1.2
1.5.3      2006-05-28 2.2.2                  5.0.21     4.4.2-pl1 5.1.4
1.5.4      2006-09-10 2.2.3                  5.0.24a    4.4.4      5.1.6
1.5.4a     2006-10-04 2.2.3                  5.0.24a    4.4.4      5.1.6
                                                                    
最新版                 2.2.3       4.1.21     5.0.26     4.4.4      5.1.6


  最新版は,2006-10-22 での各プロダクトの最新バージョン.
  調査対象は XAMPP for Windows.

- XAMPP
  http://sourceforge.net/projects/xampp/
  http://www.apachefriends.org/en/xampp.html

都道府県を扱う Perl モジュール Geography::JapanesePrefectures を PHP に移植してみた

<?php
class Geography_JapanesePrefectures
{
    var $_prefectures = array(
        array('id' => 1,  'name' => '北海道',   'region' => '北海道'),
        array('id' => 2,  'name' => '青森県',   'region' =>   '東北'),
        array('id' => 3,  'name' => '岩手県',   'region' =>   '東北'),
        array('id' => 4,  'name' => '宮城県',   'region' =>   '東北'),
        array('id' => 5,  'name' => '秋田県',   'region' =>   '東北'),
        array('id' => 6,  'name' => '山形県',   'region' =>   '東北'),
        array('id' => 7,  'name' => '福島県',   'region' =>   '東北'),
        array('id' => 8,  'name' => '茨城県',   'region' =>   '関東'),
        array('id' => 9,  'name' => '栃木県',   'region' =>   '関東'),
        array('id' => 10, 'name' => '群馬県',   'region' =>   '関東'),
        array('id' => 11, 'name' => '埼玉県',   'region' =>   '関東'),
        array('id' => 12, 'name' => '千葉県',   'region' =>   '関東'),
        array('id' => 13, 'name' => '東京都',   'region' =>   '関東'),
        array('id' => 14, 'name' => '神奈川県', 'region' =>   '関東'),
        array('id' => 15, 'name' => '新潟県',   'region' =>   '信越'),
        array('id' => 16, 'name' => '富山県',   'region' =>   '北陸'),
        array('id' => 17, 'name' => '石川県',   'region' =>   '北陸'),
        array('id' => 18, 'name' => '福井県',   'region' =>   '北陸'),
        array('id' => 19, 'name' => '山梨県',   'region' =>   '関東'), // 信越の場合も
        array('id' => 20, 'name' => '長野県',   'region' =>   '信越'),
        array('id' => 21, 'name' => '岐阜県',   'region' =>   '東海'),
        array('id' => 22, 'name' => '静岡県',   'region' =>   '東海'),
        array('id' => 23, 'name' => '愛知県',   'region' =>   '東海'),
        array('id' => 24, 'name' => '三重県',   'region' =>   '東海'), // 近畿の場合も
        array('id' => 25, 'name' => '滋賀県',   'region' =>   '近畿'),
        array('id' => 26, 'name' => '京都府',   'region' =>   '近畿'),
        array('id' => 27, 'name' => '大阪府',   'region' =>   '近畿'),
        array('id' => 28, 'name' => '兵庫県',   'region' =>   '近畿'),
        array('id' => 29, 'name' => '奈良県',   'region' =>   '近畿'),
        array('id' => 30, 'name' => '和歌山県', 'region' =>   '近畿'),
        array('id' => 31, 'name' => '鳥取県',   'region' =>   '中国'),
        array('id' => 32, 'name' => '島根県',   'region' =>   '中国'),
        array('id' => 33, 'name' => '岡山県',   'region' =>   '中国'),
        array('id' => 34, 'name' => '広島県',   'region' =>   '中国'),
        array('id' => 35, 'name' => '山口県',   'region' =>   '中国'),
        array('id' => 36, 'name' => '徳島県',   'region' =>   '四国'),
        array('id' => 37, 'name' => '香川県',   'region' =>   '四国'),
        array('id' => 38, 'name' => '愛媛県',   'region' =>   '四国'),
        array('id' => 39, 'name' => '高知県',   'region' =>   '四国'),
        array('id' => 40, 'name' => '福岡県',   'region' =>   '九州'),
        array('id' => 41, 'name' => '佐賀県',   'region' =>   '九州'),
        array('id' => 42, 'name' => '長崎県',   'region' =>   '九州'),
        array('id' => 43, 'name' => '熊本県',   'region' =>   '九州'),
        array('id' => 44, 'name' => '大分県',   'region' =>   '九州'),
        array('id' => 45, 'name' => '宮崎県',   'region' =>   '九州'),
        array('id' => 46, 'name' => '鹿児島県', 'region' =>   '九州'),
        array('id' => 47, 'name' => '沖縄県',   'region' =>   '沖縄'),
    );

    function prefectures()
    {
        return array_map(create_function('$p', 'return $p["name"];'), $this->_prefectures);
    }

    function regions()
    {
        return array_merge(array_unique(array_map(create_function('$p', 'return $p["region"];'), $this->_prefectures)));
    }

    function prefectures_in($region)
    {
        $pref = array_filter($this->_prefectures, create_function('$p', "return (\$p['region'] == '$region');"));
        return array_merge(array_map(create_function('$p', 'return $p["name"];'), $pref));
    }

    function prefectures_id($prefecture)
    {
        foreach ($this->_prefectures as $pref) {
            if ($pref['name'] == $prefecture) {
                return $pref['id'];
            }
        }
    }
}
?>


- 使い方

<?php
require_once 'Geography_JapanesePrefectures.php';

$geo = new Geography_JapanesePrefectures;
print_r($geo->prefectures());
// -> array(北海道, 青森県, 岩手県, ..., 鹿児島県, 沖縄県)

print_r($geo->regions());
// -> array(北海道, 東北, 関東, ..., 九州, 沖縄)

print_r($geo->prefectures_in('関東'));
// -> array(茨城県, 栃木県, 群馬県, 埼玉県, 千葉県, 東京都, 神奈川県, 山梨県)

print_r($geo->prefectures_id('東京都'));
// -> 13
?>


  山梨県は関東なのかとか,三重県は東海なのかだとかこの辺りはいろいろあるらしいけど,オリジナルに合わせてあります.
  全体的に create_function() 使いすぎてキモイことになっていまが,あまり気にしないでください.
  特に,prefectures_in() のキモさはどうにかしたいところであります.

- Geography::JapanesePrefectures
  http://search.cpan.org/~tokuhirom/Geography-JapanesePrefectures/lib/Geogra ...

- via: オレンジニュース
  http://secure.ddo.jp/~kaku/tdiary/20060915.html#p09

最新 LL フレームワークエクスプローラ 5 大フレームワーク徹底攻略

  477412818X
  http://www.amazon.co.jp/o/ASIN/477412818X/todaysnonsenc-22/ref=nosim/
  Software Design 編集部
  技術評論社
  ISBN: 477412818X
  2006/7/7
  1,974 円

Lightweight Language の初学者を対象に、Ruby On Rails、Maple、Ethna、TurboGears、Catalyst の 5 大フレームワークを徹底解説する。

  ということで,以下の 5 つのフレームワークの特集らしい.

- via: www.textfile.org
  http://d.hatena.ne.jp/textfile/20060707/fw

続・MySQL 4.1.x な環境で phpMyAdmin を EUC-JP で使う方法

  [2006-06-17-1] MySQL 4.1.x な環境で phpMyAdmin を EUC-JP で使う方法 の続き.
  よく考えたら,PHP の設定を変えてあげれば何も問題なくできた.なんてこった.

- phpMyAdmin/.htaccess

php_value mbstring.internal_encoding "UTF-8"
php_value mbstring.http_output       "UTF-8"
php_value mbstring.script_encoding   "UTF-8"
php_value mbstring.http_input        "UTF-8"

PHP Hacks - プロが教えるWebプログラミングテクニック

  4873112915
  http://www.amazon.co.jp/o/ASIN/4873112915/todaysnonsenc-22/ref=nosim/
  Jack D. Herrington (著), 牧野 聡 (訳)
  オライリー・ジャパン
  ISBN: 4873112915
  2006/06/23
  3,780 円

- 目次
  http://www.oreilly.co.jp/books/4873112915/toc.html

  『PHP デスクトップリファレンス』『入門 PHP セキュリティ』 に続く,O'REILLY から久しぶりの PHP 本は,Hacks シリーズの『PHP Hacks』.

DHTML や Ajax に関する Hack から、コードや Flash ムービーの自動生成、さらにはデータベースと連携したメッセージキューの実現までさまざまな Hack を紹介

(http://www.oreilly.co.jp/books/4873112915/)

  ちょっと期待できそう.ちなみに原著は以下のもの.

- PHP Hacks (Hacks)
  0596101392
  http://www.amazon.co.jp/o/ASIN/0596101392/todaysnonsenc-22/ref=nosim/
  Jack D. Herrington (著)
  Oreilly & Associates Inc
  ISBN: 0596101392
  2005/12
  3,054 円

MySQL 4.1.x な環境で phpMyAdmin を EUC-JP で使う方法

  MySQL 4.1.x から文字コード関係のトラブルが多いみたい.
  phpMyAdmin を使ってみたら,EUC-JP に設定して,phpMyAdmin の言語を「日本語 - Japanese (euc)」にしても,
  画面は文字化けするし,「MySQL の文字セット」も UTF-8 Unicode (utf8) のままで,データの挿入などが行えない.

  そこで,ちょっと強引に,phpMyAdmin のファイルを書き換えることにする.

- phpMyAdmin/libraries/database_interface.lib.php

function PMA_DBI_postConnect($link, $is_controluser = false)
        :
    /*
    if (PMA_MYSQL_INT_VERSION >= 40100) {
        :
    } else {
        require_once('./libraries/charset_conversion.lib.php');
    }
    */
    require_once('./libraries/charset_conversion.lib.php');
}


  MySQL 4.1 の if 文をごっそりコメントアウトして,./libraries/charset_conversion.lib.php を強制的に読み込ませるようにする.

  phpMyAdmin の言語を「日本語 - Japanese (euc)」にすると「MySQL の文字セット」が「 EUC-JP Japanese (ujis)」になって,
  データの挿入も問題なく行えるようになった.

  ちなみに,config.inc.php の言語関係の設定は以下のようにした.

$cfg['DefaultLang'] = 'ja-euc';
$cfg['DefaultConnectionCollation'] = 'ujis_japanese_ci';
$cfg['DefaultCharset'] = 'ja-euc';


  なお,phpMyAdmin 2.8.0 から設定ファイルの雛形の場所が変更された.
  phpMyAdmin/libraries/config.default.php にあるので,これを phpMyAdmin/config.inc.php にコピーして使うことになる.
  こうすることで,phpMyAdmin 2.8.0 から新しく導入された (分かりにくい) setup.php を使わないで設定ができる.

- 追記

$cfg['Lang'] = 'ja';


  を指定すれば,行けるらしいという情報を頂いたが,Notice が発生してだめですね.

Notice: Undefined index: ja-euc

  ja-euc にしても同じ結果に.

  スマートな方法はないものでしょうか.

- 解決
  [2006-06-26-2] 続・MySQL 4.1.x な環境で phpMyAdmin を EUC-JP で使う方法

PHP で UTF-8 に付いている BOM を削除する方法

  UTF-8 に BOM (Byte Order Mark) が付くのが良いのか,悪いのかは分からないけど,問題が多そうな気がする.
  Windows に付いているメモ帳はご丁寧に BOM をつけてくる.

- When a BOM is used, is it only in 16-bit Unicode text?
  http://www.unicode.org/unicode/faq/utf_bom.html#25

  上記の記事によると,ファイルの先頭 3 バイトに EF BB BF があれば,UTF-8 に付く BOM らしいので,これを判別して削除する方法.

function delete_bom($str)
{
    if (ord($str{0}) == 0xef && ord($str{1}) == 0xbb && ord($str{2}) == 0xbf) {
        $str = substr($str, 3);
    }
    return $str;
}


  とりあえずこれで OK.

Customizing XOOPS 自由にデザイン・自在に Hack

  4839917795
  http://www.amazon.co.jp/o/ASIN/4839917795/todaysnonsenc-22/ref=nosim/
  GIJOE (著), matchan (著)
  毎日コミュニケーションズ
  ISBN: 4839917795
  2005/04
  3,150 円

リバースプロキシを使って複数のバージョンの PHP,MySQL,Apache を共存させる方法

  PHP 3.x と PHP 4.x は --enable-versioning を configure オプションに加えるだけで,何も考えずに共存できました.
  ただ,PHP 5.x になってから PHP 4.x と共存するのは難しくなっています.

  サーバが一台しかないテスト環境などでは,これでは困る場合もあるわけです.

  そこで,Apache のリバースプロキシを使って複数のバージョンの PHP を共存させます.
  ついでに,複数の MySQL も共存させることにします.

  検証環境は Solaris 10 です.

  今回は php5.example.com にクライアントからアクセスがあったら

- Apache 2.2.2
- PHP 5.1.4
- MySQL 4.1.19

  の環境で動かすとこと,また,php4.example.com にクライアントからアクセスがあったら

- Apache 1.3.36
- PHP 4.2.2
- MySQL 3.23.58

  で動かすということにします.
  MySQL 3.23.58 という古い環境を使うのは,この環境が必要だからなので,適時違うバージョンに読み替えていただけるといいです.

  図にすると以下のようになります.

  共存

  まず,php4.example.com の環境から作ります.インストールはすべてソースから行っています.
  configure のオプションは最低限しかつけていないので,適時環境に合わせてオプションを設定してください.

- Apache 1.3.36

% ./configure --enable-module=most \
              --enable-shared=max
% make
# make install

  でインストールします.ServerRoot は /usr/local/apache になります.
  主な設定は,以下のようですが,ポイントはこの Apache はポート 81 番で動かすことです.

Listen 81
Port 80
ServerName php4.example.com


  Apache 1.3.x の場合は Listen ディレクティブが指定されている場合は,Port ディレクティブはサーバが listen するポートには影響しません.
  ただし,ここで 80 と指定するのは,サーバが自分自身を参照する URL を生成する時に Port ディレクティブを参照するからです.

  この設定をしないで Port 81 などとしてしまうと,http://php4.example.com/foo のように URL の最後に / を付け忘れた場合,サーバは,

http://php4.example.com:81/foo/

  このようににリダイレクト先を返してくるので,リダイレクトの処理がうまくいかないことになります.

- Listen ディレクティブ
  http://httpd.apache.org/docs/1.3/mod/core.html#listen

- Port ディレクティブ
  http://httpd.apache.org/docs/1.3/mod/core.html#port

  また,Apache 2.x の場合は,Port ディレクディブは ServerName ディレクティブに吸収されたので

Listen 81
ServerName php4.example.com:80


  のように指定してあげればいいと思います.

- MySQL 3.23.58

% ./configure --prefix=/usr/local/mysql/3.23
% make
# make install
# ln -s /usr/local/mysql/3.23/bin/mysql /usr/local/bin/mysql3

  MySQL のインストールのポイントは,prefix を /usr/local/mysql/3.23 のようにバージョンをつけていることです.
  これで,他のバージョンをインストールする場合は,/usr/local/mysql/x.x のように分けることができます.
  設定ファイルは,/usr/local/mysql/3.23/var/my.cnf に置くことができます.

  最後に,シンボリックリンクを張っているのは,mysql3 と楽にコマンドを打てるようにです.

- PHP 4.4.2

% ./configure --prefix=/usr/local/php/4.4 \
              --with-apxs=/usr/local/apache/bin/apxs \
              --with-mysql=/usr/local/mysql/3.23
% make
# make install
# ln -s /usr/local/php/4.4/bin/php /usr/local/bin/php4

  PHP も MySQL と同じように prefix をバージョンごとに指定しています.
  使用する MySQL のパスも忘れずに指定します.
  シンボリックリンクも MySQL と同じ理由で /usr/local/bin に張ることにします.

  この場合,php.ini は /usr/local/php/4.4/lib/php.ini になります.

  これで,まず一つ目の環境が完成です.


  次に二つ目の環境を作ります.

- Apache 2.2.2

% ./configure --enable-mods-shared=all \
              --enable-proxy
% make
# make install

  Apache 2.2.2 はこのようにインストールします.ServerRoot は /usr/local/apache2 になります.
  リバースプロキシを利用するので --enable-proxy が必要になります.
  もし,また違うバージョンの Apache が必要な場合は prefix で適当なパスを指定すればいいです.

  設定のポイントは,まずこの Apache はポート 80 番で動かすことです.

Listen 80
ServerName php5.example.com:80


  そして,重要なのは,名前ベースのバーチャルホストとリバースプロキシの設定をすることです.

NameVirtualHost *

<VirtualHost *>
    ServerName php5.example.com
</VirtualHost>

<VirtualHost *>
    ProxyPreserveHost On
    ProxyPass         / http://localhost:81/
    ProxyPassReverse  / http://localhost:81/
    ServerName        php4.example.com
</VirtualHost>


  これで,php5.example.com でアクセスされた場合は,Apache 2.x が処理をして,
  php4.example.com でアクセスされた場合は 81 番ポートで動いている Apache 1.x にわたして処理をさせることができます.

- MySQL 4.1.19

% ./configure --prefix=/usr/local/mysql/4.1 \
              --with-unix-socket-path=/tmp/mysql-4.1.sock \
              --with-tcp-port=3308
% make
# make install
# ln -s /usr/local/mysql/4.1/bin/mysql /usr/local/bin/mysql4

  MySQL のインストールのポイントは,3.23.58 と同様に prefix にバージョンをつけていることです.
  また,UNIX Socket のファイルも /tmp/mysql-4.1.sock のように変更していて,ポート番号も 3308 に変更しています.
  設定ファイルは /usr/local/mysql/4.1/var/my.cnf になります.
  mysql4 としてシンボリックリンクも張っています.

- PHP 5.1.4

% ./configure --prefix=/usr/local/php/5.1 \
              --with-apxs2=/usr/local/apache2/bin/apxs \
              --with-mysql=/usr/local/mysql/4.1 \
              --with-pdo-mysql=/usr/local/mysql/4.1 \
% make
# make install
# ln -s /usr/local/php/5.1/bin/php /usr/local/bin/php5

  これまでと同様に prefix にバージョンに指定しています.
  使用する MySQL のパスも忘れずに指定します.シンボリックリンクも張っています.
  php.ini は /usr/local/php/5.1/lib/php.ini になります.


  テストするためにわざわざ DNS に登録する必要はなく,hosts ファイルに書いてしまえばいいです.
  例えば,サーバの IP アドレスが 192.168.1.2 ならば,クライアントの hosts ファイルに

192.168.1.2    php4.example.com    php5.example.com

  このように書いてあげればすぐ使えるようになります.


  以上のようにして,PHP,MySQL の複数のバージョンが共存する環境を手に入れることができます.
  ちょっと面倒ですが,ひとつのサーバしかなくて困っている場合は有効な手段だと思います.

- <VirtualHost> ディレクティブ
  http://httpd.apache.org/docs/2.2/ja/mod/core.html#virtualhost

- バーチャルホストの例 - Apache HTTP サーバ
  http://httpd.apache.org/docs/2.2/ja/vhosts/examples.html

php extension な Smarty ライクのテンプレートエンジン Simplate

  http://simplate.aimy.jp/index.php?Simplate

  php の extension なので高速に動作するらしい.インストール方法がどこに書いてあるかわからないので,とりあえずメモ.
  というか通常の php extension とインストール方法は同じ.

- インストール方法 (autoconf が必要)

% phpize
% ./configure --enable-simplate
% make
# make install

- 設定
  インストールすると simplate.so が

/usr/local/lib/php/extensions/no-debug-non-zts-20050922/simplate.so

  にコピーされた.あとは php.ini にこれを書くだけ.

extension = /usr/local/php/extensions/no-debug-non-zts-20050922/simplate.so

  または,コマンドラインの PHP で警告が出る場合は,以下のようにすればいい (mod_php からも使える).

extension_dir = ""
extension = simplate.so

  あとは,Apache を再起動してみる.とりあえず,phpinfo() で simplate が見えていれば大丈夫だと思う.

  simplate

  ちなみにコマンドラインから確認する場合は m オプションをつければいい.

% php -m

- 使い方
  Smarty ライクということだけあって使い方は Smarty と同じ.

$simplate = new simplate();
$simplate->assign('foo', 'bar');
$simplate->display('template.tpl');


  デモを見る限り,テンプレート側では section などの組み込み関数も使えるっぽい.