一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

PHP APC緩存配置、使用詳解

一、APC緩存簡介
APC,全稱是Alternative php Cache,官方翻譯叫”可選php緩存”。它為我們提供了緩存和優(yōu)化php的中間代碼的框架。 APC的緩存分兩部分:系統(tǒng)緩存和用戶數(shù)據緩存。
系統(tǒng)緩存
它是指APC把php文件源碼的編譯結果緩存起來,然后在每次調用時先對比時間標記。如果未過期,則使用緩存的中間代碼運行。默認緩存
 3600s(一小時)。但是這樣仍會浪費大量CPU時間。因此可以在php.ini中設置system緩存為永不過期(apc.ttl=0)。不過如果這樣設置,改運php代碼后需要重啟WEB服務器。目前使用較多的是指此類緩存。
用戶數(shù)據緩存
緩存由用戶在編寫php代碼時用apc_store和apc_fetch函數(shù)操作讀取、寫入的。如果數(shù)據量不大的話,可以一試。如果數(shù)據量大,使用類似memcache此類的更加專著的內存緩存方案會更好
緩存key生成規(guī)則
APC的緩存中的每個slot都會有一個key,key是
 apc_cache_key_t結構體類型,除了key相關的屬性,關鍵是h字段的生成。 h字段決定了此元素落于slots數(shù)組的哪一個位置。對于用戶緩存和系統(tǒng)緩存,其生成規(guī)則不同。 用戶緩存通過apc_cache_make_user_key函數(shù)生成key。通過用戶傳遞進來的key字符串,依賴php內核中的hash函數(shù)(php的hashtable所使用的hash函數(shù):zend_inline_hash_func),生成h值。
系統(tǒng)緩存通過apc_cache_make_file_key函數(shù)生成key。通過APC的配置項apc.stat的開關來區(qū)別對待不同的方案。在打開的情況下,即
 apc.stat= On 時,如果被更新則自動重新編譯和緩存編譯后的內容。此時的h值是文件的device和inode相加所得的值。在關閉的情況下,即apc.stat=off時,當文件被修改后,如果要使更新的內容生效,則必須重啟Web服務器。此時h值是根據文件的路徑地址生成,并且這里的路徑是絕對路徑。即使你是使用的相對路徑,也會查找PG(include_path)定位文件,以取得絕對路徑,所以使用絕對路徑會跳過檢查,可以提高代碼的效率。
添加緩存過程
以用戶緩存為例,apc_add函數(shù)用于給APC緩存中添加內容。如果key參數(shù)為字符串中,APC會根據此字符串生成key,如果key參數(shù)為數(shù)組,APC會遍歷整個數(shù)組,生成key。根據這些key,APC會調用_apc_store將值存儲到緩存中。由于這是用戶緩存,當前使用的緩存為apc_user_cache。執(zhí)行寫入操作的是apc_cache_make_user_entry函數(shù),其最終調用apc_cache_user_insert執(zhí)行遍歷查詢和寫入操作。與此對應,系統(tǒng)緩存使用apc_cache_insert執(zhí)行寫入操作,其最終都會調用_apc_cache_insert。
不管是用戶緩存還是系統(tǒng)緩存,大體的執(zhí)行過程類似,步驟如下:

通過求余操作,定位當前key的在slots數(shù)組中的位置: cache->slots[key.h % cache->num_slots];
在定位到slots數(shù)組中的位置后,遍歷當前key對應的slot鏈表,如果存在slot的key和要寫入的key匹配或slot過期,清除當前slot。
在最后一個slot的后面插入新的slot。
二、APC模塊安裝

A.WINDOWS下安裝APC
第一步:下載php_apc.dll 在http://pecl.php.NET/package/apc 要與php版本對應 將php_apc.dll放入你的ext目錄
第二步:讓php.ini支持apc擴展模塊。 然后打開php.ini 加入:
復制代碼 代碼如下:extension=php_apc.dll
apc.rfc1867 = on
apc.max_file_size = 100M
upload_max_filesize = 100M
post_max_size = 100M
//以上參數(shù)可自己定義

第三步:檢查是否支持php APC apc_store apc_fetch
查看phpinfo中是否有apc相關項

B.LIUNX下安裝APC
第一步:下載和安裝
wget http://pecl.php.NET/get/APC-3.1.8.tgz
tar -zxvf APC-3.1.8.tgz cd APC-3.1.8
/usr/local/php/bin/phpize
./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex --with-php-config=/usr/local/php/bin/php-config
make
sudo make install
第二步:配置APC
在/usr/local/php/etc/php.ini 加入以下配置項:
復制代碼 代碼如下:
extension = "apc.so" ;
;APC setting
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64M
apc.optimization = 1
apc.num_files_hint = 0
apc.ttl = 0
apc.gc_ttl = 3600
apc.cache_by_default = on
第三步:檢查安裝是否成功
重啟apache 或者 /usr/local/php/sbin/php-fpm restart
查看phpinfo中是否有apc相關項
三、配置參數(shù)詳解和使用總結
1).APC模塊的參數(shù)配置詳解

復制代碼 代碼如下:
apc.enabled  布爾型
apc.enabled 可以被設成 0 來禁用 APC。這主要是有用的,當 APC 被靜態(tài)編譯入 php 時,因為沒有其它方法來禁用它(當編譯為 DSO 的時候,可以將 php.ini 中的 extension 行注釋掉)。

apc.shm_segments  整型
對編譯緩存分配共享內存塊的數(shù)量。如果APC用光了共享內存,而且你已經設置apc.shm_size為系統(tǒng)允許的最大值的情況下,你可以試著去提高這個參數(shù)的值。

apc.shm_size  整型
每個共享內存塊的大小是以MB為單位的。在默認情況下,一些系統(tǒng)(包括大多數(shù)BSD變種系統(tǒng))的共享內存塊的大小限制的很低。

apc.optimization  整型
優(yōu)化等級。設為0則禁用優(yōu)化,越高的值使用越強有力的優(yōu)化。期待有適度的速度上的改進。這個還是實驗性質的。

apc.num_files_hint  整型
對在你的Web服務器上被包含和請求的不同的源文件的數(shù)量的提示。如果你無法確定,設置為0或者省略;這個設置主要可能用于有成千的源文件的站點。

apc.ttl  整型
當一個緩存條目在緩存區(qū)的位置被另一個條目需要時,我們需要考慮的是這個緩存條目在緩存區(qū)的位置被允許空閑的秒數(shù)。將這個參數(shù)設置為0意味著你的緩存可能充滿不新鮮的條目,同時導致新的條目無法被緩存。

apc.gc_ttl  整型
緩存條目在垃圾收集列表中存活的秒數(shù)。這個值提供了出錯保護在執(zhí)行一個緩存源文件,而同時服務器進程死了的事件中。如果那個源文件被修改,內存分配給舊版本的緩存條目將不會被回收,直到這個參數(shù)設定的TTL值到的時候。設置為0就是禁止這個特性。

apc.cache_by_default  布爾型
默認為On,但可以被設置為Off并和以加號開頭的apc.filters配合使用,文件僅僅在匹配過濾器時才被緩存。

apc.filters  字符串
一個以逗號分割的POSIX擴展正則表達式的列表。如果任何模式匹配源文件名,這個文件將不會被緩存。注意用來匹配的文件名是傳遞給 include/require 的文件名,而不是絕對路徑。如果正則表達式的第一個字符是 + ,則這個表達式就意味著任何匹配表達式的文件將會被緩存,如果第一個字符是 - 則任何匹配都不會被緩存。 - 是默認值,所以可以被省略。

apc.mmap_file_mask  字符串 (這段實在不太懂,所以沒有翻譯)
If compiled with MMAP support by using --enable-mmap this is the mktemp-style file_mask to pass to the mmap module for determing whether your mmap'ed memory region is going to be file-backed or shared memory backed. For straight file-backed mmap, set it to something like/tmp/apc.XXXXXX (exactly 6 Xs). To use POSIX-style shm_open/mmap put a .shm somewhere in your mask. e.g. /apc.shm.XXXXXX You can also set it to /dev/zero to use your kernel's/dev/zero interface to anonymous mmap'ed memory. Leaving it undefined will force an anonymous mmap.

apc.slam_defense  整型
在非常繁忙的服務器上,無論你啟動服務還是修改文件,你都會導致一種多進程都試圖在同一個時間緩存同一個文件的競爭。這個選項設置了進程跳過試圖去緩存一個未被緩存的文件的百分比。或者可以把這個想象成一個單獨進程跳過緩存的機率。例如,設置apc.slam_defense為75就意味著進程有75%的機率不去緩存未被緩存的文件。所以,設置的越高,越能減少緩存的碰撞機率。設置為0則禁用這個特性。

apc.file_update_protection  整型
當你在一個運行著的服務器上修改文件時,你應該執(zhí)行原子操作。也就是,先寫一個臨時文件,當寫完后再重命名(mv)這個文件到它的最終位置。許多文本編輯器,cp,tar和其他一些類似程序都不是這樣操作的。這就意味著有機會去訪問和(緩存)文件,當這個文件還在被寫的情況下。apc.file_update_protection的設置使得緩存標記新文件的延遲。默認值是2,意味著如果發(fā)現(xiàn)文件的修改時間距離訪問時間不到2秒,文件將不會被緩存。訪問寫到一半的文件的不幸用戶將會看到離奇的情況,但至少這種情況不是持續(xù)的。如果你確信你經常使用原子操作來更新你的文件,你可以關閉這個保護通過設置這個參數(shù)為0。如果你的系統(tǒng)充滿io操作,并導致更新程序花費超過2秒,你可能需要去增大這個值。

apc.enable-cli  整型
大多是為了測試和調試。為CLI版本的php開啟動APC功能。一般來說,你將不會想到為每一個CLI請求創(chuàng)建,移植和放棄APC的緩存,但對于各種測試情況,這是很容易的為了CLI版本開啟APC。

2).使用總結
1,使用Spinlocks鎖機制,能夠達到最佳性能。
2,APC提供了apc.php,用于監(jiān)控與管理APC緩存。不要忘記修改管理員名和密碼
3,APC默認通過mmap匿名映射創(chuàng)建共享內存,緩存對象都存放在這塊”大型”的內存空間。由APC自行管理該共享內存
4,我們需要通過統(tǒng)計調整apc.shm_size、apc.num_files_hints、apc.user_entries_hint的值。直到最佳
5,好吧,我承認apc.stat = 0 可以獲得更佳的性能。要我做什么都可以接受.
6,php預定義常量,可以使用apc_define_constants()函數(shù)。不過據APC開發(fā)者介紹說pecl hidef性能更佳,拋異define吧,它是低效的。
7,函數(shù)apc_store(),對于系統(tǒng)設置等php變量,生命周期是整個應用(從httpd守護進程直到httpd守護進程關閉),使用APC比Memcached會更好。必竟不要經過網絡傳輸協(xié)議tcp。
8,APC不適于通過函數(shù)apc_store()緩存頻繁變更的用戶數(shù)據,會出現(xiàn)一些奇異現(xiàn)象。

四、使用實例
下面引用initphp框架的APC緩存類
復制代碼 代碼如下:
<?php
if
class Apc{

    /**
     * Apc緩存-設置緩存
     * 設置緩存key,value和緩存時間
     * @param  string $key   KEY值
     * @param  string $value 值
     * @param  string $time  緩存時間
     */
    public function set_cache($key, $value, $time = 0) { 
        if ($time == 0) $time = null; //null情況下永久緩存
        return apc_store($key, $value, $time);;
    }

    
    /**
     * Apc緩存-獲取緩存
     * 通過KEY獲取緩存數(shù)據
     * @param  string $key   KEY值
     */
    public function get_cache($key) {
        return apc_fetch($key);
    }

    /**
     * Apc緩存-清除一個緩存
     * 從memcache中刪除一條緩存
     * @param  string $key   KEY值
     */
    public function clear($key) {
        return apc_delete($key);
    }

    /**
     * Apc緩存-清空所有緩存
     * 不建議使用該功能
     * @return
     */
    public function clear_all() {
        apc_clear_cache('user'); //清除用戶緩存
        return apc_clear_cache(); //清楚緩存
    }

    /**
     * 檢查APC緩存是否存在
     * @param  string $key   KEY值
     */
    public function exists($key) {
        return apc_exists($key);
    }

    /**
     * 字段自增-用于記數(shù)
     * @param string $key  KEY值
     * @param int    $step 新增的step值
     */
    public function inc($key, $step) {
        return apc_inc($key, (int) $step);
    }

    /**
     * 字段自減-用于記數(shù)
     * @param string $key  KEY值
     * @param int    $step 新增的step值
     */
    public function dec($key, $step) {
        return apc_dec($key, (int) $step);
    }

    /**
     * 返回APC緩存信息
     */
    public function info() {
        return apc_cache_info();
    }
}

php技術PHP APC緩存配置、使用詳解,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日韩中文字幕免费在线观看 | 午夜激情视频在线观看 | 一级片久久 | 精品一区二区三区18 | 亚洲国产91 | 激情五月婷婷久久 | 黄色大片网站在线观看 | 亚洲不卡一区二区三区在线 | 怡红院亚洲红怡院天堂麻豆 | 在线观看亚洲一区二区 | 华人亚洲欧美精品国产 | 日韩欧美一区黑人vs日本人 | 色视频免费观看高清完整 | 91香蕉国产亚洲一二三区 | 浮力影院第一页小视频国产在线观看免费 | 国产精品视频一 | 亚洲国产成人久久精品动漫 | 人人九九精 | 国内精品视频区在线2021 | 东京加勒比中文字幕波多野结衣 | 99re热久久 | 九九99国产精品视频 | 伊人狠狠色j香婷婷综合 | 2021国内精品久久久久久影院 | 91美女在线播放 | 国产一区二区视频在线观看 | 美女被男人桶到嗷嗷叫爽网站 | 成人嗯啊视频在线观看 | 国产精品欧美久久久久天天影视 | 中文字幕佐山爱一区二区免费 | 婷婷丁香综合网 | 天天躁天天碰天天看 | 国产精品自在线观看剧情 | 亚洲黄色在线网站 | 最近中文字幕无吗免费高清 | 91视频插插插 | 亚洲第一免费视频 | 欧美一区二区三区视频 | 国产日韩精品一区在线不卡 | 韩国一大片a毛片 | 亚洲视频欧洲视频 |