今天要做一個大文件上傳進度效果,后來網(wǎng)上說有php apc可以實現(xiàn),后來百度了一下php apc信息,PHP APC提供兩種緩存功能,即緩存Opcode(目標(biāo)文件),我們稱之為apc_compiler_cache,同時它還提供一些接口用于PHP開發(fā)人員將用戶數(shù)據(jù)駐留在內(nèi)存中,我們稱之為apc_user_cache,想用一下APC緩存到底效果如何,無奈在windows找不到相應(yīng)版本的php-apc.dll擴展文件,只好在linux下安裝了,不用源碼方式安裝,直接yum就行了.
首先要安裝apc的依賴包,代碼如下:
yum install php-pear php-devel httpd-devel pcre-devel gcc make
然后使用pecl安裝apc,代碼如下:pecl install apc
添加apc擴展到配置文件,代碼如下:
echo "extension=apc.so" > /etc/php.d/apc.ini
最后記得重啟服務(wù)器,代碼如下:
service httpd restart
然后用PHP的phpinfo()函數(shù)可以檢測到.
APC緩存函數(shù)實例:在APC中我們也可以享受APC帶來的緩存大文件上傳進度的特性,需要在php.ini中將apc.rfc1867設(shè)為1,并且在表單中加一個隱藏域 APC_UPLOAD_PROGRESS,這個域的值可以隨機生成一個hash,以確保唯一.
APC有很多設(shè)置,你可以在php.ini中對它設(shè)置,代碼如下:
- [APC]
- apc.enabled = 1
- apc.shm_segments = 1
- apc.shm_size = 64
- apc.max_file_size = 10M
- apc.stat=1
我試用了下PHP中常見的APC函數(shù),代碼如下:
- <?php
- /*添加變量到數(shù)據(jù)存儲
- bool apc_add ( string $key , mixed $var [, int $ttl = 0 ] )
- 如果key存在了,不會覆蓋,但返回false
- */
- apc_add('url','http://www.survivalescaperooms.com');
- /*從緩存中取出存儲的變量
- mixed apc_fetch ( mixed $key [, bool &$success ] )
- */
- var_dump(apc_fetch('url'));
- /*使用 apc_store() 存儲的變量,.key是唯一的,所以 兩個值使用同一個名稱,原來的將被新的值覆蓋
- bool apc_store ( string $key , mixed $var [, int $ttl = 0 ] )
- */
- apc_store('var','新的變量');
- /*從用戶緩存中刪除某個變量
- mixed apc_delete ( string $key )
- */
- apc_delete('url');
- /*清楚apc緩存
- bool apc_clear_cache ([ string $cache_type ] )
- */
- apc_clear_cache('user');
- /*檢查APC中是否存在某個或者某些key,如果Key存在的話返回 TRUE , 否則返回 FALSE
- mixed apc_exists ( mixed $keys )
- */
- if(apc_exsists('url')){
- echo "這個key真存在";
- }else{
- echo "貌似這個key是不存在的";
- }
- /*遞增一個儲存的數(shù)字,成功時返回 key 的當(dāng)前值, 或者在失敗時返回 FALSE
- int apc_inc ( string $key [, int $step = 1 [, bool &$success ]] )
- */
- apc_store('anumber', 42);
- $ret = apc_inc('anumber', 1, $fail);
- var_dump($ret);
- var_dump($fail);
- /*遞減一個存儲變量的數(shù)字,成功時返回 key 的當(dāng)前值, 或者在失敗時返回 FALSE
- int apc_dec ( string $key [, int $step = 1 [, bool &$success ]] )
- */
- $ret = apc_dec('astring', 1, $fail);
- var_dump($ret);
- var_dump($fail);
- ?>
另外提供一個很好用的APC緩存類,代碼如下:
- <?php
- /*********************************************************************************
- * APC緩存類,版權(quán)(摘自InitPHP框架)
- ***********************************************************************************/
- class MyApc {
- /**
- * Apc緩存-設(shè)置緩存
- * 設(shè)置緩存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ù)據(jù)
- * @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();
- }
- }
- //使用方法如下:
- $apc = new MyApc();
- $apc->set_cache('key','test by www.survivalescaperooms.com');
- print_r($apc->get_cache('key'));
- ?>
總結(jié):
1,使用Spinlocks鎖機制,能夠達到最佳性能。
2,APC提供了apc.php,用于監(jiān)控與管理APC緩存。不要忘記修改管理員名和密碼
3,APC默認通過mmap匿名映射創(chuàng)建共享內(nèi)存,緩存對象都存放在這塊”大型”的內(nèi)存空間。由APC自行管理該共享內(nèi)存
4,我們需要通過統(tǒng)計調(diào)整apc.shm_size、apc.num_files_hints、apc.user_entries_hint的值。直到最佳
5,好吧,我承認apc.stat = 0 可以獲得更佳的性能。要我做什么都可以接受.
6,PHP預(yù)定義常量,可以使用apc_define_constants()函數(shù)。不過據(jù)APC開發(fā)者介紹說pecl hidef性能更佳,拋異define吧,它是低效的。
7,函數(shù)apc_store(),對于系統(tǒng)設(shè)置等PHP變量,生命周期是整個應(yīng)用(從httpd守護進程直到httpd守護進程關(guān)閉),使用APC比Memcached會更好。必竟不要經(jīng)過網(wǎng)絡(luò)傳輸協(xié)議tcp。
8,APC不適于通過函數(shù)apc_store()緩存頻繁變更的用戶數(shù)據(jù),會出現(xiàn)一些奇異現(xiàn)象.
新聞熱點
疑難解答