本記事では,WCAデータベースをサーバまたはローカルに自動的に定期更新する方法を説明します.
前の記事でBigDumpを用いて手動で簡単に高速にインポートできることを紹介しました. 本記事はその続きです.
前回の内容では,SQLファイル(WCA_export.sql)は自分で用意する必要がありました.
今回は自動で定期的にアップデートをチェックし,インポートします.
前回のむすびでBigDumpを用いて自動更新すると書きましたが,今回はBigDumpは使いません.
system関数でmysqlコマンドを直接呼んでしまいます.
一部レンタルサーバ等ではsystemやexec関数等が制限されていると思うので,そのような環境では別の方法を試してください.
system関数等が制限される場合はBigDumpを使って,php等からBigDumpのURL叩けばいい感じにできるのではないでしょうか.試してないのでうまくいくかわかりませんが.
私はシェルスクリプトが苦手なので今回は全部phpで書きました.
シェルスクリプトで直接コマンド列並べた方がすっきりすると思います.
作成したファイルはgistにアップしてあります.
2015年1月17日 追記
致命的なバグではないが修正しました.
ダウンロードしたファイルとかをカレントディレクトリにばらまいてたので,このファイルが存在するディレクトリで収まるように.
カレントディレクトリで実行すれば問題ないんだけどね.Cronとかだと問題出るので.
詳細は,GistのRevisionsを見てください.
2016年6月21日 追記
リポジトリ化しました。最新のスクリプトコードはこのリポジトリに更新しています。
kotarot/wca-importer
対象とするデータベースはMySQLです.
ちなみにphpのバージョンは5.3.3です.
Zipを解凍するため,ZipArchiveクラスを使用します.
phpinfoでzipが使用可能か確認します.
全体的なフローを説明します.以下に処理のメイン部分を抜き出します.
1) find_latest_export関数で最新のデータベースファイル(SQLファイル)名を取得します.
ここは,Webページをスクレイピングして正規表現でマッチさせて取得しています.
どうにもファイル名の規則性がよくわかりません.
2) get_last_imported関数で一番最近インポートしたときのSQLファイル名を取得します.
“last”というファイルを作成してそこに名前を保存してあるだけです.
3) 最新版のデータベースとローカル(またはサーバ)上のデータベースが違っていれば,更新されていますので,アップデート処理をします.
download_sql関数とimport_sql関数で,SQLファイルをダウンロードして,データベースにインポートします.
SQLファイルは20MBぐらいありますが,私の環境では,30秒程で処理は完了します.
これで,無事データベースが最新版に更新されます.
以上,ざっくりと全体的なフローを説明しました.
詳細部分については説明を省略します.
このファイルをcronで動かしましょう.
頻度は1日1回で十分だと思います.
データベースの更新は基本的にヨーロッパタイムが基準となることを考慮に入れるといいと思います.
以上,WCAデータベースを自動的に定期更新する方法を説明しました.
エラー処理とかかなり適当ですけど最低限動作するものになったと思います.
次回は,Speedcubing Advent Calendar 2014 – Adventar 用に,データベースの活用方法を紹介したいと思います.