ホームページ >バックエンド開発 >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('Last-Modified: '. gmdate('D, d M Y H:i:s', $last_modify).' GMT'); header('HTTP/1.1 304'); //Not Modified exit; } header('Last-Modified: '. gmdate('D, d M Y H:i:s').' GMT');
更新頻度が低く、読み取り頻度が高いデータをファイルにキャッシュします。
たとえば、プロジェクト内の複数の場所で都市データが 3 レベルの連携に使用されている場合、都市データをファイル (city_data.json) にキャッシュすることができ、JS はリクエストせずにこのファイルを直接読み取ることができます。バックエンドサーバー。
CMS (コンテンツ管理システム)、初期の DEDE や PHPCMS など、おそらく誰もがよく知っているもので、静的な HTML を設定できますユーザーが Web サイトにアクセスするとき、読み取られるのは静的な HTML だけです。バックエンド データベースや Ajax リクエスト データ インターフェイスをリクエストする必要がないため、Web サイトの読み込み速度が向上します。
静的 HTML には次の利点があります:
検索エンジンの組み込み (SEO) に役立ちます
ページが開きます迅速な
サーバー負荷の軽減
CDN (Content Delivery Network) コンテンツ配信通信網 。
ユーザーが Web サイトにアクセスすると、ソース サーバーに要求することなく、最も近い CDN ノードのコンテンツが自動的に選択されるため、Web サイトを開く時間が短縮されます。
キャッシュには主に、HTML、画像、CSS、JS、XML などの静的リソースが含まれます。
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
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(Operate Code)操作码。
PHP程序运行完后,马上释放所有内存,所有程序中的变量都销毁,每次请求都要重新翻译、执行,导致速度可能会偏慢。
当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码。
操作码 的目地是避免重复编译,减少CPU和内存开销。
APC(Alternative PHP Cache)可选 PHP 缓存。
APC 的目标是提供一个自由、 开放,和健全的框架,用于缓存、优化 PHP 中间代码。
APC 可以去掉 php 动态解析以及编译的时间,使php脚本可以执行的更快。
APC 扩展最后的发布时间为 2012-09-03。
感兴趣可以了解下,官方介绍:http://php.net/manual/zh/book.apc.php
eAccelerator:A PHP opcode cache。
感兴趣可以了解下,官方介绍:http://eaccelerator.net/
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 つのリクエストのみ許可されます。他のリクエストはキャッシュの再構築が完了するまで待機し、キャッシュからデータを再取得します。
2. オリジナル キャッシュとコピー キャッシュのダブル キャッシュ戦略 オリジナル キャッシュの有効期限が切れてコピー キャッシュが要求されると、オリジナル キャッシュの有効期限は短期間に設定されます。コピー キャッシュは長期に設定されます。
推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHPのキャッシュ技術を体系的に解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。