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

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

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

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


【中途採用】
フロントエンドエンジニア
サーバーサイドエンジニア
コーポレートエンジニア
SREエンジニア

【新卒採用・その他】
21・22新卒
その他採用情報

関連記事

thumbnail
レスポンシブ対応の LP を簡単に作れるツールを React Redux で作った。ソースコードあり

pook チームの tsuyoshi です。レスポンシブ対応の LP を簡単に作れるツールへのニーズが社内で高まってきたので React Redux の練習がてら先日の開発合宿で作りました。社内でもランディングページの制作を依頼されたり、発注したりするわけです …

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

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

Vagrant上で PHP7 & CakePHP3の開発環境構築

こんにちは!2017年新卒のnumaheです。 現在インターン期間中なのですが、cakephpを勉強する!ためにvagrantで開発環境を構築しました。「どうせだったら最新のphpとcakephpで作ろうか」という上司の一声もあり、今回はPHP7とCakeph …