快取已經成了專案中必不可少的一部分,它是提高效能最好的方式。下面這篇文章就來帶大家詳細了解PHP中的快取技術。
快取是提高效能最好的方式,例如減少網路I/O、減少磁碟I/O 等,讓專案載入速度變的更快。
快取可以是CPU快取、記憶體快取、硬碟緩存,不同的快取查詢速度也不一樣(CPU快取 > 記憶體快取 > 硬碟快取)。
接下來,給大家逐一介紹。
瀏覽器快取
瀏覽器將要求過的頁面儲存在客戶端快取中,當訪客再次造訪這個頁面時,瀏覽器就可以直接從客戶端快取中讀取數據,減少了對伺服器的訪問,加快了網頁的載入速度。
強快取
用戶發送的請求,直接從客戶端快取中獲取,不請求伺服器。
根據 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');
使用者操作行為對快取的影響
檔案快取
資料檔案快取
#將更新頻率低,讀取頻率高的數據,快取成文件。
例如,專案中多個地方用到城市資料做三級連動,我們就可以將城市資料快取成一個文件(city_data.json),JS 可以直接讀取這個文件,無需請求後端伺服器.
全站靜態化
CMS(內容管理系統),或許大家都比較熟悉,像是早期的DEDE、PHPCMS,後台都可以設定靜態化HTML,使用者在造訪網站的時候讀取的都是靜態HTML,不用請求後端的資料庫,也不用Ajax請求資料接口,加快了網站的載入速度。
靜態化HTML有以下優點:
- 有利於搜尋引擎的收錄(SEO)
- #頁面開啟速度快
- 減少伺服器負擔
CDN快取
CDN(Content Delivery Network)內容傳遞網路。
使用者造訪網站時,自動選擇就近的CDN節點內容,不需要請求來源伺服器,加快了網站的開啟速度。
快取主要包括 HTML、圖片、CSS、JS、XML 等靜態資源。
NoSQL快取
Memcached 快取
Memcached 是高效能的分散式記憶體快取伺服器。
一般的使用目的是,透過快取資料庫查詢結果,減少資料庫存取次數,以提高動態網路應用程式的速度、提高可擴充性。
它也能夠用來儲存各種格式的數據,包括圖像、影片、檔案等。
Memcached 僅支援K/V類型的數據,不支援持久化儲存。
Memcache 與Memcached 的差異
- #Memcached 從0.2.0開始,要求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 很大程度補償了Memcached K/V儲存的不足,例如List(鍊錶)、Set(集合)、Zset(有序集合)、Hash(雜湊),既可以將資料儲存在記憶體中,也可以將資料持久化到磁碟上,支援主從同步。
總的來說,可以將 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数据记录,以完全解决内存碎片问题。
如何保证,缓存与数据库的数据一致性?
新增数据:先新增到数据库,再新增到缓存。
编辑数据:先删除缓存数据,再修改数据库中数据,再新增到缓存。
刪除數據:先刪除快取數據,再刪除資料庫中數據。
查詢數據:先查詢快取數據,沒有,再查詢資料庫,再新增到快取。
強一致性是很難保證的,例如交易一致性,時間點一致性,最終一致性等。
具體問題具體分析吧。
快取穿透怎麼辦?
使用者要求快取中不存在的數據,導致請求直接落在資料庫上。
一、設定有規則的Key值,先驗證Key是否符合規格。
二、介面限流、降級、熔斷,請研究istio:https://istio.io/
三、布隆過濾器。
四、為不存在的key值,設定空快取和過期時間,如果儲存層創建了數據,及時更新快取。
雪崩怎麼辦?
一、互斥鎖,只允許一個請求去重建索引,其他請求等待快取重建執行完,重新從快取取得資料。
二、雙快取策略,原始快取和拷貝緩存,當原始快取失效請求拷貝緩存,原始快取失效時間設定為短期,拷貝快取設定為長期。
推薦學習:《PHP影片教學》
以上是深入了解PHP中的快取技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver Mac版
視覺化網頁開發工具