$30 off During Our Annual Pro Sale. View Details »

CakePHP1.3 → CakePHP 2.8バージョンアップ

Kanazawa Yuki
December 16, 2018
11k

CakePHP1.3 → CakePHP 2.8バージョンアップ

2018/12/15 PHPカンファレンスで発表した、CakePHP1.3 → 2.8 バージョンアップに関する資料です。

Kanazawa Yuki

December 16, 2018
Tweet

Transcript

  1. 2018/12/15 PHPカンファレンス
    CakePHP1.3 → CakePHP2.8
    バージョンアップ
    https://www.lancers.jp/
    「テクノロジーで、個をエンパワーメントする」

    View Slide

  2. 2018/12/15 PHPカンファレンス
    はじめに

    View Slide

  3. 2018/12/15 PHPカンファレンス
    現在の進捗
    コントローラー移行率
    99%

    View Slide

  4. 2018/12/15 PHPカンファレンス
    自己紹介 4
    氏名:金澤 裕毅
    出身:宮城県仙台市
    ランサーズSRE
    略歴:
    大学時代はネットワークを専攻
    Windowsパッケージ開発(C++)
    ASP開発(Java)&インフラ(オンプレ)
    SNS開発(PHP)&インフラ(オンプレ)
    現在はランサーズのSRE

    View Slide

  5. 2018/12/15 PHPカンファレンス
    会社概要
    会社名:ランサーズ株式会社
    設立:2008年4月
    従業員:約170名
    事業:クラウドソーシング事業
    https://www.lancers.jp/
    所在地:
    〒150-0002
    東京都渋谷区渋谷 3-10-13
    TOKYU REIT 渋谷Rビル 9F

    View Slide

  6. 2018/12/15 PHPカンファレンス
    6
    ランサーズを支える技術

    View Slide

  7. 2018/12/15 PHPカンファレンス
    App
    S3
    ELB App
    CloudFront Cloud Search
    Route53
    EC2
    instance
    WebSocket
    ErastiCache
    Memcached
    ErastiCache
    Redis
    Aurora
    Reader
    Aurora
    Writer
    Api
    ELB Api
    EC2
    EC2
    instance
    ErastiCache
    Redis
    EC2
    EC2
    ●Amazon Linux 2017.03
    ○PHP 5.3提供の最終バージョン
    ●PHP 5.3.29
    ○CakePHP 1.3.6 → 2.8
    ○PECL
    ○PEAR
    ○Composer
    ●Webサーバー
    ○Nginx
    ●Appサーバー
    ○PHP-FPM こっちは
    Python
    ELB WebSocket
    ランサーズのサーバー構成

    View Slide

  8. 2018/12/15 PHPカンファレンス
    Docker for Mac(Windows)
    docker
    exec
    3306 9000
    Docker
    マウント
    SQLクライアント 開発環境(エディタ)
    ターミナル
    ●Docker for Mac(Windows)で構築
    ○本番環境とほぼ同じ構成をDockerコンテナで再現
    ○DockerマウントでPCとソースを共有
    ■開発はPC上のエディタで行う
    Amazon ECR
    10.10.6.11
    App
    ランサーズ本体
    10.100.106.5
    WordPress
    コーポレート、ブログ
    10.100.51.11
    MySQL
    10.100.6.131
    WebSocket
    メッセージサービス
    データ入り
    ランサーズの開発環境

    View Slide

  9. 2018/12/15 PHPカンファレンス
    バージョンアップ決定の経緯

    View Slide

  10. 2018/12/15 PHPカンファレンス
    なぜ、バージョンアップするのか?
    ●サポート終了
    ○PHP 5.3
    ■2015/11/01 1.3.21でサポート終了
    ○CakePHP1.3
    ■2014/08/14 5.3.29でサポート終了
    ●バグ修正やカスタマイズを独自に行っている状態
    ○最新バージョンであれば貢献できる内容も
    PHPCon福岡
    で宣言
    年末には5.6もサ
    ポート終了

    View Slide

  11. 2018/12/15 PHPカンファレンス
    ●サポート終了
    ○guzzleライブラリ
    ■Composer 1.7.3からインストール不可
    ○AWS SDK PHP
    ■最新バージョン(V3)はPHP5.5以上
    ●Amazon RekognitionもV3
    ○顔認証に利用したかった。。
    ○Facebook SDK
    ■最新バージョンはPHP5.4以上
    ●旧バージョンのサポート終了が早い
    ■PHP5.3サポートのfork版で対応中
    ●が、これもサポート終了
    ○手動で修正してしがみついている状態
    ○FireBase Admin SDK for PHP
    ■PHP7.0以上
    なぜ、バージョンアップするのか?

    View Slide

  12. 2018/12/15 PHPカンファレンス
    ●会社の成長フェーズの変化
    ○技術を重視した方針が採用されやすくなった
    ■2017年にバージョンアップを社外に宣言
    ○PHPコミュニティにも積極参加するようになった
    ●エンジニアに魅力のある開発環境を提供したい
    ○生産性を上げたい
    ■新しいPHPの関数が使えるようにしたい
    ■新しいPHPの仕様でコーディングしたい
    ○フリーランスが外部パートナーの開発者には死活問題
    ●常に最新の技術やバージョンに追従したい
    ○旧バージョンをカスタマイズしない
    ○最新バージョンでOSSに貢献する
    なぜ、バージョンアップするのか?

    View Slide

  13. 2018/12/15 PHPカンファレンス
    バージョンアップ計画

    View Slide

  14. 2018/12/15 PHPカンファレンス
    バージョンアップ条件の整理
    PHP
    バージョン
    PHP
    キャッシュ
    CakePHP
    対応バージョン
    Apache
    バージョン
    PHP5.3 APC CakePHP1.3
    CakePHP2
    Apache 2.2
    PHP5.4 CakePHP1.3
    CakePHP2
    Apache 2.4
    PHP5.5 OPCache
    APCu
    CakePHP1.3
    CakePHP2
    Apache 2.4
    PHP5.6 OPCache
    APCu
    CakePHP1.3
    CakePHP2
    CakePHP3
    Apache 2.4
    PHP7.0 OPCache
    APCu
    CakePHP2
    CakePHP3
    Apache 2.4
    Apacheも
    バージョン
    アップが必要
    CakePHP 1.3は
    まともに動かない
    CakePHP 3
    未サポート
    バージョンアップ
    前の構成
    json.soの
    インストールに問題
    最も対応している
    PHPバージョン
    PHPとセットで
    インストールされる
    ●Amazon Linux 2017.03で調査

    View Slide

  15. 2018/12/15 PHPカンファレンス
    Apache + mod_php → Nginx + PHP-FPMに
    ●PHPをバージョンアップすると、Apacheも2.2→2.4になる
    ○Apacheの設定も作り直しが必要
    ■それなら別の構成も検討したい
    ●Nginx + PHP-FPMを採用
    ○パフォーマンスの向上に期待していた
    ■結果はレスポンス、サーバーリソース消費量もほぼ変わらず

    View Slide

  16. 2018/12/15 PHPカンファレンス
    SREチームで提案したバージョンアップ手順
    PHP
    バージョン
    PHP
    キャッシュ
    CakePHP
    バージョン
    Webパッケージ
    バージョン(yum)
    PHP5.3 APC CakePHP1.3 Apache 2.2 + mod_php
    PHP5.3 APC CakePHP1.3 Nginx + PHP-FPM 5.3
    PHP5.6 OPCache
    APCu
    CakePHP1.3 Nginx + PHP-FPM 5.6
    PHP5.6 OPCache
    APCu
    CakePHP2 Nginx + PHP-FPM 5.6
    PHP5.6 OPCache
    APCu
    CakePHP3 Nginx + PHP-FPM 5.6
    PHP7.x OPCache
    APCu
    CakePHP3 Nginx + PHP-FPM 7.0
    Nginx + PHP-FPM
    に置き換え
    PHP 5.6まで
    一気にバージョンアップ
    最大の難関
    カスタマイズ
    問題を解決

    View Slide

  17. 2018/12/15 PHPカンファレンス
    アプリチームと相談して手順をさらに整理
    1.3 → 2.8
    2.8 → 2.x 最新
    2.x 最新 → 3.x .. more
    5.3 → 5.6
    5.6 → 7.3
    SRE担当
    アプリ担当
    SRE担当
    アプリ担当

    View Slide

  18. 2018/12/15 PHPカンファレンス
    CakePHP1.3 → CakePHP2.8
    移行計画

    View Slide

  19. 2018/12/15 PHPカンファレンス
    ソースコード量
    ファイル数 行数
    ビュー 約2000 約16万
    コントローラー 約260 約10万
    モデル 約280 約9万
    バッチ 約130 約5万
    UT 約500 約20万
    全体 約3170 約60万

    View Slide

  20. 2018/12/15 PHPカンファレンス
    バージョンアップ開始時の前提
    ●日々のサービス開発は止められない
    ○複数のチームで日々リリースされている
    ●体制
    ○専任を3人
    ●方針
    ○CakePHP2.8にアップデートしたブランチを作成
    ■動作確認しながらコントローラー単位で移行
    ●UTで互換性を保つ
    ○CakePHP 2.8 はPHPUnit
    ○CakePHP 1.3 はSimpleTest
    ■CakePHP 2.8でも動くように細工

    View Slide

  21. 2018/12/15 PHPカンファレンス
    行き詰まる
    ●毎週masterから最新を取り込み
    ○同じような修正が多くてつらい。。。
    バージョンアップのための修正よりも、日々リリースされ
    る差分吸収のコストが大きすぎて思うように進められな
    い、、、

    View Slide

  22. 2018/12/15 PHPカンファレンス
    イノベーションが起きました!
    CakePHP1.3とCakePHP2.8を
    同居させれば徐々に移行できる
    んじゃない?

    View Slide

  23. 2018/12/15 PHPカンファレンス
    CakePHP1.3 → CakePHP2.8
    同居計画

    View Slide

  24. 2018/12/15 PHPカンファレンス
    CakePHP1.3と2.8の同居準備
    CakePHP1.3
    CakePHP2.8
    ●共通ファイルCakePHP2.8側にもコピー
    ○Componet
    ○Helper
    ○View
    ●1コントローラーずつ移行
    ○移行完了したものから本番リリース

    View Slide

  25. 2018/12/15 PHPカンファレンス
    コントローラー単位でCakePHP2.8にスイッチ
    ●app/config/Letto/switch.yml
    ○ここに設定したURIはCakePHP2.8で処理する
    ---
    switched:
    cakephp28:

    - /mypage
    - /mypage/
    - /mypage/index
    - /mypage/index/*
    - /mypage/charge
    - /mypage/charge/*

    - /user/login
    - /user/login/*
    - /user/logout
    - /user/logout/*

    - /work/detail
    - /work/detail/*

    - /work/proposals
    - /work/proposals/*

    - /work/search
    - /work/search/*

    View Slide

  26. 2018/12/15 PHPカンファレンス
    コントローラー単位でCakePHP2.8にスイッチ
    ●app/webroot/index.php
    if (!defined('DS')) {
    define('DS', DIRECTORY_SEPARATOR);
    }
    if (!defined('ROOT')) {
    define('ROOT', dirname(dirname(dirname(__FILE__))));
    }
    require ROOT . '/app/vendors/composers/autoload.php’;
    // cakephp28に切り替え
    if (¥L¥Cake::isSwitched()) {
    include ROOT . '/cake28/webroot/index.php’;
    return;
    }

    View Slide

  27. 2018/12/15 PHPカンファレンス
    コントローラー単位でCakePHP2.8にスイッチ
    ●Lib/Cake/Cake.php
    namespace L;
    use ¥Letto¥Config¥Config;
    class Cake
    {
    /**
    * 切り替え済みかどうか
    * - true: 切り替え済み(cakephp28)
    * - false: まだ(cakephp13)
    *
    * @return boolean
    */
    public static function isSwitched()
    {
    $uri = $_SERVER['REQUEST_URI'];
    $list = static::loadConfig()->get('switch.switched.cakephp28', array());
    return static::_isSwitched($uri, $list);
    }

    private static function loadConfig()
    {
    $config = new Config(ROOT . '/app/config/Letto');
    $config->load('switch', 'yml');
    return $config;
    }
    }

    View Slide

  28. 2018/12/15 PHPカンファレンス
    同居しながら移行するメリット
    ●コントローラ単位でリリースが可能
    ○さらに関数単位(API単位)でもリリース可能
    ●不具合発生時のスコープを限定できる
    ○Revertもコントローラー単位で可能
    ●状況に応じて他のエンジニアにも協力を求めやすい

    View Slide

  29. 2018/12/15 PHPカンファレンス
    同居しながら移行するデメリット
    ●普段の開発でCakePHP1.3、2.8両方に修正が必要になる
    ○Model
    ■原則全ファイル同居
    ○View
    ■複数Controllerで使われるファイルは同居
    ○Lib
    ■namespaceを分けて同居
    ●複数のModel、Controllerから呼び出される
    ○etc..
    ■Config系ファイルとか
    ●片方に寄せて呼び出す回避方法はある
    ●一度手を出したら最後までやめられない
    ○途中で投げ出したら一生両方修正することに。。

    View Slide

  30. 2018/12/15 PHPカンファレンス
    バージョンアップの進め方

    View Slide

  31. 2018/12/15 PHPカンファレンス
    基本的なCakePHP1.3→2.8移行手順
    CakePHP1.3 CakePHP2.8
    $this->action $this->request->action
    $this->params['action'] $this->request->action
    $this->data $this->request->data
    $this->params['data'] $this->request->data
    $this->here $this->request->here
    $this->header $this->request->header
    $this->webroot $this->request->webroot
    $this->params['form'] $this->request->data
    $this->params['url']['url'] $this->request->url
    $this->params['url'] $this->request->query
    $this->params $this->request->params
    $this->RequestHandler->isXXX $this->request->is('xxx')
    ●ControllerとViewの両方

    View Slide

  32. 2018/12/15 PHPカンファレンス
    基本的なCakePHP1.3→2.8移行手順
    CakePHP1.3 CakePHP2.8
    public $helpers = array('Form'); 削除
    new XxxHelper() new XxxHelper(new View())
    $this->Auth->allow('*') $this->Auth->allow()
    $this->Auth->allow(array('*')) $this->Auth->allow()
    cakeError('error404') return $this->_error404()
    'order' => array('User.id DESC')
    'order' => 'User.id DESC'
    'order' => array('User.id' => 'DESC')
    App::import('Helper', 'Hoge'); App::uses(‘HogeHelper', 'View/Helper’);
    ※パスの大文字小文字に注意
    ※App::usesでレスポンス改善(遅延ローディング)
    ●Controller

    View Slide

  33. 2018/12/15 PHPカンファレンス
    基本的なCakePHP1.3→2.8移行手順
    CakePHP1.3 CakePHP2.8
    AjaxHelper、JavascriptHelper HtmlHelper、JsHelper
    XmlHelper Cake/Utility/Xml
    $html $this->Html
    $session $this->Session
    $paginator $this->Paginator
    __(‘名前’, true) __(‘名前’)
    $this->Paginator->sort(‘名前’, name) $this->Paginator->sort(name, ‘名前’)
    $this->set('title_for_layout, ...) $this->assign('title', ...)
    $this->Html->script('/js/hoge') $this->Html->script('/js/hoge.js')
    $this->Form->create(
    'User', array('action' => 'index'))
    $this->Form->create(
    'User', array('url' => 'index'));
    ※Undefined Index等のNotice ※isset等で対策
    ●View

    View Slide

  34. 2018/12/15 PHPカンファレンス
    基本的なCakePHP1.3→2.8移行手順
    ●Model、Lib、Entity等
    ○find($condition)
    ■find(‘first’, $condition)
    ○名前空間の対応
    ■CakePHP2.8側に別途namespaceを設定
    ●CakePHP 1.3:Category
    ●CakePHP 2.8:¥App¥Lib¥Entities¥Category
    ○※usesで設定しても良い
    ○EntityやServiceなどnamespaceが付いたクラス
    ■DateUtilやExceptionなどを絶対参照にする
    ■Exception → ¥Exception
    ○Modelバリデーション
    ■notEmpty→notBlankに変更

    View Slide

  35. 2018/12/15 PHPカンファレンス
    CircleCIの活用
    ●CakePHP2.8の移行ができていない箇所をCircleCIでチェック
    ○Chatworkに通知

    View Slide

  36. 2018/12/15 PHPカンファレンス
    バージョンアップ時の注意点

    View Slide

  37. 2018/12/15 PHPカンファレンス
    ●CakePHP2.8移行時の大文字移行忘れ
    ○開発環境では大文字小文字を区別しないため気づけない
    ●Dockerの共有フォルダを利用しているために起こる問題
    ○開発環境(Windows、Mac)共通の問題
    ○→AWS環境での検証まで気づかない。。。
    ●解決方法
    ○→CircleCIで検知
    $this->render('/work/detail_client');
    $this->render('/Work/detail_client');
    開発環境は
    大文字にし忘れてもエラーにならない
    大文字小文字問題

    View Slide

  38. 2018/12/15 PHPカンファレンス
    ●CakePHP1.3と2.8でCacheのキーの扱いが異なる
    ○Cache::read(‘MyThanks.000_111_user’)
    ■CakePHP1.3:’my_thanks_000_111_user’
    ■CakePHP2.8:’mythanks_000_111_user’
    ○キーをキャメルケース → スネークケースに変更して対応
    ■→これもCirceCIで検知
    キャッシュのキー問題

    View Slide

  39. 2018/12/15 PHPカンファレンス
    ●find関数の取得結果が1件もない場合
    ○CakePHP1.3 → false
    ○CakePHP2.8 → array(0)
    ○以下のコードの判定結果がtrueになってしまう
    ■if ($this->Work->find ($query)) {
    ●query関数の取得結果が1件もない場合
    ○↑と同様
    ○以下のコードの判定結果がtrueになってしまう
    ■if ($this->Work->query($updateQuery)) {
    ●tinyint(1) カラムの取得結果
    ○CakePHP1.3 → そのまま数値
    ○CakePHP2.8 → false or true
    ■処理の過程でnull or 1になることも
    ●(int)等で数値変換が必要
    ORM関連

    View Slide

  40. 2018/12/15 PHPカンファレンス
    ●find関数でcontainとfieldsを両方指定
    ○CakePHP1.3
    ■contain対象のfields指定は不要
    ●しなくてもすべてのカラムを取得
    ○CakePHP2.8
    ■contain対象にもfields指定が必要
    ●指定しないとidカラムしか取得されない
    ○※ containの指定が2階層以降だと発生する
    ■1階層なら挙動の違いはなさそう
    ORM関連

    View Slide

  41. 2018/12/15 PHPカンファレンス
    ●CSRFエラー
    ○CakePHP2.8→Cake1.3のコントローラーをまたぐPOST処理
    ■両方のコントローラー(関数)を同時に移行する必要がある
    ●Authエラー
    ○複数Submit
    ■フォーム改ざんチェックの項目
    ●表示時のURLとPOST時のURLが一致すること
    ■複数のSubmitでjsで動的にURLを書き換えていると通らない
    ●確認画面で送信をしても更新されない
    ○リクエストではなくセッションでデータを持ち回しているケース
    ■リクエスト時は空POST
    ●コントローラーの条件分岐で弾かれる
    ○cake13の場合はTokenがPOSTに含まれていた。。
    ●他。。(パターンたくさん)
    Security Component対応

    View Slide

  42. 2018/12/15 PHPカンファレンス
    長丁場を闘うために

    View Slide

  43. 2018/12/15 PHPカンファレンス
    43
    SRE専任1人
    アプリ専任3人
    次々と他PJに駆り出される
    SREチーム参戦
    新卒も巻き込み総力体制
    2017/2 プロジェクト始動
    2017/6 Nginx + PHP-FPM化
    2017/7 CakePHP1.3→2.8化開始
    2017/12 CakePHP同居体制開始
    2018/2
    2018/4
    2018/5
    2018/7 バッチ、管理画面開始
    2018/11
    2018/12
    バージョンアップチームの変遷
    SREチーム2人体制

    View Slide

  44. 2018/12/15 PHPカンファレンス
    ノウハウのシェア
    ●バージョンアップ手順、ノウハウをGitHub Wikiにまとめてシェア
    ○途中参入したエンジニアがすぐに適用できる体制にしておく

    View Slide

  45. 2018/12/15 PHPカンファレンス
    動作確認の効率化
    ●CircleCIの活用
    ○PSRチェック
    ○CakePHP2チェック
    ●Dockerの活用
    ○データ入りのMySQLコンテナで開発
    ■docker commitで現在の状態を保存
    ●データ更新後にすぐ戻せるようにしておく

    View Slide

  46. 2018/12/15 PHPカンファレンス
    ●やること
    ○不要なソースの削除
    ■使われていないファイルや関数を削除する
    ○Notice、Warning撲滅
    ●やらないこと
    ○リファクタリング
    ■どうしてもしたくなるが、敢えてやらない
    ●バージョンアップを優先
    ●レビュー負荷をできるだけ軽くする
    やること/やらないことを明確にする

    View Slide

  47. 2018/12/15 PHPカンファレンス
    動作確認の効率化
    ●ステップ実行機能の活用
    ○CakePHP1.3とCakePHP2.8の挙動を比較
    ■変数の内容をリアルタイムに確認可能
    ○設定方法
    ■PHPStorm
    ●https://qiita.com/yKanazawa/items/363ba93f8a376c5b9e75
    ■Visual Studio Code
    ●https://qiita.com/yKanazawa/items/21881b060215c01243d6

    View Slide

  48. 2018/12/15 PHPカンファレンス
    進捗の見える化
    ●移行進捗リストの作成
    ○コントローラー単位で作業者と進捗を見える化
    2018/2 2018/8 2018/11

    View Slide

  49. 2018/12/15 PHPカンファレンス
    進捗の見える化 49
    ●2018/4~2018/5
    ○SREチーム参戦~総力体制の構築
    新規開発が
    CakePHP1.3で
    行われていた

    View Slide

  50. 2018/12/15 PHPカンファレンス
    進捗の見える化 50
    ●2018/6~2018/11
    ○重いコントローラーを後回しにしていたためペースが落ちる
    99%

    View Slide

  51. 2018/12/15 PHPカンファレンス
    今後の展望

    View Slide

  52. 2018/12/15 PHPカンファレンス
    今後の展望
    ●まずはCakePHP2.8移行を終わらせる
    ○最後のControllerを完了させる
    ■9000ステップ
    ○コントローラー移行率100%後の作業
    ■CakePHP1.3の削除
    ●View
    ●Model
    ●Lib他
    ●スイッチャーの削除
    ○CakePHP2.8ベースで動作させる
    ■ディレクトリの移動
    ●tmp
    ●logs
    ●vendor
    ●composer
    ●webroot
    ○nginxの設定変更が必要

    View Slide

  53. 2018/12/15 PHPカンファレンス
    今後の展望
    ●PHP5.6化
    ○APC→OPCacheによる高速化
    ○新しい構文が使えることによる開発の高速化
    ○SDKのバージョンアップ
    ■AWS SDK V3
    ■FaceBook SDK最新版
    ●PHP7化
    ○さらなる高速化
    ○すべてのSDKが使えるようになる
    ■FireBase Admin SDKも
    ●CakePHP3化
    ○PHP 7.2 + CakePHP 2.10まで終わってから考える

    View Slide

  54. 2018/12/15 PHPカンファレンス
    最後に

    View Slide

  55. 2018/12/15 PHPカンファレンス
    エンジニア絶賛募集中!
    ●弊社HP、Wantedlyからご応募ください

    View Slide

  56. 2018/12/15 PHPカンファレンス
    ご清聴ありがとうございました!

    View Slide