① 關於php做緩存的原理
差不多吧,但是你把存放在模板中的文件刪除後,會慢很多,因為它要重新生成,那是很慢的,後面再訪問的時候就快多了
② php的緩存機制有哪些
主要有:
①普遍緩存技術②頁面緩存③時間觸發緩存④內容觸發緩存⑤靜態緩存(就生成html文件)
⑥內存緩存⑦php的緩沖器⑧MYSQL緩存⑨基於反向代理的Web緩存,DNS輪詢
但是一般常用的就 ①②④,其他的是網站數據量大,交互多,為減小伺服器壓力才用到
參考資料:http://blog.163.com/yuzhongfeiyan338@126/blog/static/38688323200981604944905/
③ PHP DUXCMS如何開啟頁面緩存
1.頁面緩存。頁面緩存指之前載入過的頁面以文件方式緩存在伺服器中,在一段時間內再次載入相同頁面時無需重新執行頁面邏輯直接載入靜態頁面。rubyPHP的頁面緩存是自動進行的,在config/tpl.php中可配置是否啟用緩存以及緩存文件的有效期。當然這僅僅是全局設置,在調用視圖時可重新指定是否啟用緩存以及緩存有效期。
2.SQL緩存。sql緩存指之前執行過的查詢sql語句以及他的結果緩存在內存中,在一段時間內用相同的sql語句執行查詢操作時不經過資料庫直接返回內存中數據。rubyPHP使用Redis以鍵值方式緩存sql語句以及他的對應結果。rubyPHP能夠在php7上完美運行。(附:關於windows php7 redis 擴展的下載參照我的另一篇博客:http://blog.csdn.net/fanghailiang2016/article/details/51396649)。rubyPHP重寫了mysql_query以及mongo_query方法,在執行查詢sql查詢語句時會優先載入未過期的緩存數據。與頁面緩存類似,sql緩存的全局配置路徑為config/redis.php,在具體執行sql語句前可重新執行是否使用緩存以及緩存有效期。
3.讀寫分離。讀寫分離是建立在主從同步基礎上為了減輕伺服器壓力,將查詢語句轉移到從伺服器上執行的解決方案。rubyPHP重寫了mysql_query,mongo_query函數,除了對查詢語句進行內存級緩存的優化,同時也將查詢語句放到了從伺服器上執行。mysql的主從配置文件路徑為config/mysql.php。
4.html壓縮。html壓縮配合頁面緩存,前者降低了伺服器端壓力,後者減少了輸出內容所佔空間,將html文件中的空格換行等進行壓縮,減少了輸出文件的大小,在一定程度上保護了html的安全。
rubyPHP在代碼結構上模仿CI,在功能上模仿thinkPHP。
rubyPHP的功能包含以下幾方面:
1.使用了thinkPHP的M方法操作資料庫。對於一些簡單的sql語句無需手工寫,用熟悉的M()->where()->limit()->find()這樣的語法即可完成。曾經面試有人問我為什麼thinkPHP的M方法能夠進行連續操作,現在終於明白是使用了單利模式。
2.屏蔽了資料庫的差異。M方法的另一個優點是用來組件sql語句,對高層屏蔽資料庫差異。當然,對於復雜的查詢,M方法是做不到的,此時可以使用已被重寫過的mysql_query以及mongo_query執行你的sql語句。
3.自定義路由。這一點模仿了CI的route.php,將url同控制器的映射關系寫到一個配置文件里。
不足之處:
view文件不支持變數循環輸出。目前的解決方案是使用angularjs調用介面在頁面輸出內容。框架示常式序便是一個使用angularjs的和bootstrap的界面。
④ php 數據緩存
1、普遍緩存技術:
數據緩存:這里所說的數據緩存是指資料庫查詢PHP緩存機制,每次訪問頁面的時候,都會先檢測相應的緩存數據是否存在,如果不存在,就連接資料庫,得到數據,並把查詢結果序列化後保存到文件中,以後同樣的查詢結果就直接從緩存表或文件中獲得。
用的最廣的例子看Discuz的搜索功能,把結果ID緩存到一個表中,下次搜索相同關鍵字時先搜索緩存表。
舉個常用的方法,多表關聯的時候,把附表中的內容生成數組保存到主表的一個欄位中,需要的時候數組分解一下,這樣的好處是只讀一個表,壞處就是兩個數據同步會多不少步驟,資料庫永遠是瓶頸,用硬碟換速度,是這個的關鍵點。
2、 頁面緩存:
每次訪問頁面的時候,都會先檢測相應的緩存頁面文件是否存在,如果不存在,就連接資料庫,得到數據,顯示頁面並同時生成緩存頁面文件,這樣下次訪問的時候頁面文件就發揮作用了。(模板引擎和網上常見的一些PHP緩存機制類通常有此功能)
3、 時間觸發緩存:
檢查文件是否存在並且時間戳小於設置的過期時間,如果文件修改的時間戳比當前時間戳減去過期時間戳大,那麼就用緩存,否則更新緩存。
4、 內容觸發緩存:
當插入數據或更新數據時,強制更新PHP緩存機制。
5、 靜態緩存:
這里所說的靜態緩存是指靜態化,直接生成HTML或XML等文本文件,有更新的時候重生成一次,適合於不太變化的頁面,這就不說了。
以上內容是代碼級的解決方案,我直接CP別的框架,也懶得改,內容都差不多,很容易就做到,而且會幾種方式一起用,但下面的內容是伺服器端的緩存方案,非代碼級的,要有多方的合作才能做到
6、 內存緩存:
Memcached是高性能的,分布式的內存對象PHP緩存機制系統,用於在動態應用中減少資料庫負載,提升訪問速度。
7、 php的緩沖器:
有eaccelerator, apc, phpa,xcache,這個這個就不說了吧,搜索一堆一堆的,自己看啦,知道有這玩意就OK
8、 MYSQL緩存:
這也算非代碼級的,經典的資料庫就是用的這種方式,看下面的運行時間,0.09xxx之類的
9、 基於反向代理的Web緩存:
如Nginx,SQUID,mod_proxy(apache2以上又分為mod_proxy和mod_cache)
10、 DNS輪詢:
BIND是一款開放源碼的DNS伺服器軟體,這個要說起來就大了,自己搜索去,大家知道有這個東西就行了。
⑤ 如何實現PHP片段緩存
因為資料庫用的是PostgreSQL,並發承受非常弱,於是採取了大量緩存策略。已經實現的有:在模型層基類利用memcache緩存PDO獲取的關聯數組,下次訪問就直接從memcached讀取,直到數據更新(也由該模型類承擔)時候更新的方法摧毀緩存。對於頁面級別緩存,自己寫了一些實現,主要利用php的文件操作函數將頁面存為靜態,下次讀取到緩存的時候就終止控制器執行action,直接返回緩存結果。部署在ubuntu 10.10、nginx+fastcgi(php-fpm)+php5.3+apc+memcached、pgsql 9上用Apache ab壓力測試,結果第二種方法從硬碟獲取緩存的居然比第一種從內存獲取緩存的要好,分析原因應該是因為第二種終止了控制器動作。看來Zend Framework的開銷真的很大。因為有獨立伺服器不用寄居學校虛擬主機,所以計劃繼續刪減Zend……現在新的問題來了,在網站中更常用的應該是頁面片段緩存,可是真的從未聽說什麼PHP頁面片段緩存的方案。谷歌了一下,都是說Yii Framework的片段緩存的。現在我想自己實現片段緩存,可是很沒有思路。以上第二種方法在片段緩存問題上行不通,因為內容沒有輸出完全不能終止控制器執行(比較笨,我用在整頁緩存中是命中緩存後exit()暴力退出的)。而不終止控制器第二種方案基本就沒有性能優勢。而且因為視圖引擎是Blitz,沒有自帶緩存方案,自定義片段緩存不能依賴視圖層。之前.net了一年,現在換屆了想和團隊往開源方向走,可是PHP的一些具體解決方案實在了解甚少。不知大家可否提供一些思路呢?謝謝大家啦~
⑥ 如何讓php對頁面的緩存進行控制 php處理請求的瀏覽器緩存處理
你說的這個是瀏覽器緩存。你可以到頁面里找下類似這樣的語句.header('Cache-Control:max-age='.CACHE_PAGE_CONTENT_TTL.',must-revalidate');這就是緩存控制,你可以改成header('Cache-Control:no-cache');或者,最直接的法就是在輸出語句前,加header('Cache-Control:no-cache');
⑦ Thinkphp,靜態緩存後,如何實現局部緩存
可以用layout的么~
建議對於要實現類似用戶登錄判斷的頁面,還是只用一般的緩存就好了---比靜態化效果差不了多少的~---如果你的緩存處理好的話。
不然就用layout或者用iframe把你需要驗證的,放在一個不緩存,不靜態化的頁面里~
⑧ PHP緩存問題,非瀏覽器原因,非項目原因,但是緩存很嚴重,懸賞值不是問題,求解答。
嘗試關閉 opcache 或者其他類似的 bytecode 緩存,這些設置一般都放在 php.ini 里
⑨ php 緩存怎麼寫
PHP數據緩存常用頁面緩存 靜態緩存
php頁面緩存主要用到的是ob系列函數,如ob_start(),ob_end_flush(),ob_get_contents()
靜態緩存是指靜態化,直接生成HTML或XML等文本文件,有更新的時候重生成一次,適合於不太變化的頁面
給你個頁面緩存的例子
function page_cache($ttl = 0)
{
$ttl = $ttl ? $ttl : PAGE_TTL;//緩存時間,默認3600s
$contents = ob_get_contents();//從緩存中獲取內容
$contents = "<!--page_ttl:".(time() + $ttl)."-->n".$contents;
//加上自定義頭部:過期時間=生成時間+緩存時間
file_put_contents(PAGE_FILE, $contents);//寫入緩存文件中
ob_end_flush();//釋放緩存
}
⑩ 如何清除php的緩存區
緩存區是指什麼緩存,一般是邏輯緩存跟進程緩存(不知道這個名詞對不對,反正就這個意思)。邏輯緩存指的是文件緩存,redis之類的,這種你把對應的文件或者上redis-client清除就可以了。如果是進程緩存,一般生命周期不長,頁面結束就會回收的,所以這個不用特意清,這個的清除方式是重啟服務,如果用fast-cgi就重啟php-fpm。如果是用apache的mole載入,就重啟apache