AjaxZip2.0のjsonファイルをPHPで圧縮管理する

2月 18th, 2009 admin Posted in PHP |

Webのフォームで郵便番号から住所を自動入力するJavaScriptで
AjaxZip 2.0 - Ajax郵便番号→住所自動入力フォーム(CGI不要版)
というのがあって、以下点が気に入っているのでよく使わせていただいています。

・JavaScriptだけで動作(CGI・DB不要)
・さまざまな住所入力フォームに対応(都道府県がセレクトボックスとか郵便番号が2分割型など)

これのすごいのはCGIとDBを不要にするために郵便番号データを、あらかじめ約1000個のjson形式のファイルにするという斬新な方法が使われているということで、これを初めて見た時はその発想にとても感動しました。

大抵の場合はそのまま設置して使うのですが、約1000個というjsonファイルの管理が面倒なので、今回PHPを使って別の方法を探してみました(CGI不要の意味はなくなりますね)

今回やりたかったこと

・約1000個のファイルを扱わないようにしたい
・そのためならPHPなどを使っても良い
・そのためなら多少遅くなっても良い
・ただしDBは使いたくない
・AjaxZip2.0のフロント部分はそのまま使いたい

方法

(1)jsonファイルをZIPで一つにする
(2)zip-xxx.jsonに来たGETリクエストをPHPに転送(mod_rewrite)
(3)ZIPの中から必要なファイルだけ展開して返す

手順

(1)ajaxzip2をダウンロードしてくる
(2)展開してできたdata以下の.jsonファイルをallzip.zipという名前で保存
(3)mod_rewrite用の.htaccessをつくりdataに入れる

CODE:
  1. RewriteEngine On
  2. RewriteRule ^zip-([0-9]+)\.json$ ajaxzip2.php?zip=$1 [L]

(4)ajaxzip2.phpという名前でPHPも作ってdataにいれる

PHP:
  1. <?php
  2. define("ALL_ZIP_FILE", "./allzip.zip");
  3.  
  4. if(!isset($_GET['zip']) || !preg_match("/[0-9]{3}/",$_GET['zip'])){
  5.   exit;
  6. }
  7.  
  8. $zip = $_GET['zip'];
  9. $za = new ZipArchive();
  10. $za->open(ALL_ZIP_FILE);
  11. $json = $za->getFromName('zip-' . $zip .'.json');
  12. $za->close();
  13.  
  14. header("Content-Type: text/javascript; charset=utf-8");
  15. echo $json;
  16. ?>

(5)data以下はajaxzip2.phpと.htaccessとallzip.zipだけにする
(6)完成

ダウンロード

data(1,550KB)

まとめ

・1000個のファイルを扱わなくていいようになった
・jsonは約9Mあったのが、圧縮することで1.6Mぐらいになるという嬉しい副作用
・必要なファイルだけ解凍するのでメモリも食わない
・スピードも実用レベル
・AjaxZip2は超便利 Kawa.net様に感謝

Leave a Reply