Successfully reported this slideshow.
Your SlideShare is downloading. ×

PHPの今とこれから2022

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
PHPの今とこれから2021
PHPの今とこれから2021
Loading in …3
×

Check these out next

1 of 27 Ad
Advertisement

More Related Content

More from Rui Hirokawa (17)

Recently uploaded (20)

Advertisement

PHPの今とこれから2022

  1. 1. PHPの今とこれから2022 PHP Conference Japan 2022 September 24-25, 2022 廣川 類 (日本PHPユーザ会) 1
  2. 2. 自己紹介:ひろかわ ◼ PHPのホビーユーザ(1996~) ◼ PHPマニュアルの日本語化 ◼ マルチバイト化:mbstringエクステンション ◼ PHPカンファレンス皆勤中! ◼ PHP関連書籍: ➢ PHP徹底攻略 ➢ 初めてのPHP(監訳) 2
  3. 3. PHPとは? ◼ PHPは主にWebアプリケーションに使用されるスクリプト言語 ◼ 1995年の誕生以来、Webと共に成長、進化 ◼ 現場の課題を簡単に解決してくれる便利なツールです 引用: W3Techs.com, 2022/8/10 3 サーバサイド言語のシェア WordPress 64.3% Shopify 6.2% Wix 3.4% Squarespace 3.0% Joomla 2.5% other 20.6% CMSのシェア PHP 77.5% ASP.NET 7.7% Ruby 5.7% Java 4.2% Scala 2.7% other 2.2%
  4. 4. PHPアンケート 2022 4
  5. 5. PHPの開発体制 Rasmus Lerdorf Andi Gutmans Zeev Suraski Marcus Boerger 開発アカウント:約2,000名(15名) コア:約150名(5名) PHP Group:10名 Nikita Popov Derick Rethans https://www.php.net/credits.php Dmitry Stogov
  6. 6. PHP財団(PHP Foundation)設立 ◼ 2021年11月に設立がアナウンスされたPHP開発者をサポートするため の非営利団体.JetBrains社が主要スポンサー ◼ きっかけは,PHPに多大な貢献をしていたNikita Popov氏がJetBrainsを 退社し,PHP開発にかける時間を大幅に減らすと宣言したこと. ◼ 背景・課題:重要なインフラであるPHPは個人のモチベーションに依存 して開発・維持されており,生活面の保証(支援)がない. ◼ OpenCollectiveにより運営され,個人・企業の寄付に基づき,PHP開発 者を支援. ◼ 主要な開発者であるDmitry Stogov 氏らへのサポートが決定. ◼ 財政状況等はオープンになっており,誰でも貢献(寄付)ができる. https://thephp.foundation/ https://opencollective.com/phpfoundation
  7. 7. 7 PHP 1 PHP 2 PHP 3 PHP 4 PHP 5 PHP 7 PHP 8 総ステップ数 2946 40377 141066 406227 1103847 1133517 1261005 0 200,000 400,000 600,000 800,000 1,000,000 1,200,000 1,400,000 総ステップ数 Python 3 Ruby 2 総ステップ数 422087 863913 0 200,000 400,000 600,000 800,000 1,000,000 1,200,000 総ステップ数 ◼ パーソナルツールからプラットフォームへ ◼ 大衆的ツールから安全で実用的な高性能ツールへ 1. 言語仕様:PHP 5.3/5.4で現代的なスクリプト言語に 2. 性能:PHP 5で高速化,PHP 7で最速に 3. セキュリティ:PHP 5でCoverity Scan適用 2015/12 2004/7 2000/5 1998/6 1997/11 1995/6 総ステップ数(.cファイル) 総ステップ数(.cファイル) PHPの歩み 2015/12 2020/11
  8. 8. 8 20年で速度が50倍に! (ほぼ)同じスクリプトが動く! PHPの歩み bench.php Ryzen 5 2400G Ubuntu 20.04
  9. 9. PHPの歩み 9 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 8.0 `20/11/26 8.1 `21/11/25 2023 5.5 5.6 5.4 Traits マルチバイト ジェネレータ キャッシュ デバッガ 7.0 7.1 7.2 7.3 7.4 高速化 スカラー型宣言 戻り値型宣言 プロパティ型宣言 FFI JIT union Fiber Enum 交差型 PHP 5.3-5.4 現代的な機能導入 PHP7 大幅高速化 PHP8 JIT導入 8.2 `22/11/24 DNF readonlyクラス
  10. 10. PHPバージョン分布 引用: W3Techs.com, 2022/8/10 8.1 1.3% 8.0 3.1% 7.4 38.4% 7.3 15.4% 7.2 10.5% 7.1 3.7% 7.0 3.7% 5.x 23.8% other 0.2% ◼ PHP7ユーザ: 71.6% (昨年: 68.2%),PHP 8ユーザ:4.4% (昨年: 0.8%) ◼ PHP 5(EOL)のユーザ: 23.8% (昨年: 30.5%),PHP 7.3まで(EOL)のユーザ:57.2% ◼ WordPressの推奨環境:PHP 7.4, MySQL 5.7/MariaDB 10.3, HTTPS 10 * https://wordpress.org/about/requirements/
  11. 11. ◼ PHPのライフサイクル:3年(バグ修正:2年、セキュリティ修正のみ:1年) ◼ EOL以降はセキュリティ関連の修正も提供されず、非常に危険です ◼ PHP5、PHP 7.0~7.3 は EOLとなっています PHPリリースサイクル 11 2018 2019 2020 2021 2022 2023 2024 5.6 7.0 7.1 7.2 7.3 7.4 8.0 アクティブサポート セキュリティ修正のみ 2022/9/25 EOL 2018/12/31 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 EOL 2023/11/26
  12. 12. PHPリリース情報 Release 7.4 8.0 8.1 変更 2021/10/21 7.4.25 8.0.12 CVE-2021-21703 (PHP-FPM) 2021/11/18 7.4.26 8.0.13 CVE-2021-21707 (XML) 2021/11/25 8.1.0 PHP 8.1.0 Release, PHP 7.3 EOL (2021/12/6) 2021/12/16 7.4.27 8.0.14 8.1.1 2022/1/20 8.0.15 8.1.2 2022/2/17 7.4.28 8.0.16 8.1.3 CVE-2021-21708 (Filter):リモートコード実行 2022/3/17 8.0.17 8.1.4 2022/4/14 7.4.29 8.0.18 8.1.5 Rebuilding Windows binaries for security updates 2022/5/12 8.0.19 8.1.6 2022/6/9 7.4.30 8.0.20 8.1.7 CVE-2022-31626 (mysql), 31625 (pgsql) 2022/7/7 8.0.21 8.1.8 2022/8/4 8.0.22 8.1.9 2022/9/1 8.0.23 8.1.10 12 ◼ CVE-* ⇒ 速やかな更新が必要
  13. 13. PHP8 JIT: より速く、快適に Ryzen 5 2400G, Ubuntu 22.04 14 ◼ PHP 8.2: 地道な実行速度改善が進んで いる. 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 Zend/bench.php
  14. 14. 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 15 ◼ PHP 8.2: JIT(キャッシュ)は地道 時に改良されているが,実行速度の 差は小さい. Zend/micro_bench.php
  15. 15. PHP 8.2 改善/変更のポイント ◼ Randomエクステンション ◼ Disjunctive Normal Form(DNF)型 ◼ null/true/false型の追加 ◼ readonly属性のクラスへの適用 ◼ バックトレースにおける出力抑制 ◼ 定数式における列挙型プロパティ ◼ Traitで定数が利用可に ◼ mbstring関連の修正 8.1.0-8.1.7で非互換な変換 ◼ 動的プロパティ廃止対象(deprecated) ◼ strtolower(), strtoupper()がロケール非依存に ◼ utf8_encode(), utf8_decode()が廃止対象に 代替:mb_strtolower() 代替:mb_convert_encoding() 互換性のない変更・不具合 機能追加
  16. 16. 動的プロパティの廃止 17 https://wiki.php.net/rfc/deprecate_dynamic_properties 従来のPHPでは,あるクラスにおいて宣言されていないプロパティに値が代入されると, 自動的に指定したプロパティが作成される ⇒ エラー見逃しの原因に ◼ 変数名のタイポなどにより予測しない動作を誘発す るリスクがあるため,廃止 (PHP 8.2でDeprecated警告,PHP 9.0で廃止) ◼ クラスの定義の前に属性 #[AllowDynamicProperties] を指定⇒ 従来の動作 ◼ __get(),__set()メソッド,stdClassは従来どおり利 用できる <?php class Foo { public $item; } $moo = new Foo; $moo->iten = "apple";
  17. 17. null/true/false型の追加 18 https://wiki.php.net/rfc/null-false-standalone-types https://wiki.php.net/rfc/true-type ◼ true. false, nullを独立した型として追加 ◼ 従来はunionの中でのみ使用可: string|false ◼ true|falseは不可(boolと記載) function test(null $v): null { return $v; } class Foo { public true $v = true; public function foo(false $v): false { return $v; } }
  18. 18. Traitsで定数が利用可に 19 https://wiki.php.net/rfc/constants_in_traits ◼ 従来,traitの中での定数を宣言は不可: ⇒ 定数宣言を可能にした ◼ traitで宣言された定数には,クラス定数としてアクセスできる ⇒ traitの定数としてのアクセスは不可 trait Foo { public const CONSTANT = 1; public function bar(): int { return self::CONSTANT; } } class Moo { use Foo; } print(Moo::CONSTANT); // 1 print(Foo::CONSTANT); Fatal error: Traits cannot have constants NG OK
  19. 19. Readonlyクラス属性 20 https://wiki.php.net/rfc/readonly_classes ◼ クラスプロパティの変更ができなくなる. ◼ 動的プロパティ代入は警告ではなく,エラーになる. ◼ プロパティ変数の宣言時に型宣言を省略したり,static宣言を行ったりすることはできない. ◼ 継承先とreadonly属性は一致している必要がある(異なるとエラー発生) <?php readonly class Foo { public int $bar; public function __construct() { $this->bar = 1; } } $foo = new Foo(); $foo->bar = 2; // 致命的エラーを発生
  20. 20. DNFクラスの導入 (1/2) 21 ◼ PHP 8.0で合併型(Union, OR),PHP 8.1で交差型(Intersection, AND)を導入. ◼ DNF (Disjunctive Normal Form, 選言標準形) はAND式をOR式で結合する構造 ⇒合併型(Union, OR)と交差型(Intersection, AND)を結合する型宣言が可能になる. ◼ DNFは正規化された表現形式であり,処理系への負荷が低く,可読性も高い.理論的にあ らゆる組み合わせを表現可能. RFC: https://wiki.php.net/rfc/enumerations interface A {} interface B {} interface C {} interface D { public function show(((A&B)|C $a): (A&B)|C; } A B C
  21. 21. DNFクラスの導入 (2/2) 22 ◼ クラス継承:「共変性(戻り値)と反変性(引数)」の原則が適用される. RFC: https://wiki.php.net/rfc/enumerations A B C ✓ 戻り値:集合を縮小させる型宣言のみ有効 ✓ 引数:集合を拡大させる型宣言のみ有効 interface D { public function show(A&B $a): (A&B)|C; } class Moo implements D { public function show((A&B)|C $a): A&B {} } A B 戻り値: 集合が縮小(OK) 引数: 集合が拡大(OK)
  22. 22. バックトレース出力抑制 23 ◼ 例外・エラー発生時にスタックトレースが表示または記録される ⇒ センシティブな情報(パスワード)が出力・記録されるリスクがある. ◼ #[¥SensitiveParameter] 属性を付与することで出力を抑制 RFC: https://wiki.php.net/rfc/redact_parameters_in_back_traces <?php function db_connect($user, $password) { throw new ¥Exception('Error'); } db_connect('taro', 'secret'); Fatal error: Uncaught Exception: Error in ../test.php:3 Stack trace: #0 ../test.php(6): db_connect('taro',’secret’) #1 {main} thrown in test.php on line 3 <?php function db_connect($user, #[¥SensitiveParameter] $password) { throw new ¥Exception('Error'); }
  23. 23. 乱数実装の改善 24 https://wiki.php.net/rfc/rng_extension ✓ PHPの乱数生成器は状態がグローバルに保持されている. ⇒ランダムな処理を行う内部関数を使うと状態が変化:回帰試験の再現性がなくなる ✓ メルセンヌ・ツイスターは統計的なテスト(CrushおよびBigCrush)をパスできない mt_srand(1234); … var_dump(mt_rand(1, 100)); $engine = new Random¥Engine¥Mt19937(1234); $randomizer = new Random¥Randomizer($engine); 従来の関数 Random¥Randomizer クラス mt_rand(), random_int() getInt() random_bytes() getBytes() shuffle() shuffleArray() str_shuffle() shuffleBytes() str_shuffle('abc’); ✓ 乱数生成用クラスを定義,独立した状態保持が可能になった ✓ 新しい乱数生成エンジンに対応:PCG64 (pcg_onseq-128-xsl-rr-64)またはXoshiro256**
  24. 24. PHP 8.1におけるmbstringの動作修正 26 ◼ PHP 8.1.0において,シフトJIS・Unicode間の文字コード変換がJIS規格(JIS X 0201)に基づく定義に変更された. ◼ 従来はMS社によるデファクト標準に基づいており,過去のコードとの互換性 の問題を発生するため,PHP 8.1.8(7/7リリース)においてリバートされた. echo mb_convert_encoding("¥x5C","UCS2","SJIS"); 0x005C (半角バックスラッシュ) 従来のPHP 0x00A5(円記号) PHP8.1.0~8.1.7 シフトJISの¥をUnicodeに変換
  25. 25. PHP の将来 ◼ PHPスクリプトの用途拡大:Opcache(プリローディング)+JIT+FFIの活用 1. PHPエクステンション:C言語による記述からPHPによる記述へ(FFI) 2. 計算負荷が高いアルゴリズムのPHPによる実装:機械学習・AI等 (PHP-ML, Rubix ML) ⇒ ただし,Rubix MLの例ではTensorエクステンションの方が大幅(約10倍)速い 27 入力処理(C言語) 外部API実行 PHPスクリプト 従来のエクステンション(C言語) 出力処理(C言語) PHP出力 入力処理(PHP) 外部API実行 PHPスクリプト FFIエクステンション(PHP) 出力処理(PHP) PHP出力 https://rubixml.com/ Rubix ML
  26. 26. PHPユーザ相互の情報交換 およびコミュニティの健全な発展 設立趣旨 活動内容 ドキュメント整備 セミナー/イベント メンバー/スタッフ 国際化 Web/SNS • PHPユーザ会員と思ったらメンバー • 運営してみるのも楽しいかも 日本PHPユーザ会 (2000年4月発足) PHPカンファレンス 28 PHP勉強会
  27. 27. 29 ◼ 2022年のPHPカンファレンスは,新型コロナウイルス(COVID-19)感染症拡大 防止に配慮しつつ, 3年ぶりに対面での開催となります. ◼ 今年も,二日間,思う存分お楽しみください! ◼ オンライン開催では「YouTube Live」を利用したライブでのセッションを始め、 オンラインのコンテンツについてもお楽しみください。 PHP Conference Japan 2022

×