More Related Content
Similar to OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Similar to OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた (20)
More from Yoshio Hanawa (17)
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
- 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
- 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 には先ほど見たハッシュ値が入る!
❖ キャッシュを読む際、これをチェックする
❖ 異なるバージョン間でキャッシュの使い回しはできない
- 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)
- 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