ホームページ >バックエンド開発 >PHPチュートリアル >PHPのキャッシュ技術を体系的に解説

PHPのキャッシュ技術を体系的に解説

WBOY
WBOY転載
2022-12-29 14:40:044237ブラウズ

この記事では、PHP に関する関連知識を提供します。主にキャッシュ テクノロジの関連コンテンツを紹介します。キャッシュはプロジェクトに不可欠な部分となっており、パフォーマンスを向上させる最善の方法です。一緒にやってみましょう。見てみてください。それはみんなを助けます。

PHPのキャッシュ技術を体系的に解説

概要

PHPのキャッシュ技術を体系的に解説

キャッシュはプロジェクトに不可欠な部分となっており、キャッシュはプロジェクトの重要な要素となっています。改善 ネットワーク I/O の削減、ディスク I/O の削減など、パフォーマンスを最適化する方法により、プロジェクトの読み込みが速くなります。

キャッシュには、CPU キャッシュ、メモリ キャッシュ、またはハードディスク キャッシュを使用できます。キャッシュが異なれば、クエリ速度も異なります (CPU キャッシュは、ハードディスク キャッシュよりもメモリ キャッシュより優れています)。

次は一つずつ紹介していきます。

ブラウザ キャッシュ

ブラウザは、要求されたページをクライアント キャッシュに保存します。訪問者がこのページに再度アクセスすると、ブラウザはクライアント キャッシュ データから直接そのページを読み取ることができるため、アクセスが減少します。サーバーを強化し、Web ページの読み込みを高速化します。

強力なキャッシュ

ユーザーが送信したリクエストは、サーバーにリクエストせずにクライアント キャッシュから直接取得されます。

Expires と Cache-Control に基づいて、強力なキャッシュがヒットするかどうかを判断します。

コードは次のとおりです:

header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT');
header("Cache-Control: max-age=3600"); //有效期3600秒

Cache-Control 次のパラメータも設定できます:

  • public: すべてのユーザーがキャッシュできます。 (エンド ユーザーのブラウジング サーバー/CDN サーバー)

  • private: エンド ユーザーのブラウザでのみキャッシュできます

  • no-cache: キャッシュしませんローカル キャッシュを使用する

  • no-store: データのキャッシュを無効にする

キャッシュのネゴシエート

ユーザーが送信したリクエストは次のとおりです。サーバーに送信され、サーバーはクライアント側キャッシュを使用するかどうかを決定します。

コードは次のとおりです:

$last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
if (time() - $last_modify < 3600) {
   header(&#39;Last-Modified: &#39;. gmdate(&#39;D, d M Y H:i:s&#39;, $last_modify).&#39; GMT&#39;);
   header(&#39;HTTP/1.1 304&#39;); //Not Modified
   exit;
}
header(&#39;Last-Modified: &#39;. gmdate(&#39;D, d M Y H:i:s&#39;).&#39; GMT&#39;);

ユーザー操作の動作がキャッシュに与える影響

PHPのキャッシュ技術を体系的に解説

ファイル キャッシュ

データ ファイル キャッシュ

更新頻度が低く、読み取り頻度が高いデータをファイルにキャッシュします。

たとえば、プロジェクト内の複数の場所で都市データが 3 レベルの連携に使用されている場合、都市データをファイル (city_data.json) にキャッシュすることができ、JS はリクエストせずにこのファイルを直接読み取ることができます。バックエンドサーバー。

サイト全体で静的

CMS (コンテンツ管理システム)、初期の DEDE や PHPCMS など、おそらく誰もがよく知っているもので、静的な HTML を設定できますユーザーが Web サイトにアクセスするとき、読み取られるのは静的な HTML だけです。バックエンド データベースや Ajax リクエスト データ インターフェイスをリクエストする必要がないため、Web サイトの読み込み速度が向上します。

静的 HTML には次の利点があります:

  • 検索エンジンの組み込み (SEO) に役立ちます

  • ページが開きます迅速な

  • サーバー負荷の軽減

CDN キャッシュ

CDN (Content Delivery Network) コンテンツ配信通信網 。

ユーザーが Web サイトにアクセスすると、ソース サーバーに要求することなく、最も近い CDN ノードのコンテンツが自動的に選択されるため、Web サイトを開く時間が短縮されます。

キャッシュには主に、HTML、画像、CSS、JS、XML などの静的リソースが含まれます。

NoSQL Cache

Memcached Cache

Memcached は、高性能の分散メモリ キャッシュ サーバーです。

使用の一般的な目的は、データベース クエリ結果をキャッシュすることでデータベース アクセスの数を減らし、動的 ​​Web アプリケーションの速度とスケーラビリティを向上させることです。

画像、ビデオ、ファイルなど、さまざまな形式でデータを保存するために使用することもできます。

Memcached は K/V タイプのデータのみをサポートし、永続ストレージはサポートしません。

Memcache と Memcached の違い

0.2.0 以降、Memcached には PHP バージョン >=5.2.0 が必要で、Memcache には PHP バージョン >=4.3 が必要です。

Memcached の最終リリースは 2018-12-24 で、Memcache の最終リリースは 2013-04-07 です。

Memcached は libmemcached に基づいており、Memcache は PECL 拡張に基づいています。

Memcached は、Memcache のアップグレード版とみなすことができます。

PHP Memcached ユーザー マニュアル:

http://www.php.net/manual/zh/book.memcached.php

Memcached は Redis とよく比較されます。 , Redisキャッシュを紹介します。

Redis キャッシュ

Redis は、高性能 K/V データベースです。

Redis は、データをインメモリに保存できる List (リンク リスト)、Set (セット)、Zset (順序セット)、Hash (ハッシュ) などの Memcached K/V ストレージの欠点を大幅に補います。 、データをディスクに保存することもでき、マスターとスレーブの同期をサポートします。

一般に、Redis は Memcached の拡張バージョンであり、より重量があり、より強力であると考えることができます。

Redis は主に日常業務で使用されます。

Redis 学習 Web サイト: http://www.redis.cn/

MongoDB キャッシュ

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。

旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 学习网址:http://www.mongodb.org.cn

WEB服务器缓存

Apache缓存

利用 mod_expires ,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。

打开 http.conf,开启模块:

LoadModule expires_module modules/mod_expires.so

指定缓存的过期时间:

<IfModule expires_module>
    #打开缓存
    ExpiresActive on
    #css缓存(8640000秒=10天)
    ExpiresByType text/css A8640000
    #js缓存
    ExpiresByType application/x-javascript A8640000
    ExpiresByType application/javascript A8640000
    #html缓存
    ExpiresByType text/html A8640000
    #图片缓存
    ExpiresByType image/jpeg A8640000
    ExpiresByType image/gif A8640000
    ExpiresByType image/png A8640000
    ExpiresByType image/x-icon A8640000
</IfModule>

Nginx缓存

利用 expire 参数,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。

打开 nginx.conf :

//以图片为例:
location ~\.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location
   root html;
   expires 1d; #指定缓存时间
}

大家也可以了解下:proxycachepath 和 proxy_cache,进行缓存的设置。

Opcode缓存

Opcode(Operate Code)操作码。

PHP程序运行完后,马上释放所有内存,所有程序中的变量都销毁,每次请求都要重新翻译、执行,导致速度可能会偏慢。

当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码。

操作码 的目地是避免重复编译,减少CPU和内存开销。

APC缓存

APC(Alternative PHP Cache)可选 PHP 缓存。

APC 的目标是提供一个自由、 开放,和健全的框架,用于缓存、优化 PHP 中间代码。

APC 可以去掉 php 动态解析以及编译的时间,使php脚本可以执行的更快。

APC 扩展最后的发布时间为 2012-09-03。

感兴趣可以了解下,官方介绍:http://php.net/manual/zh/book.apc.php

eAccelerator

eAccelerator:A PHP opcode cache。

感兴趣可以了解下,官方介绍:http://eaccelerator.net/

XCache

XCache 是一个又快又稳定的 PHP opcode 缓存器。

感兴趣可以了解下,官方介绍:http://xcache.lighttpd.net/

小结

文章主要简单的介绍了 浏览器缓存、文件缓存、NoSQL缓存、WEB服务器缓存、Opcode缓存。

每一种缓存都可以深入研究,从介绍 -> 安装 -> 使用 -> 总结应用场景。

大家可以思考下,通过上面的介绍,工作中我们使用了哪些缓存?

还可以再使用哪些缓存,可以对我们的项目有帮助?

关于缓存的常见问题

用过缓存,大家肯定遇到过比较头痛的问题,比如数据一致性,雪崩,热点数据缓存,缓存监控等等。

给大家列出几个问题,纯属抛转引玉。

当项目中使用到缓存,我们是选择 Redis 还是 Memcached ,为什么?

举一些场景:

一、比如实现一个简单的日志收集功能或发送大量短信、邮件的功能,实现方式是先将数据收集到队列中,然后有一个定时任务去消耗队列,处理该做的事情。

直接使用 Redis 的 lpush,rpop 或 rpush,lpop。

//进队列
$redis->lpush(key, value);
//出队列
$redis->rpop(key);
Memcached 没有这种数据结构。

二、比如我们要存储用户信息,ID、姓名、电话、年龄、身高 ,怎么存储?

方案一:key => value

key = userdata用户ID

value = json_encode(用户数据)

查询时,先取出key,然后进行json_decode解析。

方案二:hash

key = userdata用户ID

hashKey = 姓名,value = xx

hashKey = 电话,value = xx

hashKey = 年龄,value = xx

hashKey = 身高,value = xx

查询时,取出key即可。

//新增
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);
//编辑
$redis->hSet(key, hashKey, value);
//查询
$redis->hGetAll(key); //查询所有属性
$redis->hGet(key, hashKey); //查询某个属性

方案二 优于 方案一。

三、比如社交项目类似于新浪微博,个人中心的关注列表和粉丝列表,双向关注列表,还有热门微博,还有消息订阅 等等。

以上都用 Redis 提供的相关数据结构即可。

四、Memcached 只存储在内存中,而 Redis 既可以存储在内存中,也可以持久化到磁盘上。

如果需求中的数据需要持久化,请选择 Redis 。

个人在工作中没有用到 Memcached ,通过查询资料得到 Memcached 内存分配时优于 Redis。

Memcached 默认使用 Slab Allocation 机制管理内存,按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。

如何保证,缓存与数据库的数据一致性?

新增数据:先新增到数据库,再新增到缓存。

编辑数据:先删除缓存数据,再修改数据库中数据,再新增到缓存。

删除数据:先删除缓存数据,再删除数据库中数据。

データのクエリ: まずキャッシュ データをクエリし、存在しない場合はデータベースにクエリを実行して、それをキャッシュに追加します。

トランザクションの一貫性、ポイントインタイムの一貫性、最終的な一貫性など、強い一貫性を保証するのは困難です。

特定の問題を詳しく分析してみましょう。

キャッシュの侵入についてどうすればよいでしょうか?

ユーザーがキャッシュに存在しないデータをリクエストしたため、リクエストはデータベースに直接送信されます。

1. 通常の Key 値を設定し、まずその Key が仕様に準拠しているかどうかを確認します。

2. インターフェイスの電流制限、ダウングレード、サーキット ブレーカーについては、istio について調べてください: https://istio.io/

3. ブルーム フィルター。

4. 空のキャッシュと存在しないキー値の有効期限を設定します。ストレージ レイヤーがデータを作成する場合は、適時にキャッシュを更新します。

雪崩の場合はどうすればよいですか?

1. ミューテックス ロック、インデックスの再構築は 1 つのリクエストのみ許可されます。他のリクエストはキャッシュの再構築が完了するまで待機し、キャッシュからデータを再取得します。

PHPのキャッシュ技術を体系的に解説

2. オリジナル キャッシュとコピー キャッシュのダブル キャッシュ戦略 オリジナル キャッシュの有効期限が切れてコピー キャッシュが要求されると、オリジナル キャッシュの有効期限は短期間に設定されます。コピー キャッシュは長期に設定されます。

推奨学習: 「PHP ビデオ チュートリアル

以上がPHPのキャッシュ技術を体系的に解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は新亮笔记微信公众号で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。