Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Kanazawa Yuki
December 16, 2018
12k

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カンファレンス 自己紹介 4 氏名:金澤 裕毅 出身:宮城県仙台市 ランサーズSRE 略歴: 大学時代はネットワークを専攻

    Windowsパッケージ開発(C++) ASP開発(Java)&インフラ(オンプレ) SNS開発(PHP)&インフラ(オンプレ) 現在はランサーズのSRE
  2. 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 ランサーズのサーバー構成
  3. 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 メッセージサービス データ入り ランサーズの開発環境
  4. 2018/12/15 PHPカンファレンス なぜ、バージョンアップするのか? •サポート終了 ◦PHP 5.3 ▪2015/11/01 1.3.21でサポート終了 ◦CakePHP1.3 ▪2014/08/14

    5.3.29でサポート終了 •バグ修正やカスタマイズを独自に行っている状態 ◦最新バージョンであれば貢献できる内容も PHPCon福岡 で宣言 年末には5.6もサ ポート終了
  5. 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以上 なぜ、バージョンアップするのか?
  6. 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で調査
  7. 2018/12/15 PHPカンファレンス Apache + mod_php → Nginx + PHP-FPMに •PHPをバージョンアップすると、Apacheも2.2→2.4になる

    ◦Apacheの設定も作り直しが必要 ▪それなら別の構成も検討したい •Nginx + PHP-FPMを採用 ◦パフォーマンスの向上に期待していた ▪結果はレスポンス、サーバーリソース消費量もほぼ変わらず
  8. 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まで 一気にバージョンアップ 最大の難関 カスタマイズ 問題を解決
  9. 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担当 アプリ担当 →
  10. 2018/12/15 PHPカンファレンス ソースコード量 ファイル数 行数 ビュー 約2000 約16万 コントローラー 約260

    約10万 モデル 約280 約9万 バッチ 約130 約5万 UT 約500 約20万 全体 約3170 約60万
  11. 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/*
  12. 2018/12/15 PHPカンファレンス コントローラー単位でCakePHP2.8にスイッチ •app/webroot/index.php <?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; } …
  13. 2018/12/15 PHPカンファレンス コントローラー単位でCakePHP2.8にスイッチ •Lib/Cake/Cake.php <?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; } }
  14. 2018/12/15 PHPカンファレンス 同居しながら移行するデメリット •普段の開発でCakePHP1.3、2.8両方に修正が必要になる ◦Model ▪原則全ファイル同居 ◦View ▪複数Controllerで使われるファイルは同居 ◦Lib ▪namespaceを分けて同居

    •複数のModel、Controllerから呼び出される ◦etc.. ▪Config系ファイルとか •片方に寄せて呼び出す回避方法はある •一度手を出したら最後までやめられない ◦途中で投げ出したら一生両方修正することに。。
  15. 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の両方
  16. 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
  17. 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
  18. 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に変更
  19. 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関連
  20. 2018/12/15 PHPカンファレンス •CSRFエラー ◦CakePHP2.8→Cake1.3のコントローラーをまたぐPOST処理 ▪両方のコントローラー(関数)を同時に移行する必要がある •Authエラー ◦複数Submit ▪フォーム改ざんチェックの項目 •表示時のURLとPOST時のURLが一致すること ▪複数のSubmitでjsで動的にURLを書き換えていると通らない

    •確認画面で送信をしても更新されない ◦リクエストではなくセッションでデータを持ち回しているケース ▪リクエスト時は空POST •コントローラーの条件分岐で弾かれる ◦cake13の場合はTokenがPOSTに含まれていた。。 •他。。(パターンたくさん) Security Component対応
  21. 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人体制
  22. 2018/12/15 PHPカンファレンス 今後の展望 •まずはCakePHP2.8移行を終わらせる ◦最後のControllerを完了させる ▪9000ステップ ◦コントローラー移行率100%後の作業 ▪CakePHP1.3の削除 •View •Model

    •Lib他 •スイッチャーの削除 ◦CakePHP2.8ベースで動作させる ▪ディレクトリの移動 •tmp •logs •vendor •composer •webroot ◦nginxの設定変更が必要
  23. 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まで終わってから考える