Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

2018/3/20 Connehito Marché vol.5 〜PHP市〜 はじめに

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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 ランサーズのサーバー構成

Slide 6

Slide 6 text

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 メッセージサービス データ入り ランサーズの開発環境

Slide 7

Slide 7 text

2018/3/20 Connehito Marché vol.5 〜PHP市〜 バージョンアップ決定の経緯

Slide 8

Slide 8 text

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サポート終了

Slide 9

Slide 9 text

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化必須

Slide 10

Slide 10 text

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に必須

Slide 11

Slide 11 text

2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6 バージョンアップ準備

Slide 12

Slide 12 text

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秒 ■これから増えていく予定

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

2018/3/20 Connehito Marché vol.5 〜PHP市〜 PSRチェックの更新 ●PHP-CS-Fixerを利用 ○.php_cs ○NGの場合はSlackで通知 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後に 設定予定

Slide 15

Slide 15 text

2018/3/20 Connehito Marché vol.5 〜PHP市〜 UnitTestの実行 ●開発環境のコンテナを取得 ○Appコンテナ ○MySQLコンテナ ■データ入り ●全テストを実行 ○実行時間:現在約30秒 ○NGの場合はSlackで通知 Amazon ECR App ランサーズ本体 MySQL

Slide 16

Slide 16 text

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)を使用している

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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のエラーログ

Slide 19

Slide 19 text

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を出している

Slide 20

Slide 20 text

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最新版を利用

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6切り替え結果 ●Strict Warningが多発 ○debugレベル2の場合

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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時代のまま これを親クラスと合わせる

Slide 25

Slide 25 text

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);

Slide 26

Slide 26 text

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';

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

2018/3/20 Connehito Marché vol.5 〜PHP市〜 PHP5.6 バージョンアップ結果 Batch、Adminサーバーまで 移行完了

Slide 29

Slide 29 text

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分短縮

Slide 30

Slide 30 text

2018/3/20 Connehito Marché vol.5 〜PHP市〜 今後の展望

Slide 31

Slide 31 text

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まで終わってから考える

Slide 32

Slide 32 text

2018/3/20 Connehito Marché vol.5 〜PHP市〜 ご清聴ありがとうございました!