ホームページ  >  記事  >  バックエンド開発  >  PHP のキャッシュ テクノロジの詳細については、こちらをご覧ください。

PHP のキャッシュ テクノロジの詳細については、こちらをご覧ください。

青灯夜游
青灯夜游転載
2021-07-14 19:24:466125ブラウズ

キャッシュはプロジェクトにとって不可欠な部分となっており、パフォーマンスを向上させる最善の方法です。次の記事では、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 は主に日常業務で使用されます。

MongoDB キャッシュ

MongoDB は、分散ファイル ストレージに基づくデータベースです。 C言語で書かれています。

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

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

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; #指定缓存时间
}

大家也可以了解下:proxy_cache_path 和 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 = user_data_用户ID

value = json_encode(用户数据)

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

方案二:hash

key = user_data_用户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 をご覧ください: istio.io/

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

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

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

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

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

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

以上がPHP のキャッシュ テクノロジの詳細については、こちらをご覧ください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はzhihu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。