ランサーズ(Lancers)エンジニアブログ > AWS > CloudSearch > PHP5.6化後のライブラリアップデート

PHP5.6化後のライブラリアップデート

kanazawa|2019年04月19日
AWS

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化に着手いたします。