Suche senden
Hochladen
WordPress のキャッシュ機構
•
4 gefällt mir
•
12,423 views
K
katanyan
Folgen
* キャッシュの概要 * WordPressに備わっているキャッシュの仕組みの紹介 * WordPress Object Cache * Transients API
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 106
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
Les bases de l'HTML / CSS
Les bases de l'HTML / CSS
Samuel Robert
Cours php
Cours php
Narûtö Bàl'Sèm
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
ENSET, Université Hassan II Casablanca
Application web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrap
Bassem ABCHA
Leaning random using Boost Random
Leaning random using Boost Random
Akira Takahashi
Polymorphisme (cours, résumé)
Polymorphisme (cours, résumé)
Anis Bouhachem Djer
Cours php bac info
Cours php bac info
borhen boukthir
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
Empfohlen
Les bases de l'HTML / CSS
Les bases de l'HTML / CSS
Samuel Robert
Cours php
Cours php
Narûtö Bàl'Sèm
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
ENSET, Université Hassan II Casablanca
Application web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrap
Bassem ABCHA
Leaning random using Boost Random
Leaning random using Boost Random
Akira Takahashi
Polymorphisme (cours, résumé)
Polymorphisme (cours, résumé)
Anis Bouhachem Djer
Cours php bac info
Cours php bac info
borhen boukthir
JIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
La gestion des exceptions avec Java
La gestion des exceptions avec Java
Papa Cheikh Cisse
Building a REST Service in minutes with Spring Boot
Building a REST Service in minutes with Spring Boot
Omri Spector
PHP unserialization vulnerabilities: What are we missing?
PHP unserialization vulnerabilities: What are we missing?
Sam Thomas
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
Développement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EE
Sabri Bouchlema
Advanced JavaScript
Advanced JavaScript
Nascenia IT
Presentation Spring, Spring MVC
Presentation Spring, Spring MVC
Nathaniel Richand
Oops in PHP
Oops in PHP
Mindfire Solutions
以 Laravel 經驗開發 Hyperf 應用
以 Laravel 經驗開發 Hyperf 應用
Shengyou Fan
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c# .net version f8
ENSET, Université Hassan II Casablanca
MySQL Cheat Sheet
MySQL Cheat Sheet
Chen Dominique
Hibernate
Hibernate
Prashant Kalkar
Chapitre 6 traitement des exceptions
Chapitre 6 traitement des exceptions
Amir Souissi
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
Kohsuke Yuasa
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
ENSET, Université Hassan II Casablanca
Spring Boot RestApi.pptx
Spring Boot RestApi.pptx
Google Developers Group Libreville Nom de famille
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
Chris Ohk
Cours JavaScript
Cours JavaScript
Olivier Le Goaër
Fascicule de tp atelier développement web
Fascicule de tp atelier développement web
Houda TOUKABRI
Testing with JUnit 5 and Spring
Testing with JUnit 5 and Spring
VMware Tanzu
PHP Object Injection入門
PHP Object Injection入門
Yu Iwama
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Hishikawa Takuro
Weitere ähnliche Inhalte
Was ist angesagt?
La gestion des exceptions avec Java
La gestion des exceptions avec Java
Papa Cheikh Cisse
Building a REST Service in minutes with Spring Boot
Building a REST Service in minutes with Spring Boot
Omri Spector
PHP unserialization vulnerabilities: What are we missing?
PHP unserialization vulnerabilities: What are we missing?
Sam Thomas
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
Développement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EE
Sabri Bouchlema
Advanced JavaScript
Advanced JavaScript
Nascenia IT
Presentation Spring, Spring MVC
Presentation Spring, Spring MVC
Nathaniel Richand
Oops in PHP
Oops in PHP
Mindfire Solutions
以 Laravel 經驗開發 Hyperf 應用
以 Laravel 經驗開發 Hyperf 應用
Shengyou Fan
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c# .net version f8
ENSET, Université Hassan II Casablanca
MySQL Cheat Sheet
MySQL Cheat Sheet
Chen Dominique
Hibernate
Hibernate
Prashant Kalkar
Chapitre 6 traitement des exceptions
Chapitre 6 traitement des exceptions
Amir Souissi
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
Kohsuke Yuasa
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
ENSET, Université Hassan II Casablanca
Spring Boot RestApi.pptx
Spring Boot RestApi.pptx
Google Developers Group Libreville Nom de famille
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
Chris Ohk
Cours JavaScript
Cours JavaScript
Olivier Le Goaër
Fascicule de tp atelier développement web
Fascicule de tp atelier développement web
Houda TOUKABRI
Testing with JUnit 5 and Spring
Testing with JUnit 5 and Spring
VMware Tanzu
Was ist angesagt?
(20)
La gestion des exceptions avec Java
La gestion des exceptions avec Java
Building a REST Service in minutes with Spring Boot
Building a REST Service in minutes with Spring Boot
PHP unserialization vulnerabilities: What are we missing?
PHP unserialization vulnerabilities: What are we missing?
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Développement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EE
Advanced JavaScript
Advanced JavaScript
Presentation Spring, Spring MVC
Presentation Spring, Spring MVC
Oops in PHP
Oops in PHP
以 Laravel 經驗開發 Hyperf 應用
以 Laravel 經驗開發 Hyperf 應用
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c# .net version f8
MySQL Cheat Sheet
MySQL Cheat Sheet
Hibernate
Hibernate
Chapitre 6 traitement des exceptions
Chapitre 6 traitement des exceptions
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
Spring Boot RestApi.pptx
Spring Boot RestApi.pptx
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
Cours JavaScript
Cours JavaScript
Fascicule de tp atelier développement web
Fascicule de tp atelier développement web
Testing with JUnit 5 and Spring
Testing with JUnit 5 and Spring
Ähnlich wie WordPress のキャッシュ機構
PHP Object Injection入門
PHP Object Injection入門
Yu Iwama
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Hishikawa Takuro
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
norry_gogo
Wb osaka 20120623
Wb osaka 20120623
Miho Ishida
traitを使って楽したい話
traitを使って楽したい話
infinite_loop
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
swooleを試してみた
swooleを試してみた
Yukihiro Katsumi
Drupal8 DBに保存して読み込む
Drupal8 DBに保存して読み込む
iPride Co., Ltd.
test
test
a1yama1123
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!デベロッパーネットワーク
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
Yusuke Ando
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
Kazuki Nakajima
Best practice laravel
Best practice laravel
Risa Ohnishi
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
Yahoo!デベロッパーネットワーク
Ci tutorial
Ci tutorial
Kazuaki Ueda
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
WordPressで提供するWeb API
WordPressで提供するWeb API
Yuko Toriyama
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
Takashi Uemura
2012 keynote-2
2012 keynote-2
kmiyako
Ähnlich wie WordPress のキャッシュ機構
(20)
PHP Object Injection入門
PHP Object Injection入門
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Wb osaka 20120623
Wb osaka 20120623
traitを使って楽したい話
traitを使って楽したい話
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
swooleを試してみた
swooleを試してみた
Drupal8 DBに保存して読み込む
Drupal8 DBに保存して読み込む
test
test
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
3時間濃縮CakePHP2.1 in PHPカンファレンス北海道2012
勉強会force#4 Chatter Integration
勉強会force#4 Chatter Integration
Best practice laravel
Best practice laravel
Yahoo!ボックスAPI Hackday資料
Yahoo!ボックスAPI Hackday資料
Ci tutorial
Ci tutorial
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
WordPressで提供するWeb API
WordPressで提供するWeb API
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
WordPressでオリジナルサイトを作るための最初の一歩的なカスタマイズテクニック
2012 keynote-2
2012 keynote-2
Kürzlich hochgeladen
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
Kürzlich hochgeladen
(9)
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
WordPress のキャッシュ機構
1.
WordPressのキャッシュ機構
2.
• キャッシュの概要 • WordPressに備わっているキャッシュの仕組みの紹介 •
WordPress Object Cache https://codex.wordpress.org/Class_Reference/WP_Object_Cache • Transients API https://wpdocs.osdn.jp/Transients_API • ※ WordPress コアのコードを例示している箇所はすべ てバージョン 4.4.2 からの引用
3.
キャッシュとは
4.
cache = 隠し場所、隠す (単語のもともとの意味)
5.
一度使ったデータを取り出しやすいところに置いておき 次からより素早く使えるようにする仕組み
6.
データを要求する側 応答する側
7.
データを要求する側 応答する側キャッシュ
8.
データを要求する側 応答する側キャッシュ
9.
• キャッシュ機構はデータを要求する側と応答する側の間に 立ち、応答結果のコピーを保存 • 要求に応じて、該当するコピーがあればコピーを返す(キャッ シュヒット) •
コピーが無ければ応答側にデータを要求してその応答結果 を返す(キャッシュミス) • 本来、キャッシュの存在は意識されないもの (キャッシュの有無にかかわらず、システムは同じように動作することが求められる。 キャッシュの仕組みを使う側からはその存在は意識されないが、実はそこにあり、こっ そりデータが保存されるイメージ。だから「隠し場所」)
10.
Webサイトにおけるキャッシュ
11.
ユーザー エージェント DBサーバCDN Web/アプリケー ションサーバ リバースプロキシ (キャッシュサーバ) その他 データストア等
12.
ユーザー エージェント DBサーバCDN Web/アプリケー ションサーバ リバースプロキシ (キャッシュサーバ) その他 データストア等
13.
キャッシュの効用
14.
ユーザー エージェント DBサーバCDN Web/アプリケー ションサーバ リバースプロキシ (キャッシュサーバ) その他 データストア等
15.
HTTPリクエスト 解析 PHP MySQL PHP HTTPレスポンス 出力 キャッシュなし ※上記のイメージは、以下のページの「動的なサイトがリクエストを受け取って処理する仕組み」の画像の一部抜粋を元に作成 http://takahashifumiki.com/web/programing/2426/
16.
HTTPリクエスト 解析 PHP MySQL PHP HTTPレスポンス 出力 キャッシュなし HTTPリクエスト 解析 PHP
MySQL PHP HTTPレスポンス 出力 出力キャッシュ (ページキャッシュ) ※上記のイメージは、以下のページの「動的なサイトがリクエストを受け取って処理する仕組み」の画像の一部抜粋を元に作成 http://takahashifumiki.com/web/programing/2426/
17.
HTTPリクエスト 解析 PHP MySQL PHP HTTPレスポンス 出力 キャッシュなし HTTPリクエスト 解析 PHP
MySQL PHP HTTPレスポンス 出力 出力キャッシュ (ページキャッシュ) キャッシュヒットすれば この部分の処理が省略される ※上記のイメージは、以下のページの「動的なサイトがリクエストを受け取って処理する仕組み」の画像の一部抜粋を元に作成 http://takahashifumiki.com/web/programing/2426/
18.
HTTPリクエスト 解析 PHP MySQL PHP HTTPレスポンス 出力 キャッシュなし HTTPリクエスト 解析 PHP
MySQL PHP HTTPレスポンス 出力 出力キャッシュ (ページキャッシュ) HTTPリクエスト 解析 PHP MySQL PHP HTTPレスポンス 出力 データキャッシュ (MySQLの応答結果をキャッシュするケース) キャッシュヒットすれば この部分の処理が省略される ※上記のイメージは、以下のページの「動的なサイトがリクエストを受け取って処理する仕組み」の画像の一部抜粋を元に作成 http://takahashifumiki.com/web/programing/2426/
19.
多様な選択肢
20.
• 何を保存するか • どこに保存するか •
いつまで保存するか • どうやって更新するか • どうやって削除するか
21.
• クライアントサイド • HTTPキャッシュ/プロキシキャッシュ •
サーバーサイド • アプリケーション • 出力キャッシュ/データキャッシュ • ミドルウェア • リバースプロキシキャッシュ/バイトコードキャッシュ/DBキャッシュ • OS • ディスクキャッシュ
22.
画像出典:WordPressキャッシュ系プラグインの比較とサイトに適した選び方 http://tokkono.cute.coocan.jp/blog/slow/index.php/wordpress/comparison-and-selection-of-wordpress- cache-plugin/
23.
キャッシュの難しさ
24.
• どこがボトルネックなのか • キャッシュすべきでないものは? •
更新・削除・置き換えの方法は? • 使い方を誤ると・・・
25.
ほんとうは怖いWP Super Cacheの話 http://takahashifumiki.com/web/programing/2426/ ※WP
Super Cache がよくないということではありません
26.
WordPressに備わっている キャッシュの仕組み
27.
ユーザー エージェント DBサーバCDN Web/アプリケー ションサーバ リバースプロキシ (キャッシュサーバ) その他 データストア等
28.
• クライアントサイド • HTTPキャッシュ/プロキシキャッシュ •
サーバーサイド • アプリケーション • 出力キャッシュ/データキャッシュ • ミドルウェア • リバースプロキシキャッシュ/バイトコードキャッシュ/DBキャッシュ • OS • ディスクキャッシュ
29.
WordPress Object Cache
30.
• 非永続キャッシュ • 同一プロセス内でのみ再利用可能 •
ドロップインで拡張することで永続化可能
31.
PHP実行プロセス DB プログラム Object
Cache 投稿データを要求 キャッシュミス DBからデータを取得
32.
PHP実行プロセス DB プログラム Object
Cache 投稿データを要求 キャッシュミス DBからデータを取得
33.
PHP実行プロセス DB プログラム 投稿データを要求 Object Cache キャッシュミス DBからデータを取得
34.
PHP実行プロセス DB プログラム 投稿データを要求 Object Cache キャッシュミス DBからデータを取得
35.
PHP実行プロセス DB プログラム 投稿データを要求 Object Cache キャッシュミス DBからデータを取得
36.
PHP実行プロセス DB プログラム 投稿データを要求 Object Cache キャッシュミス DBからデータを取得 キャッシュデータ
37.
PHP実行プロセス DB プログラム 投稿データを要求 Object Cache キャッシュミス DBからデータを取得 キャッシュデータ
38.
PHP実行プロセス DB プログラム 投稿データを要求 Object Cache キャッシュミス DBからデータを取得 キャッシュデータ
39.
PHP実行プロセス DB プログラム 投稿データを要求 Object Cache キャッシュミス DBからデータを取得 投稿データを要求
キャッシュデータ
40.
PHP実行プロセス DB プログラム 投稿データを要求 Object Cache キャッシュミス DBからデータを取得 投稿データを要求
キャッシュデータ 投稿データを更新 キャッシュデータを削除
41.
キャッシュされたデータの寿命
42.
PHP実行プロセス DB プログラム 投稿データを要求 Object Cache キャッシュデータ PHP実行プロセス プロセス終了により 無くなる 投稿データを要求 キャッシュミス DBからデータを取得
43.
永続化
44.
APCu などPHP実行プロセス DB 投稿データを要求 Object
Cacheプログラム PHP実行プロセス 投稿データを要求 キャッシュミス DBからデータを取得 投稿データを要求 キャッシュデータ キャッシュデータ
45.
• WP_Object_Cache クラスで実装 •
インスタンス変数にデータを保持 • プログラムから使用するときは WP_Object_Cache に 直接アクセスせず wp_cache_* 関数を使う • 関数の一覧と基本的な使い方を Codex で確認してみ ましょう
46.
例: 投稿データ
47.
get_post( 1 ); get_post(
1 ); get_post( 1 ); get_post( 1 ); get_post( 1 ); get_post( 1 ); get_post( 1 ); get_post( 1 ); get_post( 1 ); get_post( 1 );
48.
get_post 関数より抜粋 function get_post(
$post = null, $output = OBJECT, $filter = 'raw' ) { if ( empty( $post ) && isset( $GLOBALS['post'] ) ) $post = $GLOBALS['post']; if ( $post instanceof WP_Post ) { $_post = $post; } elseif ( is_object( $post ) ) { if ( empty( $post->filter ) ) { $_post = sanitize_post( $post, 'raw' ); $_post = new WP_Post( $_post ); } elseif ( 'raw' == $post->filter ) { $_post = new WP_Post( $post ); } else { $_post = WP_Post::get_instance( $post->ID ); } } else { $_post = WP_Post::get_instance( $post ); }
49.
get_post 関数より抜粋 function get_post(
$post = null, $output = OBJECT, $filter = 'raw' ) { if ( empty( $post ) && isset( $GLOBALS['post'] ) ) $post = $GLOBALS['post']; if ( $post instanceof WP_Post ) { $_post = $post; } elseif ( is_object( $post ) ) { if ( empty( $post->filter ) ) { $_post = sanitize_post( $post, 'raw' ); $_post = new WP_Post( $_post ); } elseif ( 'raw' == $post->filter ) { $_post = new WP_Post( $post ); } else { $_post = WP_Post::get_instance( $post->ID ); } } else { $_post = WP_Post::get_instance( $post ); }
50.
public static function
get_instance( $post_id ) { global $wpdb; $post_id = (int) $post_id; if ( ! $post_id ) return false; $_post = wp_cache_get( $post_id, 'posts' ); if ( ! $_post ) { $_post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id ) ); if ( ! $_post ) return false; $_post = sanitize_post( $_post, 'raw' ); wp_cache_add( $_post->ID, $_post, 'posts' ); } elseif ( empty( $_post->filter ) ) { $_post = sanitize_post( $_post, 'raw' ); } return new WP_Post( $_post ); } WP_Post クラスより抜粋
51.
public static function
get_instance( $post_id ) { global $wpdb; $post_id = (int) $post_id; if ( ! $post_id ) return false; $_post = wp_cache_get( $post_id, 'posts' ); if ( ! $_post ) { $_post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id ) ); if ( ! $_post ) return false; $_post = sanitize_post( $_post, 'raw' ); wp_cache_add( $_post->ID, $_post, 'posts' ); } elseif ( empty( $_post->filter ) ) { $_post = sanitize_post( $_post, 'raw' ); } return new WP_Post( $_post ); } WP_Post クラスより抜粋
52.
wp_insert_post 関数より整形して抜粋
if ( empty( $data['post_name'] ) && !in_array( $data[‘post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) { $data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_ID ), $post_ID, $data[‘post_status'], $post_type, $post_parent ); $wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where ); clean_post_cache( $post_ID ); }
53.
if ( empty(
$data['post_name'] ) && !in_array( $data[‘post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) { $data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_ID ), $post_ID, $data[‘post_status'], $post_type, $post_parent ); $wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where ); clean_post_cache( $post_ID ); } wp_insert_post 関数より整形して抜粋
54.
wp_cache_delete( $post->ID, 'posts'
); wp_cache_delete( $post->ID, 'post_meta' ); clean_object_term_cache( $post->ID, $post->post_type ); wp_cache_delete( 'wp_get_archives', 'general' ); do_action( 'clean_post_cache', $post->ID, $post ); if ( 'page' == $post->post_type ) { wp_cache_delete( 'all_page_ids', 'posts' ); do_action( 'clean_page_cache', $post->ID ); } wp_cache_set( 'last_changed', microtime(), 'posts' ); clean_post_cache 関数より抜粋
55.
• データベースの更新時にいったんキャッシュを破棄 • 投稿そのものの他に、タームとの関係や投稿メタデータ など付随する情報もキャッシュされていることが分かる
56.
• ちなみに、get_posts /
WP_Query は・・・ • 取得した投稿リストの各投稿オブジェクトがキャッシュ される • cache_results パラメータで投稿オブジェクトを キャッシュするかどうかを指定可能 • 投稿リストそのものはキャッシュされない
57.
function get_books( $args
= array() ) { $defaults = array( 'post_type' => 'book' ); $args = wp_parse_args( $args, $defaults ); $cache_key = md5( 'books_' . serialize( $args ) ); $books = wp_cache_get( $cache_key, 'books' ); if ( $books === false ) { $books = get_posts( $args ); wp_cache_set( $cache_key, $books, 'books', 60 * MINUTE_IN_SECONDS ); } return $books; } カスタム投稿のリストをキャッシュするユーザー定義関数のサンプル
58.
function get_books( $args
= array() ) { $defaults = array( 'post_type' => 'book' ); $args = wp_parse_args( $args, $defaults ); $cache_key = md5( 'books_' . serialize( $args ) ); $books = wp_cache_get( $cache_key, 'books' ); if ( $books === false ) { $books = get_posts( $args ); wp_cache_set( $cache_key, $books, 'books', 60 * MINUTE_IN_SECONDS ); } return $books; } カスタム投稿のリストをキャッシュするユーザー定義関数のサンプル
59.
例: サイトオプション
60.
get_option( 'hoge' ); get_option(
'hoge' ); get_option( 'hoge' ); get_option( 'hoge' ); get_option( 'hoge' ); get_option( 'hoge' ); get_option( 'hoge' ); get_option( 'hoge' ); get_option( 'hoge' ); get_option( 'hoge' );
61.
• オートロード対象のオプションはコアの初期化処理で一括して ロードされ、オブジェクトキャッシュに保存される • wp-settings.php •
wp_not_installed • is_blog_installed • wp_load_alloptions • オートロード対象ではないオプションも、一度�get_option で 取得するとキャッシュされる
62.
• オプション関係のキャッシュ (
[キャッシュグループ].[キャッシュID] ) • options.alloptions �… オートロードされたオプションのリスト • options.notoptions �… 存在しないオプションのリスト • options.[オプション名] �… オートロード対象外の個別のオプション
63.
ドロップインによる拡張
64.
• memcached • Redis •
APC/APCu • etc. • ※それぞれ拡張用のプラグインがあります
65.
wp_start_object_cache 関数より抜粋 wp-settings.php でこの関数が呼ばれオブジェクトキャッシュが初期化される $first_init
= false; if ( ! function_exists( 'wp_cache_init' ) ) { if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { require_once ( WP_CONTENT_DIR . '/object-cache.php' ); if ( function_exists( 'wp_cache_init' ) ) wp_using_ext_object_cache( true ); } $first_init = true; } elseif ( ! wp_using_ext_object_cache() && file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { wp_using_ext_object_cache( true ); } if ( ! wp_using_ext_object_cache() ) require_once ( ABSPATH . WPINC . '/cache.php' );
66.
wp_start_object_cache 関数より抜粋 wp-settings.php でこの関数が呼ばれオブジェクトキャッシュが初期化される $first_init
= false; if ( ! function_exists( 'wp_cache_init' ) ) { if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { require_once ( WP_CONTENT_DIR . '/object-cache.php' ); if ( function_exists( 'wp_cache_init' ) ) wp_using_ext_object_cache( true ); } $first_init = true; } elseif ( ! wp_using_ext_object_cache() && file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) { wp_using_ext_object_cache( true ); } if ( ! wp_using_ext_object_cache() ) require_once ( ABSPATH . WPINC . '/cache.php' );
67.
• wp-content の下に
object-cache.php という名前で ファイルを配置 • object-cache.php 内で wp_cache_* 関数を定義す る • wp_cache_* 関数の引数でキャッシュの有効期限を 指定可能 ( 有効期限が使用されるかどうかはドロップイ ンの実装による )
68.
デモ
69.
70.
Transients API
71.
transient = 一時の、はかない
72.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API
Options API
73.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API
Options API
74.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API
Options API
75.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API
Options API データを保存
76.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API
Options API データを保存
77.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API
Options API set_transientデータを保存
78.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API
Options API set_transientデータを保存 add_option
79.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API 有効期限 Options
API set_transient データ データを保存 add_option
80.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API 有効期限 Options
API set_transient データ データを保存 add_option データを要求 データ 有効期限
81.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API 有効期限 Options
API set_transient データ データを保存 add_option データを要求 get_transient データ 有効期限
82.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API 有効期限 Options
API set_transient データ データを保存 add_option データを要求 get_transient get_option データ 有効期限
83.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API 有効期限 Options
API set_transient データ データを保存 add_option データを要求 get_transient get_option データ 有効期限
84.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API 有効期限 Options
API set_transient データ データを保存 add_option データを要求 get_transient get_option データ 有効期限
85.
PHP実行プロセス DB プログラム 外部サイトから データを取得 Transients API 有効期限 Options
API set_transient データ データを保存 add_option データを要求 get_transient get_option データ 有効期限
86.
キャッシュされたデータが 削除されるタイミング
87.
PHP実行プロセス DB プログラム Transients
API Options API get_transient データ データを要求 get_option delete_option 有効期限 有効期限 (期限切れ) データ
88.
• 「永続的かつ時限的なキャッシュ」 (
Codex より) • リクエスト( ≒ PHP実行プロセス ) をまたいでデータ の再利用が可能 • データに有効期限を設定可能 • データはデータベース ( wp_options テーブル ) に保 存 • Codex を見てみましょう
89.
• set_transient • add_option
でデータと有効期限を保存 • get_transient • 有効期限が過ぎていたら delete_option でデータを削除 • 有効期限がまだ来ていなければ、get_option でデータを 取得 • ※有効期限が過ぎていても、次の get_transient が呼ばれ るまでデータは残り続けるということ
90.
典型的なユースケース
91.
• フラグメントキャッシュ • ページ断片の再利用。フッターやサイドバーの
HTML をキャッシュし て複数のリクエストに対して使い回す • 重い処理、外部のWebサービス / サイトとの連携を伴う処理 • WordPress コア / プラグイン / テーマ の更新チェック • SNS の API 利用制限を回避するなど • フラッシュメッセージ • 「設定を更新しました」など、1回限りのメッセージをリクエストをまた いで表示
92.
例: コアの更新チェック
93.
$url = $http_url
= 'http://api.wordpress.org/core/version-check/1.7/?' . http_build_query( $query, null, '&' ); if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) $url = set_url_scheme( $url, 'https' ); (中略) $response = wp_remote_post( $url, $options ); (中略) $updates = new stdClass(); $updates->updates = $offers; $updates->last_checked = time(); $updates->version_checked = $wp_version; if ( isset( $body['translations'] ) ) $updates->translations = $body['translations']; set_site_transient( 'update_core', $updates ); wp_version_check 関数より抜粋
94.
$url = $http_url
= 'http://api.wordpress.org/core/version-check/1.7/?' . http_build_query( $query, null, '&' ); if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) $url = set_url_scheme( $url, 'https' ); (中略) $response = wp_remote_post( $url, $options ); (中略) $updates = new stdClass(); $updates->updates = $offers; $updates->last_checked = time(); $updates->version_checked = $wp_version; if ( isset( $body['translations'] ) ) $updates->translations = $body['translations']; set_site_transient( 'update_core', $updates ); wp_version_check 関数より抜粋
95.
$current = get_site_transient(
'update_core' ); (中略) // Wait 60 seconds between multiple version check requests $timeout = 60; $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); if ( ! $force_check && $time_not_changed ) { return; } wp_version_check 関数より抜粋
96.
$current = get_site_transient(
'update_core' ); (中略) // Wait 60 seconds between multiple version check requests $timeout = 60; $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); if ( ! $force_check && $time_not_changed ) { return; } wp_version_check 関数より抜粋
97.
Object Cache との関係
98.
• Object Cache
がドロップインで拡張されている場合、 トランジェントデータの保存先として Object Cache が 使われる • トランジェントデータの読み書きは wp_cache_* 関 数に委譲 • プラグイン開発等で Transients API を使う際には、ト ランジェントデータがデータベース以外に保存されるケー スも考慮しておく
99.
デモ
100.
101.
まとめ
102.
• ひとくちにキャッシュといっても、その実現方法はいろい ろある • それぞれの特性を理解して、効果が見込まれる部分に 対して導入する •
「なんとなく・・・」「とりあえず・・・」で使わない
103.
• WordPress に備わっているキャッシュの仕組みとして Object
Cache と Transients API がある • Object Cache は単に PHP の変数でデータを管理。手 軽で高速だが、リクエストをまたいでデータを再利用す ることはできない�( ドロップインで拡張すれば可能にな る ) • Transients はサイトオプションの仕組みをうまく使うこ とで有効期限つきの永続キャッシュを実現。リクエストを またいでデータを再利用できる
104.
おわり
105.
Special Thanks to •
高橋文樹.com http://takahashifumiki.com • ゆっくりと… http://tokkono.cute.coocan.jp
106.
ご清聴ありがとうございました WordBench新潟 2016.2.20 @katanyan
Jetzt herunterladen