SlideShare a Scribd company logo
PHPの今とこれから2020
PHP Conference Tokyo 2020
December 12, 2020
廣川 類 (日本PHPユーザ会)
1
自己紹介:ひろかわ
 PHPのホビーユーザ(1996~)
 PHPマニュアルの日本語化
 マルチバイト化:mbstringエクステンション
 PHPカンファレンス皆勤中!
 PHP関連書籍:
 PHP徹底攻略
 初めてのPHP(監訳)
2
PHPとは?
 PHPは主にWebアプリケーションに使用されるスクリプト言語
 1995年の誕生以来、Webと共に成長、進化
 現場の課題を簡単に解決してくれる便利なツールです
引用: W3Techs.com, 2020/10/1
63.6%5.0%
3.7%
2.5%
2.5%
22.7%
CMS シェア WordPress
Shopify
Joomla
Wix
Drupal
others
3
78.9%
9.4%
4.2%3.3%4.2%
PHP
ASP.NET
Ruby
Java
Other
サーバサイド言語のシェア
PHPの開発体制
Rasmus Lerdorf
Andi Gutmans
Zeev Suraski
Marcus Boerger
開発アカウント:約1939名(15名)
コア:約150名(5名)
PHP Group:10名
Nikita Popov
Derick Rethans
Gabriel Caruso
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
6
20年で速度が50倍に!
(ほぼ)同じスクリプトが動く!
PHPの歩み
bench.php
Ryzen 5 2400G
Ubuntu 20.04
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
PHP アンケート 2020
 PHPでよく使うバージョンは?
1) PHP 5.x
2) PHP 7.1-7.2
3) PHP 7.3-7.4
8
<?php
echo “Hello!”;
?>
PHPバージョン分布
引用: W3Techs.com, 2020/11/1
9.8%
16.8%
18.9%
6.9%7.2%
22.8%
4.1%
7.0%
6.4%
7.4 7.3 7.2 7.1 7.0
5.6 5.5 5.4 5.3
 PHP7ユーザ: 58% (昨年: 42%)
 PHP 5(EOL)のユーザ: 42% (昨年: 57%),PHP 7.2まで(EOL)のユーザが73%
 WordPressの推奨環境:PHP 7.4, MySQL 5.6, HTTPS
9
* https://wordpress.org/about/requirements/
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
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-* ⇒ 速やかな更新が必要
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
0
20
40
60
80
100
120
Total
DoS
Code Execution
Overflow
Memory corruption
SQL Injection
XSS
Directory Traversal
HTTP Response Splitting
Bypass
Gain info
Gain privileges
File inclusion
PHP脆弱性件数(CVE)と種別
www.cvedetails.com
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
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
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
7.4
8.0
7.4
cache
8.0
cache
8.0
tracing
8.0
function
8.0
"1255"
0
0.5
1
1.5
2
2.5
$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
PHP8 JIT: より速く、快適に
Ryzen 5 2400G, Ubuntu 20.04 14
 PHP 8+JIT:実行速度が大幅改善
 実用アプリではそれほどでもない(数%)
Zend/bench.php
Zend/microbench.php
実用アプリにおけるJITの効果の例
15
 実用アプリケーションの例(WordPress)⇒実行速度はほとんど変わらない
 PHPスクリプトで重い処理を行う際の改善効果を期待
nominal opcache JIT function JIT tracing
0
10
20
30
40
50
60
PHP8.0.0RC4+WordPress 5.3.2
http://wordpress/?p=1
Requestspersecond
Ryzen 5 2400G, Ubuntu 20.04
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
PHP 8.0 JIT導入
17
https://wiki.php.net/rfc/jit
✔ OPCacheを拡張して実装:バイトコードの代わりにネーティブコードをキャッシュ
✔ 仮想マシン上で実行するよりも高速に実行できる
✔ ただし,ネーティブコードへの変換(JIT)に時間を要するため,時間がかかるコードのみJITを実行
コンパイル・解析
実行(Zend VM)
実行(CPU)
ネーティブコード
PHPスクリプト
バイトコードキャッシュ
コンパイル・解析
変換(JIT)
実行(CPU)
ネーティブコード
PHPスクリプト
バイトコード
キャッシュ
従来 JIT
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:静的型推論と内部処理解析による最適化
PHP 8.0 改善/変更のポイント
1. Union型の導入
2. 属性(attribute)
3. static型戻り値指定
4. 弱いマッピング
5. ::classのオブジェクトへの適用
6. 文字列部分一致確認用関数
7. ヌルセーフ演算子
8. match式
9. mixed型
10. 名前付き引数
11. 数値文字列扱い明確化
12. コンストラクタ引数でプロパティ設定
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)
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()
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
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
通常:元の変数を削除してもリファレンスがある場合,実体は削除されない
弱いマッピング:実体はガベージコレクションの対象となり、逆にマッピングが削除される
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以降
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)
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;
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’};
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)
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)
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
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
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
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”)
'.','+','-'演算子の優先順位は同じ
'+','-'演算子を優先
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)
PHP の将来
 PHPスクリプトの用途拡大:Opcache(プリローディング)+JIT+FFIの活用
●
PHPエクステンション:C言語による記述からPHPによる記述へ(FFI)
●
計算負荷が高いアルゴリズムのPHPによる実装:機械学習,AI等 (PHP-ML, PHP-MLX)
35
入力処理(C言語)
外部API実行
PHPスクリプト
従来のエクステンション(C言語)
出力処理(C言語)
PHP出力
入力処理(PHP)
外部API実行
PHPスクリプト
FFIエクステンション(PHP)
出力処理(PHP)
PHP出力
PHPユーザ相互の情報交換およびコミュ
ニティの健全な発展
設立趣旨
•  高性能Webミドルウエアへのニーズ増大
•  オープンソースソフトウエアの発展
背景
国内PHPユーザの増加
活動内容
ドキュメント整備
セミナー/イベント
メンバー/スタッフ 国際化
Web/SNS
・PHPユーザ会員と思ったらメンバー
・運営するのも楽しいかも
日本PHPユーザ会
(2000年4月発足)
PHPカンファレンス
36
PHP勉強会
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)
38
PHPカンファレンスは1999年からPHP関連の技術を主とした技術者カンファレンスです。
例年であれば大田区蒲田にある「大田区産業プラザ PiO」にて開催を行う予定でしたが
新型コロナウイルス(COVID-19)感染症拡大防止のため、21年目で初めてのオンライン
開催となります。
オンライン開催では「YouTube Live」を利用したライブでのセッションを始め、オンラインなら
ではのコンテンツで今年のカンファレンスをお楽しみください。

More Related Content

What's hot

PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
shinjiigarashi
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
NTT DATA Technology & Innovation
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダ
Takuya ASADA
 
Ceph アーキテクチャ概説
Ceph アーキテクチャ概説Ceph アーキテクチャ概説
Ceph アーキテクチャ概説
Emma Haruka Iwao
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
NTT DATA Technology & Innovation
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
 
HTTPを理解する
HTTPを理解するHTTPを理解する
HTTPを理解する
IIJ
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
NTT DATA Technology & Innovation
 
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩く
shinjiigarashi
 
Kuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOpsKuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOps
shunki fujiwara
 
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題
NTT DATA OSS Professional Services
 
Javaバイトコード入門
Javaバイトコード入門Javaバイトコード入門
Javaバイトコード入門
Kota Mizushima
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク
7shi
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキング
Tomoya Hibi
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga
 
このPHP QAツールがすごい!2019
このPHP QAツールがすごい!2019 このPHP QAツールがすごい!2019
このPHP QAツールがすごい!2019
sasezaki
 
Pacemaker 操作方法メモ
Pacemaker 操作方法メモPacemaker 操作方法メモ
Pacemaker 操作方法メモ
Masayuki Ozawa
 
ARMアーキテクチャにおけるセキュリティ機構の紹介
ARMアーキテクチャにおけるセキュリティ機構の紹介ARMアーキテクチャにおけるセキュリティ機構の紹介
ARMアーキテクチャにおけるセキュリティ機構の紹介
sounakano
 
KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話
imurata8203
 
HTTP/2の現状とこれから
HTTP/2の現状とこれからHTTP/2の現状とこれから
HTTP/2の現状とこれから
shigeki_ohtsu
 

What's hot (20)

PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダ
 
Ceph アーキテクチャ概説
Ceph アーキテクチャ概説Ceph アーキテクチャ概説
Ceph アーキテクチャ概説
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
HTTPを理解する
HTTPを理解するHTTPを理解する
HTTPを理解する
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
 
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩く
 
Kuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOpsKuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOps
 
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題
 
Javaバイトコード入門
Javaバイトコード入門Javaバイトコード入門
Javaバイトコード入門
 
ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキング
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
このPHP QAツールがすごい!2019
このPHP QAツールがすごい!2019 このPHP QAツールがすごい!2019
このPHP QAツールがすごい!2019
 
Pacemaker 操作方法メモ
Pacemaker 操作方法メモPacemaker 操作方法メモ
Pacemaker 操作方法メモ
 
ARMアーキテクチャにおけるセキュリティ機構の紹介
ARMアーキテクチャにおけるセキュリティ機構の紹介ARMアーキテクチャにおけるセキュリティ機構の紹介
ARMアーキテクチャにおけるセキュリティ機構の紹介
 
KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話
 
HTTP/2の現状とこれから
HTTP/2の現状とこれからHTTP/2の現状とこれから
HTTP/2の現状とこれから
 

Similar to PHPの今とこれから2020

PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022
Rui Hirokawa
 
PHPの今とこれから2016
PHPの今とこれから2016PHPの今とこれから2016
PHPの今とこれから2016
Rui Hirokawa
 
PHPの今とこれから2015
PHPの今とこれから2015PHPの今とこれから2015
PHPの今とこれから2015
Rui Hirokawa
 
PHPの今とこれから2008
PHPの今とこれから2008PHPの今とこれから2008
PHPの今とこれから2008
Rui Hirokawa
 
PHPの今とこれから2007
PHPの今とこれから2007PHPの今とこれから2007
PHPの今とこれから2007
Rui Hirokawa
 
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
Rui Hirokawa
 
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
Rui Hirokawa
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports
 
FuelPHP活用事例
FuelPHP活用事例FuelPHP活用事例
FuelPHP活用事例
Yusuke Naka
 
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
Masahiro Nagano
 
PHP 開発環境構築 - Windows 編 -
PHP 開発環境構築- Windows 編 -PHP 開発環境構築- Windows 編 -
PHP 開発環境構築 - Windows 編 -Masaki Takeda
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
shinjiigarashi
 
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
sasezaki
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築Hideharu MATSUFUJI
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
Rui Hirokawa
 
PHPの今とこれから2018
PHPの今とこれから2018PHPの今とこれから2018
PHPの今とこれから2018
Rui Hirokawa
 
コンテナーによるIT基盤変革 - IT infrastructure transformation -
コンテナーによるIT基盤変革 - IT infrastructure transformation -コンテナーによるIT基盤変革 - IT infrastructure transformation -
コンテナーによるIT基盤変革 - IT infrastructure transformation -
日本ヒューレット・パッカード株式会社
 
徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ
Hiroshi Tokumaru
 
非同期処理をちょっとはラクに。Promises:aほか
 非同期処理をちょっとはラクに。Promises:aほか 非同期処理をちょっとはラクに。Promises:aほか
非同期処理をちょっとはラクに。Promises:aほかMasakazu Muraoka
 
PHPの今とこれから2006
PHPの今とこれから2006PHPの今とこれから2006
PHPの今とこれから2006
Rui Hirokawa
 

Similar to PHPの今とこれから2020 (20)

PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022
 
PHPの今とこれから2016
PHPの今とこれから2016PHPの今とこれから2016
PHPの今とこれから2016
 
PHPの今とこれから2015
PHPの今とこれから2015PHPの今とこれから2015
PHPの今とこれから2015
 
PHPの今とこれから2008
PHPの今とこれから2008PHPの今とこれから2008
PHPの今とこれから2008
 
PHPの今とこれから2007
PHPの今とこれから2007PHPの今とこれから2007
PHPの今とこれから2007
 
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
 
スクリプト言語PHP攻略法
スクリプト言語PHP攻略法スクリプト言語PHP攻略法
スクリプト言語PHP攻略法
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
FuelPHP活用事例
FuelPHP活用事例FuelPHP活用事例
FuelPHP活用事例
 
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
メルカリのデータベース戦略 / PHPとMySQLの怖い話 MyNA会2015年8月
 
PHP 開発環境構築 - Windows 編 -
PHP 開発環境構築- Windows 編 -PHP 開発環境構築- Windows 編 -
PHP 開発環境構築 - Windows 編 -
 
PHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見るPHP で実行中のスクリプトの動作を下から覗き見る
PHP で実行中のスクリプトの動作を下から覗き見る
 
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
 
PHPの今とこれから2014
PHPの今とこれから2014PHPの今とこれから2014
PHPの今とこれから2014
 
PHPの今とこれから2018
PHPの今とこれから2018PHPの今とこれから2018
PHPの今とこれから2018
 
コンテナーによるIT基盤変革 - IT infrastructure transformation -
コンテナーによるIT基盤変革 - IT infrastructure transformation -コンテナーによるIT基盤変革 - IT infrastructure transformation -
コンテナーによるIT基盤変革 - IT infrastructure transformation -
 
徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ徳丸本に載っていないWebアプリケーションセキュリティ
徳丸本に載っていないWebアプリケーションセキュリティ
 
非同期処理をちょっとはラクに。Promises:aほか
 非同期処理をちょっとはラクに。Promises:aほか 非同期処理をちょっとはラクに。Promises:aほか
非同期処理をちょっとはラクに。Promises:aほか
 
PHPの今とこれから2006
PHPの今とこれから2006PHPの今とこれから2006
PHPの今とこれから2006
 

More from Rui Hirokawa

PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023
Rui Hirokawa
 
PHPの今とこれから2019
PHPの今とこれから2019PHPの今とこれから2019
PHPの今とこれから2019
Rui Hirokawa
 
日本PHPユーザ会の紹介
日本PHPユーザ会の紹介日本PHPユーザ会の紹介
日本PHPユーザ会の紹介
Rui Hirokawa
 
PHPの中の人によるパネルディスカッション
PHPの中の人によるパネルディスカッションPHPの中の人によるパネルディスカッション
PHPの中の人によるパネルディスカッション
Rui Hirokawa
 
PHPの今とこれから2009
PHPの今とこれから2009PHPの今とこれから2009
PHPの今とこれから2009
Rui Hirokawa
 
PHPの今と未来を語る
PHPの今と未来を語るPHPの今と未来を語る
PHPの今と未来を語る
Rui Hirokawa
 
PHPの今と未来を語る
PHPの今と未来を語るPHPの今と未来を語る
PHPの今と未来を語る
Rui Hirokawa
 
php.netの歩き方
php.netの歩き方php.netの歩き方
php.netの歩き方
Rui Hirokawa
 
PHP4の今 ~日本語対応と最近のトピックス~
PHP4の今 ~日本語対応と最近のトピックス~PHP4の今 ~日本語対応と最近のトピックス~
PHP4の今 ~日本語対応と最近のトピックス~
Rui Hirokawa
 
PHPの今とこれから2017
PHPの今とこれから2017PHPの今とこれから2017
PHPの今とこれから2017
Rui Hirokawa
 
PHP Now and then 2018 : WordPress Special Edition
PHP Now and then 2018 : WordPress Special EditionPHP Now and then 2018 : WordPress Special Edition
PHP Now and then 2018 : WordPress Special Edition
Rui Hirokawa
 
PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話
Rui Hirokawa
 
PHPの今とこれから 2013
PHPの今とこれから 2013PHPの今とこれから 2013
PHPの今とこれから 2013
Rui Hirokawa
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
 
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011
Rui Hirokawa
 

More from Rui Hirokawa (15)

PHPの今とこれから2023
PHPの今とこれから2023PHPの今とこれから2023
PHPの今とこれから2023
 
PHPの今とこれから2019
PHPの今とこれから2019PHPの今とこれから2019
PHPの今とこれから2019
 
日本PHPユーザ会の紹介
日本PHPユーザ会の紹介日本PHPユーザ会の紹介
日本PHPユーザ会の紹介
 
PHPの中の人によるパネルディスカッション
PHPの中の人によるパネルディスカッションPHPの中の人によるパネルディスカッション
PHPの中の人によるパネルディスカッション
 
PHPの今とこれから2009
PHPの今とこれから2009PHPの今とこれから2009
PHPの今とこれから2009
 
PHPの今と未来を語る
PHPの今と未来を語るPHPの今と未来を語る
PHPの今と未来を語る
 
PHPの今と未来を語る
PHPの今と未来を語るPHPの今と未来を語る
PHPの今と未来を語る
 
php.netの歩き方
php.netの歩き方php.netの歩き方
php.netの歩き方
 
PHP4の今 ~日本語対応と最近のトピックス~
PHP4の今 ~日本語対応と最近のトピックス~PHP4の今 ~日本語対応と最近のトピックス~
PHP4の今 ~日本語対応と最近のトピックス~
 
PHPの今とこれから2017
PHPの今とこれから2017PHPの今とこれから2017
PHPの今とこれから2017
 
PHP Now and then 2018 : WordPress Special Edition
PHP Now and then 2018 : WordPress Special EditionPHP Now and then 2018 : WordPress Special Edition
PHP Now and then 2018 : WordPress Special Edition
 
PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話
 
PHPの今とこれから 2013
PHPの今とこれから 2013PHPの今とこれから 2013
PHPの今とこれから 2013
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 
PHP, Now and Then 2011
PHP, Now and Then 2011PHP, Now and Then 2011
PHP, Now and Then 2011
 

PHPの今とこれから2020

  • 1. PHPの今とこれから2020 PHP Conference Tokyo 2020 December 12, 2020 廣川 類 (日本PHPユーザ会) 1
  • 2. 自己紹介:ひろかわ  PHPのホビーユーザ(1996~)  PHPマニュアルの日本語化  マルチバイト化:mbstringエクステンション  PHPカンファレンス皆勤中!  PHP関連書籍:  PHP徹底攻略  初めてのPHP(監訳) 2
  • 3. PHPとは?  PHPは主にWebアプリケーションに使用されるスクリプト言語  1995年の誕生以来、Webと共に成長、進化  現場の課題を簡単に解決してくれる便利なツールです 引用: W3Techs.com, 2020/10/1 63.6%5.0% 3.7% 2.5% 2.5% 22.7% CMS シェア WordPress Shopify Joomla Wix Drupal others 3 78.9% 9.4% 4.2%3.3%4.2% PHP ASP.NET Ruby Java Other サーバサイド言語のシェア
  • 4. PHPの開発体制 Rasmus Lerdorf Andi Gutmans Zeev Suraski Marcus Boerger 開発アカウント:約1939名(15名) コア:約150名(5名) PHP Group:10名 Nikita Popov Derick Rethans Gabriel Caruso
  • 5. 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
  • 8. PHP アンケート 2020  PHPでよく使うバージョンは? 1) PHP 5.x 2) PHP 7.1-7.2 3) PHP 7.3-7.4 8 <?php echo “Hello!”; ?>
  • 9. PHPバージョン分布 引用: W3Techs.com, 2020/11/1 9.8% 16.8% 18.9% 6.9%7.2% 22.8% 4.1% 7.0% 6.4% 7.4 7.3 7.2 7.1 7.0 5.6 5.5 5.4 5.3  PHP7ユーザ: 58% (昨年: 42%)  PHP 5(EOL)のユーザ: 42% (昨年: 57%),PHP 7.2まで(EOL)のユーザが73%  WordPressの推奨環境:PHP 7.4, MySQL 5.6, HTTPS 9 * https://wordpress.org/about/requirements/
  • 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-* ⇒ 速やかな更新が必要
  • 12. 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 0 20 40 60 80 100 120 Total DoS Code Execution Overflow Memory corruption SQL Injection XSS Directory Traversal HTTP Response Splitting Bypass Gain info Gain privileges File inclusion PHP脆弱性件数(CVE)と種別 www.cvedetails.com
  • 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
  • 14. 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 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 7.4 8.0 7.4 cache 8.0 cache 8.0 tracing 8.0 function 8.0 "1255" 0 0.5 1 1.5 2 2.5 $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 PHP8 JIT: より速く、快適に Ryzen 5 2400G, Ubuntu 20.04 14  PHP 8+JIT:実行速度が大幅改善  実用アプリではそれほどでもない(数%) Zend/bench.php Zend/microbench.php
  • 15. 実用アプリにおけるJITの効果の例 15  実用アプリケーションの例(WordPress)⇒実行速度はほとんど変わらない  PHPスクリプトで重い処理を行う際の改善効果を期待 nominal opcache JIT function JIT tracing 0 10 20 30 40 50 60 PHP8.0.0RC4+WordPress 5.3.2 http://wordpress/?p=1 Requestspersecond Ryzen 5 2400G, Ubuntu 20.04
  • 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)
  • 35. PHP の将来  PHPスクリプトの用途拡大:Opcache(プリローディング)+JIT+FFIの活用 ● PHPエクステンション:C言語による記述からPHPによる記述へ(FFI) ● 計算負荷が高いアルゴリズムのPHPによる実装:機械学習,AI等 (PHP-ML, PHP-MLX) 35 入力処理(C言語) 外部API実行 PHPスクリプト 従来のエクステンション(C言語) 出力処理(C言語) PHP出力 入力処理(PHP) 外部API実行 PHPスクリプト FFIエクステンション(PHP) 出力処理(PHP) PHP出力
  • 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)