PHP7.0にCakePHP1.3を載せるテクニック集

はじめに

こんにちは!「サグーワークス」開発チームの池添です。
昨年の話になりますが、「サグーワークス」は大規模なリニューアルを行いました。
その時にPHPのバージョンを5.3から7.0に上げたので、今回はそのことについてお話します。

PHP7.0導入の経緯

「サグーワークス」は2012年12月にサービスを開始しました。
リリースから約3年が経過した2016年。追加改修を重ねる度に煩雑な処理が増え、1つの機能を追加するのに複数の箇所を改修しなければいけない状態になっていました。
そこで、今後の成長を見据え、データの持ち方を整理し、処理をまとめることで開発スピード上げるべく1年間かけて「サグーワークス」のリニューアルを行うことを決断しました。

今回はサービス全体を改修する大規模なリニューアルとなり、このタイミングでアーキテクトを選定し直して、技術的にもリニューアルを図ることになりました。
開発チーム全員で話しあった結果、当時出たばかりの PHP7 の処理速度が速いという噂を聞いて、PHP7 を触りたい衝動に負けて PHP7 にバージョンアップすることにしました。

PHP7 に変更するにあたり、フレームワークを見直し、主要な処理は CakePHP1.3 から CakePHP3.2 に乗せ換えました。
しかし、工数との兼ね合いで一部のソースだけ CakePHP1.3 を残すことになったため、その部分を PHP7 でも動くように改修することになったんです。

PHP7 にバージョンアップするためにしたこと

まず、後方互換性がない箇所をすべてチェックしました。
具体的には、http://php.net/manual/ja/migration70.php のページに各バージョンからの互換性について掲載されていたのでそれを参考にしました。
互換性のない処理の対応をひとつずつ考えながら、まとめていきます。
また、 互換性をチェックする方法として php7cc を使いました。

ちなみに、出てきたエラーの数は 5000 個ほど。エラーの修正は2人で2週間かけて行いました。
あらかじめ修正が必要な項目とその対応方法についてまとめておいたことで、開発時に効率的に作業を進めることができてよかったです。
ただ、構文エラーは直したものの処理が誤っているものもいくつか残っていましたが、結合テスト時に気づいて直せる範囲に収めることができました。
修正した箇所としてはライブラリ内の下記のようなものが多かったです。

· 新しいオブジェクトを参照渡しで代入できない

// 修正前
$controller &= new Controller();

// 修正後
$controller = new Controller();

すべての ext/mysql 関数

// cakeのデータベース用ドライバ
// 修正前
class DATABASE_CONFIG {
var $main = array(
‘driver’ => ‘mysql’,

// 修正後
‘mysqli’,

  • オーバーライド時に親クラスと変数の数が違うと動かない
    • 公式には書いてないが、5.3 → 5.4 時に使えなくなっている!?

Parent {
public function hoge($item)
{
echo $item;
}
}
// 修正前
MyParent extends Parent {
public function hoge()
{
echo ‘hoge’;
}
}

// 修正後
MyParent extends Parent {
public function hoge($dummy)
{
echo ‘hoge’;
}
}

split が削除

// 修正前
list($a[0], $a[1], $a[2]) = split(‘, ‘, ‘A,B,C’);

// 修正後
$a = explode(‘, ‘, ‘A,B,C’);

無効なクラス名、インターフェイス名、トレイト名

// Cake1のクラス
// 修正前
String {
}

// 修正後
CakeString {
}

PHP7 にした結果

PHP7対応のための苦行改修の末、下記のメリットを得られることができました。

  • CakePHP 1.3 なのに PHP7 が動いているという感動 PHP7 ネタでブログがかけた
  • 今回のリニューアル要件に含まれていなかったロジックの流用ができて、工数の大幅削減ができた
  • Composer を導入することができた
  • PHP の処理速度が大幅に改善された(具体的には40秒以上かかっていた複雑な処理があったが、10秒を切るほどに高速に処理されるようになった)

    ※詳しく検証したわけじゃないですが、時間のかかっていた部分が大量データに対する foreach によるループ処理だったので、PHP7 でデータ構造が見直され、配列への操作が速くなったためではないかと思います

  • PHP のバージョンをあげたことによって便利な新機能が使えるようになった
  • 保守されなくなった PHP5.3 から PHP7.0 に上げたことでセキュリティ面が向上した

また、PHP7 が直接的な要因となるものではないですが下記のようなメリットもありました。

  • テストコードなど新しいものを取り入れる土壌ができた
  • 自分を含め、メンバーのモチベーションアップに繋がった
  • バージョンが新しくなったため、資料が多く今後も増えていくことが見込める

ただ、PHP7.0 に上げたことで、未知のバグやドキュメントが出そろってないこともあるかと思います。
その点は出たばかりで公式も活発なので適度にウォッチしておけばよさそうです。

まとめ

とりあえず PHP7 めっちゃ早いです。迷っているのであれば、ぜひバージョンアップをお勧めします。
また、今回のリニューアルでは定期的にバージョンをあげていくためにスケジュールを立てたり、普段から情報をチェックしておくことが重要だなと思いました。
蛇足ではありますが、PHP7.1系はCakePHP3.2 では対応していないので注意が必要です。CakePHP3.3 では対応済みなので、これから開発する方には CakePHP3.3 をお勧めします!

それでは、良い PHP7 ライフを!!

公開日: 2017/07/25