ランサーズ等のサービスを開発・運用する中で得た知識やノウハウを紹介しています。

Labels:  AWS, CloudSearch, composer, PHP, PHP-CS-Fixer, S3, SQS, ツール/ライブラリ 投稿者:kanazawa

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

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を利用可能になります。
(ソース修正が必要)

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クラスが非推奨になったので、アップデート後に
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化に着手いたします。

ランサーズではサービスを成長させてくれるエンジニア、デザイナーを募集しています!
ご興味がある方は、以下URLよりご応募ください。


【中途採用】
サービスリードエンジニア
テックリード(アーキテクト)
フロントエンドエンジニア
サーバーサイドエンジニア
業務エンジニア(社内システム基盤・基幹システム)

【インターン・学生バイト】
19新卒対象サマーインターン
エンジニアインターン

その他採用情報

関連記事

WordPressのプラグインを改造して本家に取り込んでもらおうと思った話

SREチームの金澤です。 Lancers(ランサーズ) Advent Calendar 2018 7日目の記事になります。 昨日は、odrum428さんの「slackで動くピアボーナス機能を実装した話」でした。 今年は、Lancers以外のAdvent Cal …

thumbnail
エンジニアチームのメンター制度のご紹介

ランサーズ Advent Calendar 2016 7日目の記事です。 ランサーズエンジニアの 聡 です。 僕からは、ランサーズに入社した際に、業務以外のサポート体制として、メンター制度についてお話したいと思います。 ランサーズでは、入社したエンジニアメンバ …

AWS
AWS セキュリティ対策 〜 操作履歴を CloudTrail で残してみた

こんにちわ。こじまです。 ランサーズでは,AWS を利用してシステムを運用しています。 コンプライアンスの監査,トラブルシューティング,そして,セキュリティ分析を実施するために AWS の操作履歴を残すことは必須です。   今日は,AWS 操作履歴を …