今日、PHPのライブラリ(geo-timezone)を使って、緯度経度からTimezoneを拾えるようにしました。
かなりニッチな内容なので、あまり多くの人に役に立たないかもしれませんが、
自分がまた同じことをやる時に、手順を覚えている自信がゼロだったので記録を残します。
また、ライブラリがDebian系での利用が想定されているようで、そこでも少し躓いたのでポイントをメモします。
まず、composerでrequire
お決まりの作業です。
composer require minube/geo-timezone
次に、vendor配下のライブラリディレクトリ内で複数の作業
vendor/minube/geo-timezone/bin
に行きます。
そこで、 compile-geos.sh
を実行すれば良い、というので、
実行するも何かがうまくいかなくてしばし悩みました。
ふとshの中身を読んでみると、
apt-get install php7.0-dev && ....
などと書かれていて、Debian系向けとわかり、躓きポイント判明。
apt-getしようとしているphp7.0-dev
からphp7.0-mbstring
までをyumすると良いかと思いますが、
自分の環境では既に導入済みなのでパスすることに。
curl -s -O http://download.osgeo.org/geos/geos-3.6.1.tar.bz2
の行からを実行すると、無事installが進みました。
その次の
git clone https://git.osgeo.org/gogs/geos/php-geos.git
も実行して、無事install終了(っぽい)。
.soファイルを.iniファイルで読み込ませる?
README.md
には.soファイルを.iniファイルで読み込ませるべし、と書いてあるのですが、
自分の環境では不要でした。
動いたし、ま、いっかということで。
データベース作成コードを走らせてみる
Githubのリポジトリページにある解説文の通り、
UpdaterData()というメソッドを走らせてみましたが、なぜか途中で止まる🤔
ini_set('memory_limit', '-1');
を設定してやると無事進みました。
自分は今、少し懐かしいVagrant環境でこの作業を実行しているのですが、
「メモリがexhausted!」と怒られるので、潔くメモリリミット撤廃。
ローカルなんでキニシナイ。
で、最終的に、以下のようなコードを書き、CLIから直接PHPコマンドで叩きました。
use GeoTimeZone\UpdaterData;
include_once ('../../vendor/autoload.php');
ini_set('memory_limit', '-1');
$updater = new UpdaterData("./data/");
$updater->updateData();
READMEには「終わるまで2~3時間かかるよ」なんて恐ろしいことが書いてあります。
「マジかよ」と呟きながら、シューシュー言うCPUの音を聞きながら、この備忘録を書いています。
終わりに
このライブラリ、元はnode-geo-tzとか、timezone-boundary-builderがベースになっていて、PHP向けにwrapperを作ってくださった様子。 素晴らしい。
これで(きっと)無事、世界のTimezoneを、サマータイムとか歴史的経緯とか国内に複数Zoneを持つ状況とか気にせず、しっかり取得できそうです。
数々のcontributorの皆様、ありがとう!
あとは、DBの完成を待つばかり...
(最新版のDBを時々作り替える必要があるよ、とか恐ろしいことが書いてあるけど、見なかったことにしたい)