PHPloy を使った FTP サーバーへのデプロイ

いろいろと FTP サーバーへのデプロイツールを探していましたが、PHPloy が今のところの使用感としては良い感じです。

https://github.com/banago/PHPloy

PHPloy は Git と連携しており、php phploy.phar deploy というコマンドを実行すると最後のコミットのワークツリーを FTP サーバーにアップロードしてくれます。最初にデプロイする場合は全てのファイルが転送され、既にデプロイをしたことがある場合は差分がアップロードされます。

デプロイ先の FTP サーバーのユーザー名やパスワードは deploy.ini に記述します。このファイルには複数のデプロイ先を記述することができ、コマンドの実行時にどの環境にデプロイするか指定できます。

また、PHPloy はディレクトリの削除に対応しています。FTP のデプロイツールは他にも dandeliongit-ftp がありますが、これらのツールはディレクトリを削除したコミットを行ったのちにそれをデプロイすると空のディレクトリが残ってしまいます。(動作確認した当時)

日本語の情報が無いようなので、追って記事化したいと思います。

qrank を WordPress から Flight に移行した

Flight への移行

qrank では WordPressフレームワークとして使っていましたが、ランキングデータの保存をすべて外部のサーバーで行うようにしたので、WordPress の役割はルーティングとビューだけになってしまいました。となると WordPress である必要はなくなったので、DB を使用しなくてもよい軽量のフレームワークを探したところ、Flight というフレームワークが見つかりました。Flight 自体が提供している機能は非常にシンプルで学習コストも低く助かりました。単純なウェブサイトを作る分には充分ではないかと思います。

Bootstrap の導入

PHPフレームワークの移行にあたり、ほとんどのコードを書き直す必要がありましたので、ついでに今更ながら Bootstrap を導入しました。Bootstrap が提供しているグリッドシステムは汎用性が高く、これだけでも利用価値はあるのではないかと思います。グリッドシステムに従っていればスマートフォンで見ても、それなりにレスポンシブにしてくれるため良いです。

結果

Flight を使ったフロントエンド側ではルーティングとビューと多少のコントローラーだけを扱えばよく、ランキングデータを提供するサーバー側と役割が分離されたためメンテナンス性が高まりました。

qrank | Qiitaの人気記事ランキング
http://qrank.wbsrv.net/

qrank の API サーバーを Serversman から ConoHa に移管した

概要

qrank はもともと WordPress で動かしていましたが、保存している記事の件数が増えてレスポンスが遅くなっていたため、記事情報の保存やランキングの計算を外部のサーバーに委ねることにしていました。そのサーバーに Serversman のメモリ 1GB のプランを使っていたのですが、記事が 7 万件ほどに到達した段階で新着記事を返すだけで約 12,800ms くらいかかるスピードになってしまいました。そこで、応急処置としてストレージが SSD になっている ConoHa に移管することに決めました。メモリは同じ 1GB のプランです。

移管の結果

移管の結果、新着記事 20 件を返すエンドポイントはレスポンスが、約 12,800ms から約 700ms に、ユーザー数のストック数ランキングの上位 100 件を返すエンドポイントは約 2,900ms から約 200ms に改善されました。サーバーの利用料金が月額 500 円から 900 円に上昇しましたが、速度の改善率を考えると充分な費用対効果はあったと思います。

qrank | Qiitaの人気記事ランキング
http://qrank.wbsrv.net/

$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib]) の意味

Serverspecのbin/serverspec-initに書かれていた一行です。

$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])

趣旨

$LOAD_PATH に実行中のファイルのディレクトリから ../lib の場所を追加する。 $LOAD_PATH に lib ディレクトリの位置を追加する。

$LOAD_PATH.unshift

unshiftメソッドは配列の先頭に引数として渡された要素を追加する。

File.join

与えられた引数をファイル区切り文字列で連結する。

File.dirname(FILE)

実行中のファイルのパスを返す。

*%w[.. lib]

%wはスペース区切りで与えられた文字列を配列に変換する。 *は配列を分解して別々の引数に変換する。

なぜ File.join で連結しているのか?

  • ファイル区切り文字の違うWindowsLinuxのどちらでも動作させるため。

日付の期間を扱いやすくする PHP ライブラリ DateRange を作りました

ある日付がある期間に含まれているかどうかやある期間とある期間が重なっているかどうかを検査したりする機能を提供するライブラリを作りました。

GitHub
https://github.com/suzuki86/DateRange

GitHub Page
http://suzuki86.github.io/DateRange/

使い方

DateRange::includes()

ある日付がある期間に含まれているかどうかを確かめます。

$dateRange = new DateRange(
  strtotime('2015-10-01'),
  strtotime('2015-10-20')
);
$result = $dateRange->includes(strtotime('2015-10-10'));

var_dump($result); // bool(true)

DateRange::overlaps()

ある期間とある期間が重なっているかどうかを確かめます。

$dateRange = new DateRange(
  strtotime('2015-10-01'),
  strtotime('2015-10-20')
);
$target = new DateRange(
  strtotime('2015-10-10'),
  strtotime('2015-10-25')
);
$result = $dateRange->overlaps($target);

var_dump($result); // bool(true)

DateRange::extract()

期間に含まれる全ての日付を返します。

$dateRange = new DateRange(
  strtotime('2015-10-01'),
  strtotime('2015-10-05')
);
$result = $dateRange->extract();

echo date('Y-m-d', $result[0]); // '2015-10-01'
echo date('Y-m-d', $result[1]); // '2015-10-02'
echo date('Y-m-d', $result[2]); // '2015-10-03'
// ...

DateRange::getOverlap()

2つの期間の重なっている日付を返します。

$dateRange = new DateRange(
  strtotime('2015-10-01'),
  strtotime('2015-10-05')
);
$target = new DateRange(
  strtotime('2015-10-03'),
  strtotime('2015-10-07')
);
$resultDateRange = $dateRange->getOverlap($target);
echo strtotime('Y-m-d', $resultDateRange->startDate); // '2015-10-03'
echo strtotime('Y-m-d', $resultDateRange->endDate); // '2015-10-05'

DateRange::merge()

2つの期間を1つの期間に結合します。

$dateRange = new DateRange(
  strtotime('2015-10-01'),
  strtotime('2015-10-05')
);
$target = new DateRange(
  strtotime('2015-10-03'),
  strtotime('2015-10-07')
);
$resultDateRange = $dateRange->merge($target);
echo strtotime('Y-m-d', $resultDateRange->startDate); // '2015-10-01'
echo strtotime('Y-m-d', $resultDateRange->endDate); // '2015-10-07'