Enviar pesquisa
Carregar
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
•
10 gostaram
•
14,547 visualizações
Yoshio Hanawa
Seguir
第六回闇PHP勉強会発表資料
Leia menos
Leia mais
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 40
Baixar agora
Baixar para ler offline
Recomendados
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
Yoshio Hanawa
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
php-src の歩き方
php-src の歩き方
do_aki
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話
Rui Hirokawa
Zend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探る
Yoshio Hanawa
Recomendados
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
Yoshio Hanawa
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki
php-src の歩き方
php-src の歩き方
do_aki
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話
Rui Hirokawa
Zend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探る
Yoshio Hanawa
Protocol Buffers 入門
Protocol Buffers 入門
Yuichi Ito
What's new in Spring Batch 5
What's new in Spring Batch 5
ikeyat
SPAのルーティングの話
SPAのルーティングの話
ushiboy
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察
Yoshiki Shibukawa
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Cloudera Japan
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
RESTfulとは
RESTfulとは
星影 月夜
Twitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids
オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務
Yutaka Kachi
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
OPcache の最適化器の今
OPcache の最適化器の今
y-uti
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
Akihiko Matuura
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
Java8でRDBMS作ったよ
Java8でRDBMS作ったよ
なおき きしだ
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
infinite_loop
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
Quick tour of PHP from inside
Quick tour of PHP from inside
julien pauli
PHP の GC の話
PHP の GC の話
y-uti
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
Satoru Yoshida
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
Akishige TAKEKOSHI
Mais conteúdo relacionado
Mais procurados
Protocol Buffers 入門
Protocol Buffers 入門
Yuichi Ito
What's new in Spring Batch 5
What's new in Spring Batch 5
ikeyat
SPAのルーティングの話
SPAのルーティングの話
ushiboy
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察
Yoshiki Shibukawa
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Cloudera Japan
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
RESTfulとは
RESTfulとは
星影 月夜
Twitterのsnowflakeについて
Twitterのsnowflakeについて
moai kids
オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務
Yutaka Kachi
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
Shohei Okada
OPcache の最適化器の今
OPcache の最適化器の今
y-uti
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
Akihiko Matuura
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
Java8でRDBMS作ったよ
Java8でRDBMS作ったよ
なおき きしだ
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
infinite_loop
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
Quick tour of PHP from inside
Quick tour of PHP from inside
julien pauli
PHP の GC の話
PHP の GC の話
y-uti
Mais procurados
(20)
Protocol Buffers 入門
Protocol Buffers 入門
What's new in Spring Batch 5
What's new in Spring Batch 5
SPAのルーティングの話
SPAのルーティングの話
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
PHP AST 徹底解説
PHP AST 徹底解説
RESTfulとは
RESTfulとは
Twitterのsnowflakeについて
Twitterのsnowflakeについて
オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
OPcache の最適化器の今
OPcache の最適化器の今
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
Java8でRDBMS作ったよ
Java8でRDBMS作ったよ
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
Quick tour of PHP from inside
Quick tour of PHP from inside
PHP の GC の話
PHP の GC の話
Destaque
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
Satoru Yoshida
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
Akishige TAKEKOSHI
php7's ast
php7's ast
do_aki
PHP-FPMとuWSGI——mod_php以外の選択肢を探る
PHP-FPMとuWSGI——mod_php以外の選択肢を探る
Yoshio Hanawa
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
Yoshio Hanawa
PHPNGの動向
PHPNGの動向
Yoshio Hanawa
PHP 5.5 Zend OPcache
PHP 5.5 Zend OPcache
Masashi Shinbara
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説する
Yoshio Hanawa
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
Yoshio Hanawa
Laungage Update PHP編
Laungage Update PHP編
Yoshio Hanawa
家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう
Yoshio Hanawa
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作る
Yoshio Hanawa
PHP7はなぜ速いのか
PHP7はなぜ速いのか
Yoshio Hanawa
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
Yoshio Hanawa
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
Yoshio Hanawa
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf Conference
Inside pixiv's infrastructure〜application cluster side〜
Inside pixiv's infrastructure〜application cluster side〜
Tatsuhiko Kubo
PHPのキャッシュを使いこなせ!
PHPのキャッシュを使いこなせ!
Kentaro Ohkouchi
Sinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPython
kuroneko1988
ZF2 for the ZF1 Developer
ZF2 for the ZF1 Developer
Gary Hockin
Destaque
(20)
Zend framework 3 と zend expressive の話
Zend framework 3 と zend expressive の話
SQLite2と3のエスケープ関数の違いとその対策
SQLite2と3のエスケープ関数の違いとその対策
php7's ast
php7's ast
PHP-FPMとuWSGI——mod_php以外の選択肢を探る
PHP-FPMとuWSGI——mod_php以外の選択肢を探る
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
PHPNGの動向
PHPNGの動向
PHP 5.5 Zend OPcache
PHP 5.5 Zend OPcache
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説する
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
Laungage Update PHP編
Laungage Update PHP編
家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作る
PHP7はなぜ速いのか
PHP7はなぜ速いのか
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
Inside pixiv's infrastructure〜application cluster side〜
Inside pixiv's infrastructure〜application cluster side〜
PHPのキャッシュを使いこなせ!
PHPのキャッシュを使いこなせ!
Sinatra風マイクロフレームワークで始めるPython
Sinatra風マイクロフレームワークで始めるPython
ZF2 for the ZF1 Developer
ZF2 for the ZF1 Developer
Semelhante a OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
Ryuji Yamashita
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
Rui Hirokawa
play framework 勉強会 in 関西
play framework 勉強会 in 関西
Shinichi Kozake
Hive undocumented feature
Hive undocumented feature
tamtam180
behatエクステンションの作り方
behatエクステンションの作り方
Ryo Tomidokoro
コード読経会報告書
コード読経会報告書
Masahiko Toyoshi
Php in ruby
Php in ruby
do_aki
Webサーバのチューニング
Webサーバのチューニング
Yu Komiya
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料
Junichi Ishida
誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築
Hiroshi Yamato
Php5.4
Php5.4
ke-m kamekoopa
Re: WebServer BenchMarking
Re: WebServer BenchMarking
Ryo Tomidokoro
Java EE7 䛸㻌JCache
Java EE7 䛸㻌JCache
maruyama097
PHP基礎勉強会
PHP基礎勉強会
Yuji Otani
Alfrescoクラスタリング入門
Alfrescoクラスタリング入門
Ashitaba YOSHIOKA
OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門
irix_jp
PHP With Windows binary
PHP With Windows binary
Masahiko Sakamoto
ChefユーザのためのAnsible入門
ChefユーザのためのAnsible入門
Mahito Ogura
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話
侑弥 濱田
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
純生 野田
Semelhante a OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
(20)
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
play framework 勉強会 in 関西
play framework 勉強会 in 関西
Hive undocumented feature
Hive undocumented feature
behatエクステンションの作り方
behatエクステンションの作り方
コード読経会報告書
コード読経会報告書
Php in ruby
Php in ruby
Webサーバのチューニング
Webサーバのチューニング
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料
誰でも出来るosxでのローカルなウェブ開発環境構築
誰でも出来るosxでのローカルなウェブ開発環境構築
Php5.4
Php5.4
Re: WebServer BenchMarking
Re: WebServer BenchMarking
Java EE7 䛸㻌JCache
Java EE7 䛸㻌JCache
PHP基礎勉強会
PHP基礎勉強会
Alfrescoクラスタリング入門
Alfrescoクラスタリング入門
OSC2011Tokyo/Fall OpenStack Swift入門
OSC2011Tokyo/Fall OpenStack Swift入門
PHP With Windows binary
PHP With Windows binary
ChefユーザのためのAnsible入門
ChefユーザのためのAnsible入門
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
Mais de Yoshio Hanawa
自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた
Yoshio Hanawa
Zend VMにおける例外の実装
Zend VMにおける例外の実装
Yoshio Hanawa
Zend VMにおける例外の実装
Zend VMにおける例外の実装
Yoshio Hanawa
ぼくのかんがえる さいきょうの銀行振込
ぼくのかんがえる さいきょうの銀行振込
Yoshio Hanawa
「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」
Yoshio Hanawa
浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話
Yoshio Hanawa
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったこと
Yoshio Hanawa
GitHubからお金をもらった話
GitHubからお金をもらった話
Yoshio Hanawa
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
Yoshio Hanawa
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話
Yoshio Hanawa
PHPの正規表現と最長一致
PHPの正規表現と最長一致
Yoshio Hanawa
zval をダイエットしてみた
zval をダイエットしてみた
Yoshio Hanawa
浮動小数点数の話 2013年度版
浮動小数点数の話 2013年度版
Yoshio Hanawa
Testing PHP extension on Travis CI
Testing PHP extension on Travis CI
Yoshio Hanawa
php-timecopを実戦投入してみた
php-timecopを実戦投入してみた
Yoshio Hanawa
PHPエクステンションの開発tips
PHPエクステンションの開発tips
Yoshio Hanawa
PHPで時間旅行をする方法
PHPで時間旅行をする方法
Yoshio Hanawa
Mais de Yoshio Hanawa
(17)
自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた
Zend VMにおける例外の実装
Zend VMにおける例外の実装
Zend VMにおける例外の実装
Zend VMにおける例外の実装
ぼくのかんがえる さいきょうの銀行振込
ぼくのかんがえる さいきょうの銀行振込
「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」
浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったこと
GitHubからお金をもらった話
GitHubからお金をもらった話
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話
PHPの正規表現と最長一致
PHPの正規表現と最長一致
zval をダイエットしてみた
zval をダイエットしてみた
浮動小数点数の話 2013年度版
浮動小数点数の話 2013年度版
Testing PHP extension on Travis CI
Testing PHP extension on Travis CI
php-timecopを実戦投入してみた
php-timecopを実戦投入してみた
PHPエクステンションの開発tips
PHPエクステンションの開発tips
PHPで時間旅行をする方法
PHPで時間旅行をする方法
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
1.
Reading implementation of
OPcache’s file-based cache OPcacheの新機能 ファイルベースキャッシュ の内部実装を読んでみた 第六回闇PHP勉強会(2015/11/22) 発表資料
2.
自己紹介 ❖ @hnw ❖ 所属:KLab株式会社 ❖
カレーとバグが大好物 ❖ 最近PHP7のプレゼンばかりしています
3.
アジェンダ ❖ ファイルベースキャッシュの紹介 ❖ キャッシュファイルを覗いてみる ❖
わきあがる疑問点 ❖ まとめ
4.
❖ ファイルベースキャッシュの紹介 ❖ キャッシュファイルを覗いてみる ❖
わきあがる疑問点 ❖ まとめ
5.
OPcacheのおさらい ❖ OPcacheなしのPHP Parser Lexer OpcodeCompiler ZendVM PHP token AST opcode
6.
OPcacheのおさらい ❖ OPcache拡張モジュールを使った場合 ❖ キャッシュヒットすると前段の処理を省略できる Parser Lexer OpcodeCompiler ZendVM Optimizer PHP token AST opcode opcode OpcodeCache opcode
7.
ファイルベースキャッシュ ❖ OPcacheの新機能 ❖ PHP
7.0.0 alpha 1で実装 ❖ まだexperimental扱い ❖ PHPのコンパイル結果をファイルにキャッシュする ❖ 従来は共有メモリにキャッシュしていた
8.
ファイルベースキャッシュ ❖ ファイルベースキャッシュを有効にしたOPcache Parser Lexer OpcodeCompiler ZendVM Optimizer PHP token AST opcode opcode FileCacheSHMCache
9.
ファイルベースキャッシュの利点 ❖ 共有メモリとファイルの両キャッシュを併用する場合 ❖ 共有メモリにキャッシュが無いときの速度低下を最 低限に抑える(Webサーバ再起動直後など) ❖
ファイルキャッシュのみ使う場合 ❖ コマンドラインやCGIなどでも速度が稼げる
10.
ファイルベースキャッシュの利点 http://talks.php.net/tokyo15#/php7pcache1
11.
❖ ファイルベースキャッシュの紹介 ❖ キャッシュファイルを覗いてみる ❖
わきあがる疑問点 ❖ まとめ
12.
実際に試してみる ❖ opcache.file_cache! ❖ 未設定:
ファイルベースキャッシュ無効(デフォルト) ❖ パスを設定: 共有メモリ・ファイル両方有効 opcache.enable=1! opcache.enable_cli=1! opcache.file_cache=/var/tmp/php/opcache
13.
キャッシュファイルのパス ❖ /tmp/foo.phpのキャッシュを探してみた /var/tmp/php/opcache/68359b54ec757c2697b328c10d7d44c2/ tmp/foo.php.bin ❖ フルパス+「.bin」にキャッシュされる
14.
キャッシュファイルのパス ❖ /tmp/foo.phpのキャッシュを探してみた /var/tmp/php/opcache/68359b54ec757c2697b328c10d7d44c2/ tmp/foo.php.bin ❖ フルパス+「.bin」にキャッシュされる ❖
このハッシュ値は何だ???
15.
パス中のハッシュ値の正体 ❖ このハッシュ値を作っているのは ext/opcache/ZendAccelerator.c の
accel_gen_system_id() ❖ PHPバージョン・ZTSが有効か・int型やlong型のサイ ズなどを含んだ文字列のMD5値 ❖ PHPをバージョンアップすると別のパスになる /var/tmp/php/opcache/68359b54ec757c2697b328c10d7d44c2/ tmp/foo.php.bin
16.
キャッシュファイルの中身(1) <?php phpinfo(); 000000 4f
50 43 41 43 48 45 00 36 38 33 35 39 62 35 34 >OPCACHE.68359b54<! 000010 65 63 37 35 37 63 32 36 39 37 62 33 32 38 63 31 >ec757c2697b328c1<! 000020 30 64 37 64 34 34 63 32 e0 02 00 00 00 00 00 00 >0d7d44c2à.......<! 000030 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > ...............<! 000040 4f 48 50 56 00 00 00 00 12 19 ee 32 01 00 00 00 >OHPV......î2....<! 000050 c0 01 00 00 00 00 00 00 02 00 00 00 00 00 00 08 >À...............<! ……! 000330 01 00 00 00 06 06 00 00 f9 e0 f8 ab b5 d0 00 80 >........ùàø«µÐ..<! 000340 07 00 00 00 00 00 00 00 70 68 70 69 6e 66 6f 00 >........phpinfo.< phpinfo.php phpinfo.php.bin
17.
なるほど、 わからん!
18.
キャッシュファイルの中身(2) ❖ 意外とデカいぞ…? (.php 17bytes
→ .php.bin 848bytes) ❖ 中身を調べよう!
19.
キャッシュファイルの中身(3) ❖ 内部的なデータ構造をそのまま書き出している ❖ zend_file_cache_metainfo構造体 ❖
zend_persistent_script構造体 ❖ 固定文字列(zend_string)の配列
20.
zend_file_cache_metainfo構造体 typedef struct _zend_file_cache_metainfo
{! char magic[8]; // "OPCACHE0"! char system_id[32]; // accel_gen_system_id()! size_t mem_size; // size of serialized script! size_t str_size; // size of interned string! size_t script_offset; // ?! accel_time_t timestamp; // script->timestamp! uint32_t checksum;! } zend_file_cache_metainfo; ❖ メンバ system_id には先ほど見たハッシュ値が入る! ❖ キャッシュを読む際、これをチェックする ❖ 異なるバージョン間でキャッシュの使い回しはできない
21.
zend_persistent_script構造体 typedef struct _zend_persistent_script
{! ! zend_string *full_path;! ! zend_op_array main_op_array;! ! HashTable function_table;! ! HashTable class_table;! ……! } zend_persistent_script; ❖ スクリプトのコンパイル結果を管理するOPcacheの構造体 ❖ 共有メモリ上に置かれているキャッシュそのもの
22.
固定文字列だけ別管理 ❖ OPcacheの管理上、プログラム中の固定文字列は zend_persistent_script構造体とは別管理になる ❖ 全プロセスで固定文字列を共有する仕組みがある (interned
string & そのキャッシュ) ❖ 別途取り出してファイルに書き出す
23.
ポインタのシリアライズ(1) ❖ ファイルキャッシュの概要 ❖ 構造体をそのままファイルに保存 ❖
ファイルから構造体を復元
24.
ポインタのシリアライズ(1) ❖ ファイルキャッシュの概要 ❖ 構造体をそのままファイルに保存 ❖
ファイルから構造体を復元 ❖ 簡単そうに思えるが、自明でない点がある ❖ メモリアドレスは実行ごとに変わる ❖ 保存・復元のため「シリアライズ」する必要がある
25.
ポインタのシリアライズ(2) ❖ 発想としては単純 #define SERIALIZE_PTR(ptr)
do { ! ! ! if (ptr) { ! ! ! ! ZEND_ASSERT(IS_UNSERIALIZED(ptr)); ! ! ! ! (ptr) = (void*)((char*)(ptr) - (char*)script->mem); ! ! ! } ! ! } while (0)! #define UNSERIALIZE_PTR(ptr) do { ! ! ! if (ptr) { ! ! ! ! ZEND_ASSERT(IS_SERIALIZED(ptr)); ! ! ! ! (ptr) = (void*)((char*)buf + (size_t)(ptr)); ! ! ! } ! ! } while (0)
26.
ポインタのシリアライズ(2) ❖ 発想としては単純 ❖ バッファ先頭からの相対値に変換する ❖
全部のポインタ値が比較的小さい値になる ❖ ポインタ値が小さい=シリアライズ済と見なす
27.
ポインタのシリアライズ(3) ❖ 仕組みは単純でも実際は面倒 ❖ PHP配列の中の配列→ポインタの先にポインタ ❖
全部のポインタを変換することになる ❖ 関連する全データ構造のシリアライズ・アンシリアライ ズ関数が実装されている ❖ op_array、zval、配列、関数、AST ❖ 何か別の応用が可能かもしれない
28.
❖ ファイルベースキャッシュの紹介 ❖ キャッシュファイルを覗いてみる ❖
わきあがる疑問 ❖ まとめ
29.
わきあがる疑問 ❖ Pythonでいう.pycを我々は手に入れたのか? ❖ 性能面でそこまで嬉しいのか? ❖
他の応用はあるか? ❖ セキュリティ面は大丈夫か?
30.
Pythonでいう.pycを我々は手に入れたのか? ❖ .pyc は互換性を考えて作られている ❖
近いバージョンなら別サーバにもデプロイ可能 ❖ コンパイル済みバイナリに準ずる扱い ❖ .php.bin は少しでもバージョンが変わると使えない ❖ 構造体をベタに保存しているので、構造体メンバの順 序を入れ替えただけで作り直しになる ❖ あくまでキャッシュ
31.
性能面でそこまで嬉しいのか? ❖ CLIやCGIだとプロセス生成のコストの方が高い気が? ❖ 高負荷Webサービスでは、従来通りウォームアップ後 にロードバランサ配下に組み込む方が無難では? ❖
個人的にはユースケースがイマイチ見えない…
32.
他の応用はあるか? ❖ オススメしないが、なんちゃって難読化に使える ❖ .php.bin
だけをデプロイ又は納品するなど ❖ 理屈上は逆コンパイルも可能、難読化とは呼べない ❖ 運用で死ぬ未来が見える
33.
セキュリティ面は大丈夫か? ❖ ダメかも… ❖ キャッシュファイルはWebサーバ権限で書き込める ❖
他の脆弱性を利用してキャッシュファイルを上書き& 再起動を待てば任意スクリプトが実行可能 (発動条件が厳しめではあるが…)
34.
❖ ファイルベースキャッシュの紹介 ❖ キャッシュファイルを覗いてみる ❖
疑問点 ❖ まとめ
35.
まとめ ❖ OPcacheのファイルベースキャッシュを調べました ❖ 共有メモリのキャッシュをシリアライズしてファイル 化するような仕組みでした ❖
手元で生成してデプロイするにはあまり向いていない ❖ あくまでキャッシュと考えた方が良さそう ❖ 今後の動きを注視していきたい
36.
ご静聴 ありがとう ございました
37.
…
38.
以降、 補足スライド
39.
ファイルの更新チェック ❖ opcache.validate_timestamps! ❖ 1:
タイプスタンプのチェックを行う(デフォルト) ❖ .php と .php.bin 内部のタイムスタンプを比較し、 一致しなかったらキャッシュを捨てる opcache.enable=1! opcache.enable_cli=1! opcache.file_cache=/var/tmp/php/opcache! opcache.validate_timestamps=1
40.
勘違いしやすい(?)設定 ❖ opcache.file_cache_only! ❖ 1:
共有メモリキャッシュ無効・ファイルのみ ❖ 0: 共有メモリキャッシュ有効(デフォルト) opcache.enable=1! opcache.enable_cli=1! opcache.file_cache=/var/tmp/php/opcache! opcache.file_cache_only=1
Baixar agora