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