phpの今とこれから 2013
DESCRIPTION
PHPカンファレンス2013における講演のプレゼン資料: PHP 5.5の新機能を含むリリース情報、PHP 5.6へ向けての展望など。TRANSCRIPT
PHPとは?
� PHPは主にWebアプリケーションに使用されるスクリプト言語
� 1995年の誕生以来、Webと共に成長
� 244M サイト (39%)のWebサーバーでPHPが実行されている
� TIOBE Programming Community Index : スクリプト言語で1位
http://news.netcraft.com/archives/2013/01/31/php-just-grows-grows.html
PHP アンケート 2013
� 主に使っているPHPのバージョン
1) PHP 4.x-5.1
2) PHP 5.2
3) PHP 5.3
4) PHP 5.4
5) PHP 5.5
6) 使ってない
PHPユーザ分布
引用:W3Techs.com, 2013/9/1版
80.9%
19.1%
2.8%
usage of server-side programming language
PHPASP.NETJavaColdFusionPerl
+3% since 2012/9
57.9%
9.6%
5.8%3.4%
Most popular CMS
WordPressJoomlaDrupalBloggerMagento
PHPバージョン分布
引用:W3Techs.com, 2013/9/1版
PHP 5.3: +15% since 2012/9
6.4%
51.9%
39.3%
Subversions of PHP 5
5.55.45.35.25.15.0
36.5%
58.6%
4.1%
2012/9/8
5.55.45.35.25.1
PHPの歩み
・・・・mbregex・・・・zend-multibyte
2003 2004 2005 2006 2007 2008 2009
4.3・・・・CLI・・・・stream
4.4`02/12 `05/6
・バグ修正・バグ修正・バグ修正・バグ修正`08/8 (EOL)
2010
5.3`09/6
・名前空間・名前空間・名前空間・名前空間・クロージャ・クロージャ・クロージャ・クロージャ・遅延静的束縛・遅延静的束縛・遅延静的束縛・遅延静的束縛・・・・GC改善改善改善改善・・・・MySQLnd
5.6
PHPPHPPHPPHP10101010周年周年周年周年
JPUGJPUGJPUGJPUG10101010周年周年周年周年
フレームワークフレームワークフレームワークフレームワークAJAXAJAXAJAXAJAX
XMLXMLXMLXMLW/S W/S W/S W/S APIAPIAPIAPI
Web/DBWeb/DBWeb/DBWeb/DBセキュリティセキュリティセキュリティセキュリティ
2011 2012PHPconPHPconPHPconPHPcon関西関西関西関西
PHPconPHPconPHPconPHPcon北海道北海道北海道北海道
5.4・・・・Traits- 速度改善速度改善速度改善速度改善- MB対応標準化対応標準化対応標準化対応標準化- 組込み組込み組込み組込みWebサーバサーバサーバサーバ- レガシー機能削除レガシー機能削除レガシー機能削除レガシー機能削除
`12/36.0`10/3 キャンセルキャンセルキャンセルキャンセル
・・・・Unicode
・エンジン・エンジン・エンジン・エンジン/OOP大幅強化:大幅強化:大幅強化:大幅強化:ZE2・・・・XML対応強化対応強化対応強化対応強化(SimpleXML)・・・・Webサービスサービスサービスサービス(SOAP)・・・・DB強化強化強化強化 (SQLite, MySQLi)
`10/12 (EOL)
5.0`04/7
5.1`05/11 5.2
`06/11
・メモリ/速度改善・メモリ/速度改善・メモリ/速度改善・メモリ/速度改善・入力フィルタ・入力フィルタ・入力フィルタ・入力フィルタ・速度改善・速度改善・速度改善・速度改善
・・・・PDO
スマホスマホスマホスマホ
2013
5.5・ジェネレータ・ジェネレータ・ジェネレータ・ジェネレータ- キャッシュキャッシュキャッシュキャッシュ- パスワードハッシュパスワードハッシュパスワードハッシュパスワードハッシュ
`13/6
`13/7 (EOL)
2014
Google App EngineGoogle App EngineGoogle App EngineGoogle App Engine(2013/5)(2013/5)(2013/5)(2013/5)
クラウドクラウドクラウドクラウド
PHP リリースとPHP 5.3 EOL
� リリースサイクル:1年
� ライフサイクル:3年(バグ修正:2年、セキュリティ修正のみ:1年)
� PHP 5.3 のEOLをPHP 5.5リリース時に宣言(2013/6)�セキュリティ修正のみ実施(1年間)
https://wiki.php.net/rfc/releaseprocess
**** pre release phase++++ release lifetime with all bug fixes, no feature addition---- release lifetime security fixes onlyD EOLVersion Time ->
2011 2012 2013 2014 2015 2016 2017| | | | | | | | | | | | |
5.3 +++++++++++++-----D5.4 |*****+++++++++++++++++++++++++-----------D5.5 | | |******++++++++++++++++++++++++-----------D5.6 | | | | |******++++++++++++++++++++++++-----------D6.0 | | | | |******++++++++++++++++++++++++-----------D
https://wiki.php.net/rfc/php53eol
PHPリリース情報
*1 SOAP soap.wsdl_cache_dirにopen_basedirチェック追加*2 SOAP 外部エンティティを含むWSDLにより任意ファイル読み込み*3 quoted_printable_encode()バッファオーバーフロー*4 XMLパーサ ヒープメモリ攻撃脆弱性*5 SSL証明書subjectAltNameヌル文字攻撃脆弱性(偽CA, Ruby)*6 セッション固定化攻撃脆弱性
Release 5.3 5.4 5.5 変更
2013/2/212013/3/14
5.3.225.4.13
CVE-2013-1635 *1, CVE-2013-1643 *2
2013/6/5 5.3.26 5.4.16 CVE-2013-2110 *3
2013/6/20 5.5.0 PHP 5.5リリース
2013/7/11 5.3.27 CVE-2013-4113 *4, PHP 5.3 EOL
2013/8/152013/8/16
5.4.185.5.2
CVE-2013-4113 *4, CVE-2013-4248 *5 CVE-2011-4718 *6
2013/8/22 5.4.19 5.5.3 CVE-2013-4248修正時バッファ初期化バグ
CVE: Common Vulnerabilities and Exposures
PHP 5.5 改善/変更のポイント
�速度改善:5%~10%
�ジェネレータ:反復処理の所要メモリを低減
�パスワードハッシュAPI
�オペコードキャッシュの標準搭載化: Zend OPcache
�いくつかの構文の改善
�セッションアダプション回避(PHP 5.5.2)
PHP 5.5でより速く、快適に
�更なる高速化
Athlon II X4 640 3.0GHz, Ubuntu 13.04
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
PHP 5.3 PHP 5.4 PHP 5.5 PHP 5.6
実行
時間
[s]
Zend/bench.phpstrcat(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
0
5
10
15
20
25
30
PHP 5.3 PHP 5.4 PHP 5.5 PHP 5.6
実行時間
[s]
Zend/micro_bench.php $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
ジェネレータ構文
� ジェネレータ:イテレータを関数で定義(Python)�例:ファイル各行処理: ファイル全体読込み→メモリが大量に必要
<?phpfunction get_line($file) {
$fp = fopen($file, 'r');while (!($line = fgets($fp))) {yield $line;
}fclose($fp);
}
$r0 = memory_get_peak_usage();foreach (get_line('lipsum.txt') as $line);echo memory_get_peak_usage() - $r0, "¥n";$r0 = memory_get_peak_usage();foreach (file('lipsum.txt') as $line);echo memory_get_peak_usage() - $r0, "¥n”;
(https://wiki.php.net/rfc/generators)
大量の反復処理を
行う場合に使用メモリ低減が可能
122680
6872
OPcache オペコードキャッシュ標準化
https://wiki.php.net/rfc/optimizerplus
� Zend Optimizer+をOSS化, PHP 5.5組込を提案(2013/1)
� Zend OPcacheに改名、採用 (2013/3)
�オペコードキャッシュのみサポート、APCより高速(10%以上)
0
10
20
30
40
50
60
70
PHP 5.5
キャッシュなし
OPcache
APC
WordPress 3.6,Ubuntu 13.04
finallyキーワード
(https://wiki.php.net/rfc/finally)
try {echo ”1";throw new Exception("ex");
} catch (Exception $e) {echo ”2";
} finally {echo "#";
}
� finallyブロック:tryブロックから出る際に常に実行される (Java)�例外発生の有無によらない → クリンナップコードを記述
� return等でクリンナップコードがバイパスされることを防止
12#
$hash = password_hash($password, PASSWORD_BCRYPT);
パスワード用ハッシュ
(https://wiki.php.net/rfc/password_hash)�パスワードハッシュ用API
if (password_verify($password, $hash)) {if (password_needs_rehash($password, $algo, $opts);
$hash = password_hash($password, $algo, $opts);}
}
�パスワードのリハッシュ(ハッシュ更新)
PHP < 5.5用:https://github.com/ircmaxell/password_compat
echo password_verify($password, $hash) ? "OK" : "NG";
crypt関数のラッパー:従来はsalt文字列を作るのが面倒だった
生成
検証
function randomHexString($length) {for ($i = 0, $s = ''; $i < $length; ++$i) {
$s .= "0123456789abcdef"[mt_rand(0, 15)]; }return $s;
}echo randomHexString(10);
その他の機能(1)
(https://wiki.php.net/rfc/constdereference)
echo ”123”[1]; echo [1,2,3][2];
ランダムな16進文字列を生成する例
�配列/文字列定数の添字参照
foreach ($users as $user) {list($id, $name) = $user;echo “$id => $name”;
}
foreach ($users as list($id, $name)) {echo “$id => $name”;
}
� foreachでリスト代入が可能に (https://wiki.php.net/rfc/foreachlist)
1e1384a471
2
3
その他の機能(2)
function foo() {return [];
}var_dump(empty(foo()));
� empty()が任意の式をサポート(従来は変数のみ)
Namespace Foo¥Bar;class A {}echo A::class;
� クラス名を ::class で取得可能に
Foo¥Bar¥A
bool(true)
https://wiki.php.net/rfc/empty_isset_exprs
UTF-8 がより安全に
� PHP 5.4以降では、非最短形式のUTF-8を許容しない
� 不正文字がある場合の処理が標準仕様から外れていた
�Bug #65045
� 不正なUTF-8の例: [不正文字] U+24B62 U+24B62
mb_substitute_character(0xFFFD);$s = "¥xf0¥xa4¥xad”. "¥xf0¥xa4¥xad¥xa2"."¥xf0¥xa4¥xad¥xa2";echo mb_convert_encoding($s,"UTF-32","UTF-8");
U+24B62 U+24B62PHP 5.3
U+FFFD U+24B62 U+24B62PHP 5.5.2PHP 5.4.20
U+FFFD U+FFFD U+FFFD U+FFFD U+24B62PHP 5.5.1PHP 5.4.19
JSONライセンス事件
�JSONライセンスがGPL非互換と判定される
The Software shall be used for Good, not Evil.
�Linuxディストロ(Debian等)がJSON拡張を外す
�https://wiki.php.net/rfc/free-json-parser
�JSON関数を使う際の回避策:
1.ソースコードからビルド
2.pecl/json-c
PHP 5.6
�リリース: 2014/6 (?)
�PHP 5.5と同様に小幅な改訂の見込み
�RFC(http://wiki.php.net/rfc)を参照
�内部演算子オーバーロード実装とGMP改善
�セッション処理改善(by 大垣さん)
FR #17860 セッション変更の自動検出
内部演算子オーバーロード/GMP改善
(https://wiki.php.net/rfc/operator_overloading_gmp)
�内部演算子オーバーロードの仕組み
$c = gmp_add($a, $b); $c = $a + $b;
� GMPのキャスト、ダンプ、シリアル化を可能にする
$c = gmp_init(42);echo $c; // 42var_dump((string)$c); // string(2) “42var_dump($s = serialize($c)); // string(33) “0:3:”GMP”:1:{s:3:”num”;s:2:”42”;}”
PHP開発の今
PHPは歯ブラシのようなもの。いつも使う役に立つシンプルなツールだけど、誰も歯ブラシのことなんて気にしないよね。PHPは「問題を解くためのシンプルなツール」なのさ。
(http://en.wikiquote.org/wiki/Rasmus_Lerdorf)Rasmus語録
PHP開発にはロードマップがない?
PHP Parser by Nikita Popovhttps://github.com/nikic/PHP-Parser
PHPerには言語愛がないのか?
・PHPは既に熟成期にあり、新機能は既存の機能と干渉する可能性がある-> RFCは否定的な意見を受ける: Anthony氏開発離脱宣言・ロードマップを示すと提案の自由度を縛ってしまう
PHPの未来
php
frameworkapplications / plugins
pecl
users
� TIOBE index : ZF2がPHP人気上昇の理由と分析→ WordPressを始めとするアプリの広がりが理由では?�Webの進化に柔軟に対応�高性能かつ現実的な解を提供する
� スケーラブル:ブログから最大級のSNSサイトまで
PHPユーザ相互の情報交換およびユーザ相互の情報交換およびユーザ相互の情報交換およびユーザ相互の情報交換およびコミュニティの健全な発展コミュニティの健全な発展コミュニティの健全な発展コミュニティの健全な発展
設立趣旨設立趣旨設立趣旨設立趣旨
• 高性能高性能高性能高性能Webミドルウエアへのニーズ増大ミドルウエアへのニーズ増大ミドルウエアへのニーズ増大ミドルウエアへのニーズ増大• オープンソースソフトウエアの発展オープンソースソフトウエアの発展オープンソースソフトウエアの発展オープンソースソフトウエアの発展
背景背景背景背景
国内国内国内国内PHPPHPPHPPHPユーザの増加ユーザの増加ユーザの増加ユーザの増加
活動内容活動内容活動内容活動内容
ドキュメント整備ドキュメント整備ドキュメント整備ドキュメント整備
セミナー/イベントセミナー/イベントセミナー/イベントセミナー/イベント
メンバー/スタッフメンバー/スタッフメンバー/スタッフメンバー/スタッフ国際化国際化国際化国際化
http://www.php.gr.jp/Web
・・・・PHPユーザ会員と思ったらメンバーユーザ会員と思ったらメンバーユーザ会員と思ったらメンバーユーザ会員と思ったらメンバー・運営するのも楽しいかも・運営するのも楽しいかも・運営するのも楽しいかも・運営するのも楽しいかも
日本PHPユーザ会
(2000年年年年4月発足月発足月発足月発足)
phpphpphpphp----users, users, users, users, phpphpphpphp----devdevdevdev, , , , phpphpphpphp----doc, doc, doc, doc, phpugphpugphpugphpug----adminadminadminadmin
メーリングリストメーリングリストメーリングリストメーリングリスト