SREチームの金澤です。
PHP5.6にバージョンアップしたことにより、今までPHPバージョン依存でアップデートできなかったライブラリをアップデートできるようになりました。
今回は、そのアップデート内容についてお話したいと思います。
AWS PHP SDK V3
2019/6/24にAmazon S3のAWS署名バージョン2が廃止されます。
AWS署名バージョン4に移行が必要になるのですが、バージョン4にするためには、原則、AWS PHP SDK V3にアップデートする必要があります。
AWS PHP SDK V3はPHP5.5以上が必須であったためPHP5.6対応は時間との戦いでもありました。
PHP5.6アップデート完了後、速やかにV3にバージョンアップに取り掛かりました。
Composer1.7.3以降でAWS SDKがインストールできない問題
2018/11にComposer1.7.3がリリースされたのですが、このバージョン以降になると
AWS SDK V2がインストールできなくなります。(PHP5.3、PHP5.6で確認)
※この詳細はQiitaに書きました。
Composerバージョンを1.7.2のままでしばらく運用していたため、
AWS SDK V3へのバージョンアップもComposerバージョン1.7.2で行いました。
Guzzleのバージョンアップ
AWS SDK V2はGuzzle(バージョン3)に依存しているのに対し、
AWS SDK V3はGuzzleHttp(バージョン6)に依存しています。
AWS SDKをV3にバージョンアップすると、依存しているGuzzleもバージョンアップされるので同時に対応する必要があります。
※バージョンアップに伴うソース修正内容をGitHubリポジトリに公開しました。
Goutteのバージョンアップ
Guzzleに依存するGoutteのバージョンアップも同時に行う必要がありました。
V1.0→V3.1.0へのバージョンアップしました。
AWS SDKのバージョンアップ
composer.jsonを以下のように修正し、
"require": { - "aws/aws-sdk-php": "2.*", + "aws/aws-sdk-php": "3.*",
composer updateを行うと、AWS SDKとGuzzleがバージョンアップされるはずなのですが、
$ php composer.phar update
ランサーズで利用しているcomposerライブラリが全般的に古く、依存関係が複雑なため
composer updateが進まない状態になっていました。
そのため、AWS SDKバージョンアップ時に生成されるcomposer.lockの内容を控え、
手動でcomposer.lockを書き換えて、composer installを行いました。
$ php composer.phar install
※こちらも、具体的なソース修正内容をGitHubリポジトリに公開しています。
Composerのバージョンアップ
AWS SDKとGuzzle HTTPを最新版にした結果、
最新のComposerでもcomposer updateができるようになりました。
composer self-updateをして、composer 1.7.2→1.8.5にアップデートできました。
$ php composer.phar self-update
PHP-CS-Fixer
v2.1から最新のv2.14にバージョンアップすることができました。
v2.1では設定できなかった以下の設定を有効にすることができました。
->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 では設定不可 + 'cast_spaces' => array('space' => 'none'), + 'combine_consecutive_issets' => true,
facebook/graph-sdkのcomposer管理
facebook/graph-sdkについては、今までPHP5.3で動作するFork版のV4.0.23を、
Vendorディレクトリに直接配置していました。
まずはV4.0.23のまま、Composer管理に移すことから開始しました。
"require": { … + "facebook/graph-sdk": "4.0.23",
※Guzzle最新バージョンにすれば、最新のfacebook/graph-sdkを利用可能になります。
(ソース修正が必要)
PHPMailer
5.2.27→6.0.7へバージョンアップ。
バージョン5.2.27は__autoload関数が使われていますが、PHP7.2で非推奨になります。
バージョン6でこれらの対応が行われています。
※バージョン6以降は以下の記述で読み込むようになります。
use PHPMailer\PHPMailer\PHPMailer;
PHPUnit
PHP5.6では、PHPUnitを5.7までバージョンアップできるのですが、
バージョンアップして実行すると以下のエラーが出力されます。
[lancers@app lancers]$ ./cake28/Test/CodingChecker/cakephp/unittest.sh
/var/www/lancers/cake28/Test/Case/Config/IsPcTest.php
CakePHP Test Shell
---------------------------------------------------------------
PHP Strict Standards: Declaration of CakeTestRunner::doRun() should be compatible with PHPUnit_TextUI_TestRunner::doRun(PHPUnit_Framework_Test $suite, array $arguments = Array, $exit = true) in /var/www/lancers/vendor/cakephp/cakephp/lib/Cake/TestSuite/CakeTestRunner.php on line 29
Strict Standards: Declaration of CakeTestRunner::doRun() should be compatible with PHPUnit_TextUI_TestRunner::doRun(PHPUnit_Framework_Test $suite, array $arguments = Array, $exit = true) in /var/www/lancers/vendor/cakephp/cakephp/lib/Cake/TestSuite/CakeTestRunner.php on line 29
PHP Fatal error: Access level to CakeTestCase::expectException() must be public (as in class PHPUnit_Framework_TestCase) in /var/www/lancers/vendor/cakephp/cakephp/lib/Cake/TestSuite/CakeTestCase.php on line 748
Fatal error: Access level to CakeTestCase::expectException() must be public (as in class PHPUnit_Framework_TestCase) in /var/www/lancers/vendor/cakephp/cakephp/lib/Cake/TestSuite/CakeTestCase.php on line 748
Fatal Error Error: Access level to CakeTestCase::expectException() must be public (as in class PHPUnit_Framework_TestCase) in [/var/www/lancers/vendor/cakephp/cakephp/lib/Cake/TestSuite/CakeTestCase.php, line 748]
CakePHP2.8がPHPUnit5.7に対応していないためです。
CakePHP2.10は対応しているので、これはCakePHP2.10移行後の対応になります。
CakePHP2.10
ということで、CakePHP2.10にアップデートしました。
CakePHP2.8→CakePHP2.10に関しては特に大きな問題もなくアップデートできました。
CakePHP2.9のタイミングでObjectクラスが非推奨になりました。
(PHP7でObjectが予約語になっている)
https://book.cakephp.org/2.0/ja/appendices/2-9-migration-guide.html
そのため、アップデート後にObjectからCakeObjectへの置き換えを行いました。
その他のライブラリ
psysh
v0.8.14→v0.9.9へバージョンアップ
PHPExcel
phpoffice/phpexcelはサポートを終了しているので
phpoffice/phpspreadsheetへ移行。
今後の予定
ランサーズのPHP、CakePHPバージョンアップは、以下のフェーズに分けて取り組んでいます。
Apache + mod_php + PHP 5.3 + CakePHP 1.3
↓(第1フェーズ)
Nginx + PHP-FPM + PHP 5.3 + CakePHP 1.3
↓(第2フェーズ)
Nginx + PHP-FPM + PHP 5.3 + CakePHP 2.8
↓(第3フェーズ)
Nginx + PHP-FPM + PHP 5.6 + CakePHP 2.8
↓(第4フェーズ)
Nginx + PHP-FPM + PHP 5.6 + CakePHP 2.10
↓(第5フェーズ)
Nginx + PHP-FPM + PHP 7.x + CakePHP 2.10
今回、第4フェーズを終えることができました。
続きまして、第5フェーズである、PHP7化に着手いたします。