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 キャッシュ
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 つのリクエストのみ許可されます。他のリクエストはキャッシュの再構築が完了するまで待機し、キャッシュからデータを再取得します。
2. オリジナル キャッシュとコピー キャッシュのダブル キャッシュ戦略 オリジナル キャッシュの有効期限が切れてコピー キャッシュが要求されると、オリジナル キャッシュの有効期限は短期間に設定されます。コピー キャッシュは長期に設定されます。
推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHPのキャッシュ技術を体系的に解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます
