More Related Content Similar to PHPの今とこれから2020
Similar to PHPの今とこれから2020 (20) More from Rui Hirokawa (15) PHPの今とこれから20205. 5
PHP 1 PHP 2 PHP 3 PHP 4 PHP 5 PHP 7 PHP 8
0
200,000
400,000
600,000
800,000
1,000,000
1,200,000
1,400,000
総ステップ数
Python 3 Ruby 2
0
200,000
400,000
600,000
800,000
1,000,000
1,200,000
総ステップ数
パーソナルツールからプラットフォームへ
大衆的ツール(Disりの対象)から安全で実用的な高性能ツールへ
1. 言語仕様:PHP 5.3/5.4で現代的なスクリプト言語に
2. 性能:PHP 5で高速化,PHP 7で最速に
3. セキュリティ:PHP 5でCoverity Scan適用
2015/122004/72000/51998/61997/111995/6
総ステップ数(.cファイル)
総ステップ数(.cファイル)
PHPの歩み
2015/12 2020/11
7. PHPの歩み
2009
7
2010 2011 2012 2013 2014 2015 2016
PHP 5.0 ‘04/7
2017 2018 2019
・名前空間
・クロージャ
・名前空間
・クロージャ
5.3
`09/6
7.07.0
5.45.4
・Traits
・高速化
・MB標準化
・Traits
・高速化
・MB標準化
`12/3 5.5
・ジェネレータ
・キャッシュ
・ジェネレータ
・キャッシュ
`13/6
5.6
・デバッガ・デバッガ
`14/8
`15/12
・大幅高速化・大幅高速化
7.17.1
`16/12
・Nullable
・複数例外キャッチ
・Nullable
・複数例外キャッチ
`17/11
7.27.2
・高速化・高速化
7.37.3
`18/12
2004 PHP 5.0 オブジェクト機能強化
2009 PHP 5.3 普通のプログラミング言語に
2015 PHP 7.0 大幅高速化
2020 2021
7.47.4
`19/11
8.08.0
`20/11/26
・JIT
・union
・JIT
・union
・PCRE2・PCRE2
・プロパティ型
・FFI
・プロパティ型
・FFI
10. PHPリリースサイクル
10
2017 2018 2019 2020 2021 2022 2023
5.6
7.0
7.1
7.2
7.3
7.4
アクティブサポート セキュリティ修正のみ
2020/12/12
PHPのライフサイクル:3年(バグ修正:2年、セキュリティ修正のみ:1年)
EOL以降はセキュリティ関連の修正も提供されず、非常に危険です
PHP5、PHP 7.0/7.1/7.2 は EOLとなっています
EOL 2018/12/31
https://wiki.php.net/rfc/releaseprocess
http://php.net/supported-versions.php
EOL 2018/12/3
EOL 2019/12/1
EOL 2020/11/30
EOL 2021/12/6
EOL 2022/11/28
11. PHPリリース情報
Release 7.1 7.2 7.3 7.4 変更
2019/11/28 7.4.0 PHP 7.4.0 Release, PHP 7.1 EOL
2019/12/18 7.2.26 7.3.13 7.4.1 CVE-2019-11044,11045,11046 (buffer underflow),11047,11049,11050
2020/1/23 7.2.27 7.3.14 7.4.2 CVE-2020-7060 (buffer overflow)
2020/2/20 7.2.28 7.3.15 7.4.3 CVE-2020-7061 (heap overflow),7062
2020/3/19 7.2.29 7.3.16 7.4.4 CVE-2020-7066,7065 (stack overflow)
2020/4/16 7.2.30 7.3.17 7.4.5 CVE-2020-7067
2020/5/14 7.2.31 7.3.18 7.4.6 CVE-2019-11048
2020/6/11 7.3.19 7.4.7
2020/7/9 7.2.32 7.3.20 7.4.8
2020/8/6 7.2.33 7.3.21 7.4.9 CVE-2020-7068
2020/9/3 7.3.22 7.4.10
2020/10/1 7.2.34 7.3.23 7.4.11 CVE-2020-7069, 7070 (malicious cookie)
2020/10/29 7.3.24 7.4.12
2020/11/26 PHP 8.0 Release, PHP 7.2 EOL (2020/11/30)
11
CVE-* ⇒ 速やかな更新が必要
13. PHP
5.6
PHP
7.0
PHP
7.1
PHP
7.2
PHP
7.3
PHP
7.4
PHP
8.0
0
1
2
3
4
5
6
7
8
$x = $f ? $f : tmp $x = $f ? $f : $a
$x = $f ?: tmp $x = $a ?: null
$x = $str[0] $x = $hash['v']
$x = $GLOBALS['v'] $x = $_GET
$x = TEST new Foo()
$x = Foo::TEST $this->f()
empty($this->x) isset($this->x)
$this->x-- $this->x++
--$this->x ++$this->x
$this->x += 2 $this->x = 0
$x = $this->x Foo::f()
self::f() empty(Foo::$x)
isset(Foo::$x) Foo::$x = 0
$x = Foo::$x empty(self::$x)
isset(self::$x) self::$x = 0
$x = self::$x int_func()
undef_func() func()
empty_loop
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
strcat(200000) sieve(30)
nestedloop(12) matrix(20)
heapsort(20000) hash2(500)
hash1(50000) fibo(30)
ary3(2000) ary2(50000)
ary(50000) ackermann(7)
mandel2 mandel
simpleudcall simpleucall
simplecall simple
PHP8: JIT無し
Ryzen 5 2400G, Ubuntu 20.04
13
JIT無しの場合:やや改善
Zend/bench.php
Zend/microbench.php
16. PHP 8.0 JIT導入
PHP 8におけるJIT
JIT (Just-in-Time Compiler)
16
https://wiki.php.net/rfc/jit
HHVMでJIT採用⇒PHP 5に比べて大幅高速化
PHP 7開発時にもJIT導入を検討(LLVM)⇒見送り(代わりにエンジン高速化)
LuaJITプロジェクト用に開発された軽量JITエンジンDynAsmを採用
現在はx86をサポート、将来的にはARM等もサポート
zend_extension = opcache
opcache.enable = 1
opcache.jit = on
opcache.jit_buffer_size = 128M
17. PHP 8.0 JIT導入
17
https://wiki.php.net/rfc/jit
✔ OPCacheを拡張して実装:バイトコードの代わりにネーティブコードをキャッシュ
✔ 仮想マシン上で実行するよりも高速に実行できる
✔ ただし,ネーティブコードへの変換(JIT)に時間を要するため,時間がかかるコードのみJITを実行
コンパイル・解析
実行(Zend VM)
実行(CPU)
ネーティブコード
PHPスクリプト
バイトコードキャッシュ
コンパイル・解析
変換(JIT)
実行(CPU)
ネーティブコード
PHPスクリプト
バイトコード
キャッシュ
従来 JIT
18. PHP 8.0 JITオプション
JITにすれば単純に早くなるというわけでもない⇒opcache.jitオプションで調整
プロファイルで頻繁に使用される部分を抽出し、JITを適用:静的解析または実行時解析
実行頻度が高い一連の処理を切り出すトレーシングJITを導入(デフォルト)
文字列または数値(CRTO)で指定: tracingまたはon (1254),function (1205)
CPUアーキテクチャに合わせた最適化、SIMD命令の使用
18
opcache.jit=1254
CPU固有の最適化(C) 0:オフ、1: AVX命令生成を有効化
レジスタ配置(R)
0:なし、1:ローカル線形スキャン、2: グローバル線形スキャン
JITトリガ(T)
0:スクリプトロード時、1:初回実行時、
2:初回時プロファイル、2回目にコンパイル
3:プロファイルでホットな関数を見つけてコンパイル
4:docコメントで@jitタグが指定された関数をコンパイル
5:ホットなコード(ループ)をトレース,コンパイル
最適化レベル(O)
0:JIT無効、1:JIT最小実行、2:インライン化
3:関数毎の静的型推論による最適化
4:静的型推論とコールツリーによる最適化
5:静的型推論と内部処理解析による最適化
19. PHP 8.0 改善/変更のポイント
1. Union型の導入
2. 属性(attribute)
3. static型戻り値指定
4. 弱いマッピング
5. ::classのオブジェクトへの適用
6. 文字列部分一致確認用関数
7. ヌルセーフ演算子
8. match式
9. mixed型
10. 名前付き引数
11. 数値文字列扱い明確化
12. コンストラクタ引数でプロパティ設定
20. PHP 8.0 改善/変更のポイント
20
<?php
class Test {
public int|float $x;
public function getVal() : int|float {
return $this->x;
}
}
$obj = new Test();
$obj->x = "1.23";
echo $obj->getVal(); // 1.23
Union: 引数,戻り値の型の候補を複数指定できる
RFC: https://wiki.php.net/rfc/union_types_v2
float(1.23)
21. PHP 8.0 改善/変更のポイント
21
属性(attribute): Java(annotation),Rust, Python (decorators)に類似
ユースケース:メタデータの記述,フレームワークにおけるルーティング,JITオプションなど
<?php
#[ClassAttribute(PHP_VERSION_ID)]
class Foo
{
#[PropertyAttribute(2+3*2)]
public $x;
#[Deprecated("Use bar()"),Jit(1255)]
public function moo() {}
}
RFC: https://wiki.php.net/rfc/attributes_v2
$ref = new ReflectionClass(Foo::class);
$attr = $ref->getProperty('x')->getAttributes();
$attr = $ref->getMethod('moo')->getAttributes();
$attr = $ref->getAttributes();
$attr[0]->getName(), $attr[0]->getArguments()
22. PHP 8.0 改善/変更のポイント
22
static型: 関数・クラスメソッドの戻り値に遅延静的束縛(late static binding)を
指定
<?php
class A {
public function gen1():static { return new self; }
public function gen2():static { return new static; }
}
class B extends A {}
$a = new A;
$b = new B;
var_dump($b->gen1()); // object(A)#3
var_dump($b->gen2()); // object(B)#3
RFC: https://wiki.php.net/rfc/static_return_type
TypeError: Return value of A::gen1() must
be of Type B, A returned
23. PHP 8.0 改善/変更のポイント
23
弱いマッピング:オブジェクトがガベージコレクションの対象となることを妨げない。
<?php
$map = new WeakMap;
$obj = new stdClass;
$map[$obj] = spl_object_hash($obj);
var_dump($map); // object(WeakMap)#1 (1)
var_dump($map[$obj]); // $objのハッシュ値
unset($obj);
var_dump($map); // object(WeakMap)#1 (0)
RFC: https://wiki.php.net/rfc/weak_maps
通常:元の変数を削除してもリファレンスがある場合,実体は削除されない
弱いマッピング:実体はガベージコレクションの対象となり、逆にマッピングが削除される
24. PHP 8.0 改善/変更のポイント
24
RFC: https://wiki.php.net/rfc/class_name_literal_on_object
変数::class構文
オブジェクト変数に対してクラス名を取得する:
●
従来はget_class()関数を使用
●
::class構文をオブジェクト変数にも使用可能とした
<?php
class A {}
$a = new A;
echo A::class; // A: 従来から使用可能
echo get_class($a); // A: 変数の場合(従来)
echo $a::class; // A: PHP8以降
25. PHP 8.0 改善/変更のポイント
25
文字列部分一致確認用関数 RFC: https://wiki.php.net/rfc/str_contains
<?php
$s="東京特許許可局";
var_dump(str_contains($s,"特許")); // bool(true)
var_dump(str_starts_with($s,"東京")); // bool(true)
var_dump(str_ends_with($s,"許可局")); // bool(true)
26. PHP 8.0 改善/変更のポイント
26
ヌルセーフ演算子: nullチェックを簡便に
RFC: https://wiki.php.net/rfc/nullsafe_operator
<?php
class moo { public $d=123;}
class foo {
public function get() {
return new moo();
}
}
$b = new foo();
if ($b!==null) {
$a=$b->get();
if ($a!==null) {
$d=$a->d;
}
}
echo $d;
echo $b?->get()?->d;
27. PHP 8.0 改善/変更のポイント
27
match式: switch文をより簡便
に記述できる
RFC: https://wiki.php.net/rfc/match_expression_v2
switch ($id) {
case 0:
$name = 'Taro';break;
case 1:
$name = 'Jiro';break;
case 2:
case 3:
$name = 'Hanako';break;
default:
$name = “Anonymous”;break;
}
echo $name;
echo match($id) {0=>'Taro',1=>'Jiro',2,3=>'Hanako', default=>'Anonymous’};
28. PHP 8.0 改善/変更のポイント
28
mixed型: あらゆる変数型を表す汎用の型名
array,bool,callable,int,float,null,object,resource,string
RFC: https://wiki.php.net/rfc/mixed_type_v2
<?php
class A {
public mixed $bar;
public function foo(int $value): mixed {}
}
class B extends A {
public mixed $bar;
public function foo(mixed $value): int {}
}
class A
class B
引数型:同じまたは拡大
戻り値型:同じまたは縮小
継承
リスコフ置換原理(LSP)
29. PHP 8.0 改善/変更のポイント
29
名前付き引数: 引数を名前(パラメータ名: 値)で指定
●
意図が分かりやすく
●
デフォルト値をスキップ
RFC: https://wiki.php.net/rfc/named_params
array_fill(0, 100, 50);
array_fill(value:50,num:100,start_index:0);
htmlspecialchars($s,ENT_COMPAT|ENT_HTML401,’UTF-8’,false)
htmlspecialchars($s,double_encode:false)
30. PHP 8.0 改善/変更のポイント
30
Constructor Property Promotion:コンストラクタでプロパティ指定が可能に
RFC: https://wiki.php.net/rfc/constructor_promotion
class Foo {
public float $x;
public float $y;
public function __construct(float $x=0.0,float $y=0.0) {
$this->x=$x; $this->y=$y;
}
}
class Foo {
public function __construct(public float $x=0.0,public float $y=0.0) {}
}
PHP 7.4
PHP 8.0
31. PHP 8.0 改善/変更のポイント
31
数値の定義明確化:前後の空白を許容(互換性がない変更)
RFC: https://wiki.php.net/rfc/saner-numeric-strings
var_dump(is_numeric("123abc")); // bool(false)
var_dump(is_numeric("123 ")); // bool(false)
var_dump(is_numeric(" 123")); // bool(true)
var_dump(is_numeric(" 123 ")); // bool(false)
var_dump(is_numeric("123abc")); // bool(false)
var_dump(is_numeric("123 ")); // bool(true)
var_dump(is_numeric(" 123")); // bool(true)
var_dump(is_numeric(" 123 ")); // bool(true)
PHP 7.4
PHP 8.0
32. PHP 8.0 改善/変更のポイント
32
負の添字の明確化:添字追加を連続的に(互換性がない変更)
RFC: https://wiki.php.net/rfc/negative_array_index
$a[-2]=true;
$a[]=true;
var_dump($a);
PHP 7.4
PHP 8.0
$a[-2]=true,$a[0]=true
$a[-2]=true,$a[-1]=true
33. PHP 8.0 改善/変更のポイント
33
結合演算子の優先順位明確化(互換性がない変更)
RFC: https://wiki.php.net/rfc/concatenation_precedence
var_dump("3" . "5" + 7);
PHP 7.4
PHP 8.0
int(42)
string(“312”)
'.','+','-'演算子の優先順位は同じ
'+','-'演算子を優先
34. PHP 8.0 改善/変更のポイント
34
エラーレベル (error_reporting)のデフォルト値変更:
E_ALL (E_NOTICE,E_DREPRECATEDを除く) ⇒ E_ALL
display_startup_errorsがデフォルトで有効に
@演算子は致命的なエラー出力を抑制しなくなった
削除: each(), create_function()
mbstringエクステンション
●
func_overload削除
●
mb_ereg_replace()の修正子’e’削除 → mb_ereg_replace_callback()
●
mb_ereg(),mb_eregi()の戻り値 int(1) → bool(true)
37. 37
PHP Conference 2020 の見どころ
Tack 1 Track 2 Track 3 Track 4 Track 5(PHP8 specical) Track 6 (International)
PHPの今とこれから2020
PHP Webアプリケーション設計
入門 (GMO)
NewRelicプラットフォームを使ったオ
ブザーバビリティ入門(川口)
初心者セッション (柏岡) Laravelで運用しているサービスを
Nuxt.jsにリプレイスする (久保田)
PHP 8.0: A new version, a new era
(Gabriel Caruso)
レガシープロジェクトで,メタプログ
ラミングを使った...(弁護士ドットコム)
LaravelDB.comを使ってDB設計
スポンサー’s LT
長期運用を目指す
「Shadowverse」におけるリファ
クタ事例の紹介(Cygames)
徳丸皆伝を狙いませんか?徳丸実務
試験とPHP8上級試験の解説(PHP
技術者認定機構)
GCPとPHP
(サイトウ)
ゼロベースからLaravelを用いた
API実装オートメーション(めもり
~)
PHP8で作るJSONパーサ
(新原)
自分のやりたいことをやって超簡単に
チームのコミュニケーションを活性化
させた(Hamee)
PHP on Kubernetes
事業のスケールアウトを支える
PHPで作る分散アーキテクチャ
(竹澤)
PSRで学ぶHTTP Webアプリケー
ションの実践 (うさみ)
Webサービスをセキュアに保
つために必要な視点
Laravel x オニオンアーキテクチャ
で始めるテスト駆動開発
PHPのソースコードから理解す
るPreloadとJIT
テストピラミッドを意識したテスト
コード実装戦略
PHP8はISUCONへの扉を開く
鍵となるか
パネルセッション「ひさてるさんに
聞け」
Composer 2.0って何? どう変わる
の? 読んでみました (きんじょう)
DNS改ざん検知ツールの実
装とDNSパケットの世界(市
川)
本番でしか起きない問題に早く気
が付けるように,僕はLarabel
DuskでCIする (sogaoh)
PHP8の新機能をPHP内部
コードのテストphptから読む
(東口)
今こそ理解する,PHPの日時計算 CakePHPで学ぶDIコンテナ
(itasho)
Laravel+Lighthouseで始める低
コストなGraphQL入門
PHP8時代のWebアプリケー
ションフレームワークの話をしよ
う(中榮)
ウェブセキュリティのありがちな誤
解を解説する(徳丸)
効率的な静的解析のCI導入パター
ンを求めて (杉山)
PhpStormを使えばほとんど
コード補完されるんだってば
さ(マキ)
PHP8でWeb以外の世界の扉
を開く (sji)
Service communication re:Born
(Nick Chiu))
微妙な違いも見落とすな!ビジュアル
リグレッションテスト!(大橋)
PHPで作るオンラインカンファ
レンス向け録画システム(長
谷川)
How good are my tests?
(Stephan Hochdoerfer)
LT大会 Functional Programming in PHP
(Lochemem Michael)