ランサーズ PHP5.6 バージョンアップへの道

ランサーズ PHP5.6 バージョンアップへの道

2019/03/20にコネヒトさんで開催されたPHP勉強会
https://connehito.connpass.com/event/122217/
で発表した、PHP5.3 → 5.6 バージョンアップに関する資料です。

652359244199b2b5108a5e09c027e0da?s=128

Kanazawa Yuki

March 20, 2019
Tweet

Transcript

  1. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 ランサーズ PHP5.6 バージョンアップへの道 https://www.lancers.jp/ 「テクノロジーで、個をエンパワーメントする」

    いまさら
  2. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 はじめに

  3. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 自己紹介 3 氏名:金澤 裕毅 出身:宮城県仙台市

    ランサーズSRE 略歴: 大学時代はネットワークを専攻 Windowsパッケージ開発(C++) ASP開発(Java)&インフラ(オンプレ) SNS開発(PHP)&インフラ(オンプレ) 現在はランサーズのSRE
  4. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 会社概要 会社名:ランサーズ株式会社 設立:2008年4月 従業員:約170名 事業:クラウドソーシング事業

    https://www.lancers.jp/ 所在地: 〒150-0002 東京都渋谷区渋谷 3-10-13 TOKYU REIT 渋谷Rビル 9F
  5. 2018/3/20 Connehito Marché vol.5 〜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 ランサーズのサーバー構成
  6. 2018/3/20 Connehito Marché vol.5 〜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 メッセージサービス データ入り ランサーズの開発環境
  7. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 バージョンアップ決定の経緯

  8. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 旧PHP、CakePHPのサポート終了 •サポート終了 ◦PHP 5.3 ▪2015/11/01

    5.3.29でサポート終了 ◦PHP 5.6 ▪2018/12/06 5.6.39でサポート終了 ◦CakePHP1.3 ▪2014/08/14 1.3.21でサポート終了 バージョンアップ 開始 昨年末には5.6も サポート終了 2019/1/10に 5.6.40リリース 5.3サポート終了
  9. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 •AWS SDK PHP ◦V1はV1.6.2でサポート終了 ◦V2は2019/6/24にS3サポート終了予定

    ◦V3はPHP5.5以上が必要 •guzzleライブラリ ◦AWS SDKに必要 ◦Composer 1.7.3からインストール不可 ◦※現在はguzzlehttpライブラリになっている •Facebook SDK ◦最新バージョンはPHP5.4以上が必要 ◦PHP5.3サポートのfork版を利用中 ▪これも更新が止まっている •手動で修正してしがみついている状態 関連ライブラリのサポート終了 2019/6までに PHP5.6化必須
  10. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 バージョンアップ計画 1.3 → 2.8 2.8

    → 2.10 2.x 最新 → 3.x .. more 5.3 → 5.6 5.6 → 7.x 最新 → 2017/6完了 2019/2完了 イマココ PHP5.6に必須 CakePHP2.10に必須 PHP7に必須
  11. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6 バージョンアップ準備

  12. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 Unit Testの整備 •CakePHP1.3時代(SimpleTest) ◦膨大にある ◦テストコードの出来が良くない

    ▪前のテストで使った変数を次のテストで使いまわし •冪等性に問題 ◦全実行時間:約23時間 ▪テストの度にFixtureで全テーブル構築 ◦メンテナンスされずに放置 ▪全てのテストが正常終了しない状態 •CakePHP2.8化後(PHPUnit) ◦CakePHP2.8用に新規作成したテストのみ実行 ▪常に全てのテストが正常終了するように維持 ◦CakePHP1.3のテストは一旦破棄 ▪別の場所に退避 ▪修正の度にサルベージしてCakePHP2.8用に再実装 ◦全実行時間:現在約30秒 ▪これから増えていく予定
  13. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 CircleCIの整備 •CakePHP2.8移行直後 ◦公式のPHPコンテナを利用 ◦チェック内容 ▪シンタックスチェック

    •php -l ▪PSRチェック •PHP CodeSniffer ▪CakePHP2.8チェック •オリジナル •現在 ◦開発環境と同じコンテナを利用 ▪AWS ECRから取得 ◦チェック内容 ▪シンタックスチェック ▪PSRチェック •PHP-CS-Fixer ◦PHP5.6チェック ▪CakePHP2.8チェック ▪UnitTestの実行 Amazon ECR App ランサーズ本体 MySQL Developer Webhook commit
  14. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PSRチェックの更新 •PHP-CS-Fixerを利用 ◦.php_cs ◦NGの場合はSlackで通知 <?php

    $finder = PhpCsFixer¥Finder::create() ->notName('.php_cs') ->notName('*.html') ->notName('*.md') ->notName('*.rb') ->notName('*.sh') ->notName('*.xml') ->exclude('tmp') ->in(__DIR__); return PhpCsFixer¥Config::create() ->setRules(array( '@PSR2' => true, '@PHP56Migration' => true, // 'cast_spaces' => array('space' => 'none'), // PHP CS Fixer 2.2.20 では設定不可 // 'combine_consecutive_issets' => true, // PHP CS Fixer 2.2.20 では設定不可 'combine_consecutive_unsets' => true, // 'ereg_to_preg' => true, // PHP 5.6対応後に設定 'no_empty_comment' => true, 'no_empty_phpdoc' => true, 'no_whitespace_before_comma_in_array' => true, 'whitespace_after_comma_in_array' => true, 'braces' => array() )) ->setUsingCache(false) ->setFinder($finder); PHP5.6チェック PHP5.6後に 設定予定
  15. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 UnitTestの実行 •開発環境のコンテナを取得 ◦Appコンテナ ◦MySQLコンテナ ▪データ入り

    •全テストを実行 ◦実行時間:現在約30秒 ◦NGの場合はSlackで通知 Amazon ECR App ランサーズ本体 MySQL
  16. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PEARライブラリのコード管理 •2019/1にpear.php.netがサイト停止 ◦数週間アクセスできない状態だった ◦http://pear.php.net を使わない体制にしたい

    •pear installをやめる ◦/usr/share/pear にインストールされる ▪OSレベルでの管理になってしまう •PEARライブラリをコード管理可能な状態にする ◦Crypt Browfish ▪Composer管理に移行 ▪※PHP7では使えないので移行が必要 ◦Math Stats ▪Vendorディレクトリに移動 ▪※PHP7.2非推奨関数(each)を使用している
  17. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6 バージョンアップ

  18. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 以前PHP5.6を試したとき(CakePHP1.3時代) 2017/06/08 01:38:06 [error] 12029#0:

    *87 FastCGI sent in stderr: "PHP message: PHP Strict Standards: Non-static method Configure::getInstance() should not be called statically in /var/www/lancers/cake/bootstrap.php on line 38 PHP message: PHP Strict Standards: Non-static method CakeLog::handleError() should not be called statically in /var/www/lancers/cake/libs/cake_log.php on line 290 PHP message: PHP Strict Standards: Non-static method CakeLog::handleError() should not be called statically in /var/www/lancers/cake/libs/debugger.php on line 707" while reading response header from upstream, client: 172.17.0.5, server: dev.lancers.jp, request: "GET /user/login?1496853486&ref=header_menu HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "dev.lancers.jp", referrer: http://dev.lancers.jp/ PHP message: PHP Warning: curl_setopt() expects parameter 2 to be long, string given in /var/www/lancers/app/vendors/AmazonSDK/lib/requestcore/requestcore.class.php on line 610 [08-Jun-2017 01:44:52] WARNING: [pool www] child 13007 said into stderr: "NOTICE: PHP message: PHP Strict Standards: Non-static method CakeLog::handleError() should not be called statically in /var/www/lancers/cake/libs/cake_log.php on line 290" [08-Jun-2017 01:44:52] WARNING: [pool www] child 13007 said into stderr: "NOTICE: PHP message: PHP Strict Standards: Non-static method CakeLog::handleError() should not be called statically in /var/www/lancers/cake/libs/debugger.php on line 707" [08-Jun-2017 01:44:52] WARNING: [pool www] child 13006 said into stderr: "NOTICE: PHP message: PHP Strict Standards: Non-static method Configure::getInstance() should not be called statically in /var/www/lancers/cake/bootstrap.php on line 38" •表向きは問題なく表示 ◦debugレベル0の場合 •エラーログにWarningが多発 ◦CakePHP1.3関連 ◦AWS SDK v1関連 •Nginxのエラーログ •PHP-FPMのエラーログ
  19. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 AWS SDK PHPのバージョンアップ •CakePHP2.8移行完了直後 ◦AWS

    SDK PHP v1 ▪Vendorディレクトリ ▪S3アップロード関連に利用 ◦AWS SDK PHP v2 ▪Composer管理 ▪アップロード以外すべて利用 •現在(PHP5.6対応) ◦AWS SDK PHP v2に統一 ▪Cake1.3時代のUTを復元させながらv2に移行 •PHP5.6バージョンアップ後 ◦AWS SDK PHP v3に移行予定 ▪2019/6/24までに対応する必要がある これがWarningを出している
  20. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6のインストール •PHP5.3時代 ◦Amazon Linuxのリポジトリからインストール ◦Amazon

    Linux 2017.03を利用 ▪PHP 5.3提供の最終バージョン •PHP5.6 ◦remiリポジトリからインストール ◦Amazon Linux最新版を利用
  21. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.3 ⇔ PHP5.6の切り替え •開発環境のdocker-compose.yml •docker-compose.override.ymlを以下のように記述

    •↑のdocker-compose.override.ymlを配置して起動 version: '2' services: app: image: xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/lancers_app:latest hostname: app networks: lancers: ipv4_address: 10.100.6.11 extra_hosts: - "dev.lancers.jp:10.100.50.11" … container_name: app-6-11 volumes: - ~/www:/var/www version: '2' services: app: image: xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/lancers_app:5.6 $ docker-compose up -d
  22. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6切り替え結果 •Strict Warningが多発 ◦debugレベル2の場合

  23. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6 バージョンアップ後の対応

  24. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6バージョンアップ後の警告対応 •親クラスと子クラスの引数が合わない ◦CakePHP1.3→2.8で引数が変更されたパターン ▪PHP5.3では警告されなかった ▪Model.php(親クラス)

    ▪WorkTask.php(子クラス) •以下のソースの子クラス全関数の引数をチェック ◦Model.php ▪Behavior.php ◦Controller.php ▪Component.php Strict Standards: Declaration of WorkTask::afterSave() should be compatible with Model::afterSave($options = Array) public function afterSave($cretated) public function afterSave($created, $options = array()) CakePHP1.3時代のまま これを親クラスと合わせる
  25. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6バージョンアップ後の警告対応 •参照を引数に取る関数の対応 ◦Strict (2048): Only

    variables should be passed by reference •参照が戻り値の関数の対応 ◦Strict (2048): Only variables should be assigned by reference $key = array_shift(array_keys($data)); ↓ $keys = array_keys($data); $key = array_shift($keys); $Db =& ConnectionManager::getDataSource($model->useDbConfig); ↓ $Db = ConnectionManager::getDataSource($model->useDbConfig);
  26. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6バージョンアップ後の警告対応 •初期化せずにオブジェクトとみなして代入(PHP5.4からWaring) ◦Warning Error: Creating

    default object from empty value in ... •入れ子にも初期化が必要 $record->type = 'type1’; ↓ $record = new stdclass(); $record->type = 'type1'; $record = new stdclass(); $record->type = 'type1'; $record->fields->key = 'key1’; ↓ $record = new stdclass(); $record->type = 'type1'; $record->fields = new stdclass(); $record->fields->key = 'key1';
  27. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6バージョンアップ後の警告対応 •Unit TestでWarning ◦40-apcu.iniに以下の設定が必要 ▪apc.enable_cli=1

    PHP Warning: __cake_core_ cache was unable to write ‘file_map’ to Apc cache in /var/www/lancers/vendor/cakephp/cakephp/lib/Cake/Cache/Cache.php on line 328 PHP Warning: __cake_core_ cache was unable to write ‘object_map’ to Apc cache in /var/www/lancers/vendor/cakephp/cakephp/lib/Cake/Cache/Cache.php on line 328 PHP Warning: __cake_core_ cache was unable to write ‘method_cache’ to Apc cache in /var/www/lancers/vendor/cakephp/cakephp/lib/Cake/Cache/Cache.php on line 328
  28. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6 バージョンアップ結果 Batch、Adminサーバーまで 移行完了

  29. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 バッチ実行時間 •約7時間かかる集計バッチ ◦PHP5.3 ▪2:00-9:04(実行時間:7:04) ◦PHP5.6

    ▪2:00-8:27(実行時間:6:27) 約37分短縮
  30. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 今後の展望

  31. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 今後の展望 •PHP5.6バージョンアップ後 ◦SDKのバージョンアップ ▪AWS SDK

    V3 •2019/06/24まで必須 ▪FaceBook SDK最新版 ◦Composerの最新化 ▪PHP-CS-Fixerのバージョンアップ ▪PHP Unitのバージョンアップ •CakePHP2.10バージョンアップ ◦PHP7バージョンアップ準備 •PHP7バージョンアップ ◦アプリケーションの高速化 ◦すべてのSDKが使えるようになる ▪FireBase Admin SDKとか •CakePHP3バージョンアップ ◦PHP 7.3 + CakePHP 2.10まで終わってから考える
  32. 2018/3/20 Connehito Marché vol.5 〜PHP市〜 ご清聴ありがとうございました!