PHP Conference Japan 2019にいってきました

#PHP Conference Japanとは
PHPは25年前の1994年 Rasmus Lerdorf によって原型が生まれ、1996年にPHP/FIとして公開されました。
PHPは順調にバージョンアップを続け、ユーザ数も増えています。
そして20世紀最後の年である2000年に日本のユーザ会によって行われたのが、PHPカンファレンスです。phpの過去・現在・未来/新しい技術やフレームワークについてなど多くの講演やイベントが出展されております。

2019年の今回は1500人を超えるPHPerが全国から集う大規模カンファレンスとなり、
PHPerの皆様にとってチャレンジ、成長、そしてその先へと向かう原動力となることを、そしてこれから先の10年、20年、25年と、Webの発展とともにPHPの発展を願って**beyond**という副題がついておりました。

#参加した講演

##phpの今とこれから2019　廣川類さん
そもそもphpとは何か、phpの現在と直近11/28にリリースされたphp7.4のアップデート情報などについてお話をいただきました。
このカンファレスへの参加は今回が初めてだったので、phpの成り立ちやアップデートの推移など非常に興味深い話を聞くことができました。
中でもphpのバージョンとEOLについては興味深く、自分が普段サポート対象外である5.6を利用している立場であるため検討することが非常に多いと感じました。

###内容サマリ
phpは1994年 Rasmus Lerdorfによって作成された。
Personal Home Page Toolsの略で(~~Tはどこいった~~)もともとは同氏の経歴書サイトのアクセス履歴を調べるために作成されたスクリプト言語である。

現在のphpの開発体制は
php group   : 10名
core member : 150名
developers  : 2000名

現在の最新バージョンは11/28にリリースされた7.4
次回は7.5ではなく8.0の予定で、2021頃と予想される。

php5.6～php7.1はEOLとなっているためできるだけはやくアップデートしてほしい。
とくに「CVE-」と頭につくレポートは脆弱性に関する報告なのでこれが上がった際にはすぐに対応すること。

8.0はJIT(just in time compiler)の導入で大幅な速度改善が行われる想定


###【7.4のアップデート一部抜粋】

**プロパティの型指定が可能に**
型指定のゆるいphpでも判定を厳しくすることでfatalエラーをだせるように

```php
<?php 
declear(strict_types = 1) ; //strict_typesの設定により型指定の判定をより厳格に
class Test {
    public int $a ;
}

$i = new Test();

$i->$a = 123 ;
$i->$a = "123" ; // 7.4からエラーになります
?>
```
**配列スプレッド構文**
配列定義に配列を利用可能、array_merge()よりシンプルで処理も高速

```php
<?php
$array1 = ['apple', 'orange'] ; 
$array2 = ['banana', ...$array1, 'pear' ] ; //['banana', 'apple', 'orange', 'pear']
?>
```
個人的に配列追加処理はめんどくさいイメージが強かったのでこれはとても便利だなと感じました！！！

**アロー関数の追加**
アロー関数方式で関数の定義を簡略化可能
<font color="Red">※"fn"が予約後に</font>
文法は下記の通り

```php
<?php
$a = 2 ;
$b = 3 ;

//今までの関数定義
$fn = function($a, $b){
    return $a*$b ;
}

//7.4から追加されたアロー関数
$fn = fn($a, $b) => $a*$b; 
?>
```
今までの関数定義に慣れてしまってるせいかメリットである「見やすさ」があまり感じられないのですが、どうなんでしょう。。。
行数は明らかに減るので関数の多いプログラムだと処理やファイル容量にも影響ありそうです！

**??構文**
変数が設定されている場合の判定を行うことができる構文
php7系から実装がされていたがより簡易的に記載できるように

```php
<?php 
//php5系まで
$a["user"] = isset($a["user"])? $a["user"]:"nobody" ; 
//php7まで
$a["user"] = $a["user"]?? "nobody" ;
//php7.4から
$a["user"]?? = "nobody" ;
?>
```
これもとっても便利そうです。コンパクトなだけでなく一度覚えればパッと見で処理がわかりやすいのが◎

**数値リテラルセパレータ**
桁数の大きい数字を「_」で区切ることが可能

```php
<?php
$price = 1_000_000 ;
echo $price ; //1000000
?>
```
これは最高ですね。とても見やすいです。
あんまり桁数の多い数字をphpプログラム上に直接書くイメージがわかないですが^^;

**"+"と"."優先度変更**
従来は文字列結合、＋演算に優先度の差はない
7.4からは"+"が優先的に処理されるように

```php
<?php 
print_r("2" . "3" + 7)
//php7.3まで
//  30
//php7.4から
//　201
?>
```
一方で厳格な型指定ができるようになっているのにも関わらず、使いどころがだいぶ怪しいものもでてきました。
それでも覚えておかないとどこかでハマりそうですね。。。

上記は一部インパクトのありそうなものをピックアップです。
詳細や全新機能については[公式ドキュメント](https://www.php.net/archive/2019.php#2019-11-28-1)を参照してください。

##『グランブルーファンタジー』開発エンジニアの考え方　小松美穂さん

php5.6から7.2にアップデートすることによりどの程度パフォーマンス改善がされたかなど、
内容が自チームの開発プロダクトの状況と近いものがあり、非常に参考になるセッションでした。

**内容サマリ**
【グランブルーファンタジー】
・LAMPで構成
・ユーザ数     　: 2400万人
・リクエスト数   : 15億/day
・最大風速 : 40億/day


php5.6のEOL/7系の魅力的な更新内容に伴い7系に移行する計画を検討・実施
2018年検討開始 ~ 2019年年明け完了
バージョンアップに伴い下記を実施
・静的解析
・エラー対応
・フレームワークのバージョンアップ(互換性など)

【バージョンアップの効果】
・平均レスポンスタイムが半分に
・メモリ使用率も大幅改善(こちらも約半分)
→大きな要因
　php7系の連想配列を必要としないメモリブロックとしての配列
　(グラブルはパラメータの扱いが多いゲームのため)
　<font color="Red">※php5までは普通の配列も内部的には連想配列の形でキーを利用していた。
　　php7からはキーが0から連続する数字ならばメモリブロック可能な配列として処理される。
</font>

【新たな課題】
・フロントのパフォーマンス向上によるDB瞬間負荷増加
・余裕のできたリソースの活用

【登壇者に質問してみました！】
・環境はオンプレ
・フロントだけで3桁台立っているとか・・・(正確な台数はNGでした)


**所感**
phpのバージョンを上げるだけでもフレームワーク、プロパティエラーのみだけでなくDBへの負荷増加など非常に多くのことまで考慮をしなければいけないのだなと感じました。
phpバージョンアップのどの部分が大きく作用しているのか、自プロダクトとどのように作用しているかまで検討する必要があると考えさせられましたね。。。


##新しい概念のWAFが叶える、クラウドネイティブ時代のセキュリティ　徳丸浩さん

wafの時代ごとの推移や各型式のメリデメなどwafをあまり理解していなくてもわかりやすい講演でした。
その上で現代でのwafはどうあるべきか、クラウドに対応するにはという非常に興味深いお話でした。

**内容サマリ**

【wafの歴史】
●第1世代　ブラックリスト時代
SQLのキーワード(whereとかunion等)やクオテーションのような記号の組み合わせを検知し防御する
⇒誤検知、検知漏れ等が頻発し、使えない

●第2世代　ホワイトリスト時代
許可される文字列のみを登録、それ以外の入力があった際には検知し防御する
⇒設定が煩雑、誤入力と攻撃を区別できない。

●第3世代　ホワイトリスト＋学習機能時代
入力された文字を学習し、それをホワイトリストとして運用する
⇒誤入力があるとそれも学習してしまうため、使い物にならない

●現在はブラックリスト型へ
精度やコスト・運用管理負担を鑑みると手放しで良いものではない


【wafの種類】
●アプライアンス型
ベンダーの提供するwaf専用サーバ、または企業の所有するwafをインストールしたサーバを自身のwebサーバの前に設置することによりwafを実現する
<font color="Red">◎</font>自由な運用が可能
<font color="blue">**×**</font>セットアップ、サーバ起動に時間がかかる


●SaaS型
インターネット上にwafの仕組みを導入し、そこを通過したアクセスのみをメインサーバに通すことでwafを実現する
<font color="Red">◎</font>導入が簡単(DNSの設定)
<font color="blue">**×**</font>通信コストが高い、レイテンシーの増加

●ホスト型
webサーバに直接wafの機能をインストール
<font color="Red">◎</font>導入が簡単(サーバへのインストール)
<font color="blue">**×**</font>webサーバの増加時追加対応

**所感**
wafについてあまり知識がなかったのですが、不正な通信や攻撃パターンなどを定義したファイル等を利用しているという内容が意外に原始的でコストも高くまだまだ深堀できる分野なのだなと感じました。

#まとめ
phpカンファレンスは初の参加だったのですが、自身がメインで触っている言語ということもあり、参考になる話がたくさん聞ける場でした。特に言語のバージョンをパフォーマンス視点で意識したことが無かったのでCygamesさんのお話は非常に勉強になりました。
こういったイベント・勉強会には是非とも積極的に参加していきたいです。