phpコアから読み解くphp5.5
DESCRIPTION
PHPカンファレンス2014にて発表した内容です。TRANSCRIPT
1
ヤフー株式会社
蒋池 東龍
(こもいけ とうりゅう)
PHPコアから読み解く PHP5.5
2
レジュメ
• 最初に(1分)
• PHPコアとは?(3分)
• PHP5.5の主な新機能や変更点(2分)
• yield のコスト(10分)
• boolval() の可否(8分)
• zend_execute の実体化(5分)
• 終わりに(1分)
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
3 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
最初に
4
最初に
PHP5.5 以上を使っていますか?
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
5
最初に
PHPコア という言葉を
聞いたことがありますか?
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
6
最初に
Zend Engine という言葉を
聞いたことがありますか?
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
7 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
PHPコアとは?
8
PHPコアとは?
PHPコアは
PHPの内部システムで
C言語によって
記述されています
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
9
PHPコアとは?
PHPコアの
言語エンジンは
Zend Engine
と呼ばれています
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
10
PHPコアとは?
Zend Engine は
PHPスクリプトを
字句解析・構文解析して
オペコードと呼ばれる
命令を作り出して実行します
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
11
PHPコアとは?
OS
Apache
Apacheモジュール
PHPフレームワーク
zendライブラリ
phpライブラリ
モジュール スクリプト
PHPコア
php_* ライブラリ
zend_* ライブラリ
Zend Engine
字句解析 構文解析 実行
オペコード
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
12
PHPコアとは?
PHPコアを知れば
PHPがどのように
動いているのか
理解できます
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
13 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
PHP5.5の主な新機能や変更点
14
PHP5.5の主な新機能や変更点
PHP5.5の主な
新機能や変更点は
次の通りでした
(2014/8/28 に
PHP5.6 が current stable)
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
15
PHP5.5の主な新機能や変更点
• ジェネレーターの追加
• finally キーワードの追加
• 新しいパスワードハッシュAPI(password_*)追加
• foreach が list() に対応
• empty() が任意の式に対応
• array リテラルと string リテラルのデリファレンス
• OPcache 拡張モジュールの追加
• array_column() 追加
• boolval() 追加
• json_last_error_msg() 追加
• zend_execute() オーバーライド不可
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
16
PHP5.5の主な新機能や変更点
• ジェネレーターの追加 ← 新構文
• finally キーワードの追加
• 新しいパスワードハッシュAPI(password_*)追加
• foreach が list() に対応
• empty() が任意の式に対応
• array リテラルと string リテラルのデリファレンス
• OPcache 拡張モジュールの追加
• array_column() 追加
• boolval() 追加 ← 新関数
• json_last_error_msg() 追加
• zend_execute() オーバーライド不可 ← 内部変更点
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
17
PHP5.5の主な新機能や変更点
赤字の項目について
利用の是非や注意点を
PHPコアの観点から
ご紹介します!
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
18 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
yield のコスト
19
yield のコスト
yield を使っている方はいますか?
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
20
yield のコスト
yield は簡単に
イテレータを
実装できる機能です
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
21
yield のコスト
イテレータは
データの要素に
アクセスするための
仕組みです
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
22
yield のコスト
3つのファイルに
それぞれ別の処理を行う
スクリプトを例にとって
みてみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
23
yield のコスト
yield を使わないスクリプト
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
24
yield のコスト
$file = fopen('./sample1.txt', 'r');
while(false !== ($line = fgets($file) ) ){
$line = trim($line);
$text = $tmp . $line . "¥n";
echo($text); $tmp = $line;
}
fclose($file);
現在の行に前の行を
加えて表示 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
25
yield のコスト
$file = fopen('./sample2.txt', 'r');
while(false !== ($line = fgets($file) ) ){
$line = trim($line);
$text = strtoupper($line) . "¥n";
echo($text);
}
fclose($file);
現在の行を
大文字にして表示
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
26
yield のコスト
$file = fopen('./sample3.txt', 'r');
while(false !== ($line = fgets($file) ) ){
$line = trim($line);
$text = $line . ':' . md5($line) . "¥n";
echo($text);
}
fclose($file);
現在の行と
md5 を表示
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
27
yield のコスト
ファイルをオープンして
1行ずつ読み込み
ファイルをクローズする
処理を毎回行っています
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
28
yield のコスト
yield を使ったスクリプト
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
29
yield のコスト
function file_lines($_filename){
$file = fopen($_filename, 'r');
while(false !== ($line = fgets($file) ) ){
$line = trim($line);
yield $line;
}
fclose($file);
}
ファイルをオープンして
1行ずつ読み込み
ファイルをクローズ Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
30
yield のコスト
foreach(file_lines('./sample1.txt') as $line){
$text = $tmp . $line . "¥n";
echo($text);
$tmp = $line;
} 現在の行に前の行を
加えて表示
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
31
yield のコスト
foreach(file_lines('./sample2.txt') as $line){
$text = strtoupper($line) . "¥n";
echo($text);
}
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
現在の行を
大文字にして表示
32
yield のコスト
foreach(file_lines('./sample3.txt') as $line){
$text = $line . ':' . md5($line) . "¥n";
echo($text);
} 現在の行と
md5 を表示
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
33
yield のコスト
yield を使えば
共通するイテレーション処理を
1度定義するだけでよいです
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
34
yield のコスト
yield を使わない
スクリプトの
オペコードを
確認してみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
35
yield のコスト
0 SEND_VAL
1 SEND_VAL
2 DO_FCALL
3 ASSIGN
4 SEND_VAR
5 DO_FCALL
6 ASSIGN
7 IS_NOT_IDENTICAL
8 JMPZ
9 SEND_VAR
10 DO_FCALL
11 ASSIGN
12 CONCAT
13 CONCAT
14 ASSIGN
15 ECHO
16 ASSIGN
17 JMP
18 SEND_VAR
19 DO_FCALL
……
60 RETURN
オペコードは
60個
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
36
yield のコスト
yield を使った
スクリプトの
オペコードを
確認してみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
37
yield のコスト
0 RECV
1 SEND_VAR
2 SEND_VAL
3 DO_FCALL
4 ASSIGN
5 SEND_VAR
6 DO_FCALL
7 ASSIGN
8 IS_NOT_IDENTICAL
9 JMPZ
10 SEND_VAR
11 DO_FCALL
12 ASSIGN
13 YIELD
14 JMP
15 SEND_VAR
16 DO_FCALL
17 GENERATOR_RETURN
関数の
オペコードは
17個
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
38
yield のコスト
0 INIT_FCALL_BY_NAME
1 SEND_VAL
2 DO_FCALL_BY_NAME
3 FE_RESET
4 FE_FETCH
5 OP_DATA
6 ASSIGN
7 CONCAT
8 CONCAT
9 ASSIGN
10 ECHO
11 ASSIGN
12 JMP
13 SWITCH_FREE
……
44 NOP
45 RETURN
メイン処理の
オペコードは45個
全部で62個 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
39
yield のコスト
yield を使ったスクリプトと
使わないスクリプトの
処理速度を比べてみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
40
yield のコスト
……と、その前に
どちらの方が早いと
思いますか?
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
41
yield のコスト
yield を使うスクリプト
0.0034639835357666 usec
yield を使わないスクリプト
0.004425048828125 usec
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
42
yield のコスト
yield を使うと……
• コードがすっきりする
• 処理が速くなる (遅くならない)
• オペコードは短くならない (共通部分に依存する)
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
43
yield のコスト
簡単にイテレータを
実装できるので
積極的に使いましょう!
結論
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
44 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
boolval() の可否
45
boolval() の可否
boolval() を使っている方はいますか?
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
46
boolval() の可否
boolval() は
boolean として
値を取得できる
関数です
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
47
boolval() の可否
値の型を変換する
cast と
同じ機能です
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
48
boolval() の可否
様々な型の値を
変換するスクリプトを
例にとってみてみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
49
boolval() の可否
cast を使ったスクリプト
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
$max = 1000; $arr = array('aaa', 'bbb' , 'ccc'); class A{}; $ca = new A(); for($i = 0; $i < $max; $i++){ $ret = (bool)(1000); $ret = (bool)('abc'); $ret = (bool)($arr); $ret = (bool)($ca); }
50
boolval() の可否
色々な値を
cast
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
51
boolval() の可否
boolval() を使ったスクリプト
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
$max = 1000; $arr = array('aaa', 'bbb' , 'ccc'); class A{}; $ca = new A(); for($i = 0; $i < $max; $i++){ $ret = boolval(1000); $ret = boolval('abc'); $ret = boolval($arr); $ret = boolval($ca); }
52
boolval() の可否
色々な値を
boolval()
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
53
boolval() の可否
cast を使った
スクリプトの
オペコードを
みてみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
54
boolval() の可否
……
16 CAST
17 ASSIGN
18 CAST
19 ASSIGN
20 CAST
21 ASSIGN
22 CAST
23 ASSIGN
24 JMP
25 RETURN
オペコードは
25個
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
55
boolval() の可否
boolval() を
使ったスクリプトの
オペコードを
みてみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
56
boolval() の可否
……
16 SEND_VAL
17 DO_FCALL
18 ASSIGN
19 SEND_VAL
20 DO_FCALL
21 ASSIGN
22 SEND_VAR
23 DO_FCALL
24 ASSIGN
25 SEND_VAR
26 DO_FCALL
27 ASSIGN
28 JMP
29 RETURN
オペコードは
29個
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
57
boolval() の可否
cast を使ったスクリプトと
boolval() を使ったスクリプトの
処理速度を比べてみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
58
boolval() の可否
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
……と、その前に
どちらの方が早いと
思いますか?
59
boolval() の可否
boolval() を使ったスクリプト
0.0013551712036133 usec
cast を使ったスクリプト
0.0006558895111084 usec
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
60
boolval() の可否
boolval() を使うと……
• コールバックとして渡せる
• 処理が遅くなる
• オペコードが多くなる
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
61
boolval() の可否
できる限り
cast を使いましょう!
結論
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
62 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
zend_execute の実体化
63
zend_execute の実体化
execute 系関数は
オペコードを実行する
非常に重要な関数です
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
64
zend_execute の実体化
実行処理を
オーバーライドする時に
熟知が必要です
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
65
zend_execute の実体化
PHP5.5 以前と以後では
扱い方が異なるので
みてみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
66
zend_execute の実体化
PHP5.5 以前
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
// execute は関数 ZEND_API void execute( zend_op_array *op_array TSRMLS_DC); // zend_execute は関数ポインタ ZEND_API void (*zend_execute)( zend_op_array *op_array TSRMLS_DC);
67
zend_execute の実体化
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
// zend_execute に execute を代入 zend_execute = execute; // zend_execute を実行 zend_execute(...);
68
zend_execute の実体化
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
69
zend_execute の実体化
PHP5.5 以後
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
// execute_ex は関数 ZEND_API void execute_ex( zend_execute_data *execute_data TSRMLS_DC) // zend_execute_ex は関数ポインタ ZEND_API void (*zend_execute_ex)( zend_execute_data *execute_data TSRMLS_DC);
70
zend_execute の実体化
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
// zend_execute_ex に execute_ex を代入 zend_execute_ex = execute_ex; // zend_execute は zend_execute_exを実行する関数 ZEND_API void zend_execute( zend_op_array *op_array TSRMLS_DC); // zend_execute を実行 zend_execute(...);
71
zend_execute の実体化
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
72
zend_execute の実体化
PHP5.5 以前と以後の
execute 系関数を
比べてみましょう
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
73
zend_execute の実体化
シンボル 説明 PHP5.5 以前
PHP5.5 以後
execute_ex 関数の実体 × ○
zend_execute_ex execute_ex を代入 × △
execute 関数の実体 ○ ×
zend_execute PHP5.5 以前と 以後で存在するが 扱いは異なる
△ ○
○:関数 △:関数ポインタ ×:なし
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
74
zend_execute の実体化
役割 PHP5.5 以前 PHP5.5 以後
実行関数 execute execute_ex
関数ポインタ zend_execute zend_execute_ex
ラッパー関数 - zend_execute
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
内部的な _ex 系関数に移行したが
zend_execute は健在
75
zend_execute の実体化
zend_execute()
↓
(*zend_execute_ex)() = execute_ex()
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
76
zend_execute の実体化
実行処理を
オーバーライド
したければ……
• zend_execute_ex に 関数のポインタを代入する
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
77
zend_execute の実体化
execute 系関数の
取り扱いに
気を付けましょう!
結論
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
78 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
終わりに
79
終わりに
構文や関数について
新しい気付きや興味は
得られましたか?
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
80
終わりに
PHP に対する
理解が深まるので
PHPコアについて
是非興味をもってください!
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
81
ありがとうございました
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
82
!
Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
83 Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved. 無断引用・転載禁止
Yahoo! JAPANブースにお立ち寄りください
アンケートにご回答いただいた方に
Yahoo! JAPANオリジナルグッズを
差し上げています