今天要做一個大檔案上傳進度效果,後來網上說有php apc可以實現,後來百度了一下php apc資訊,PHP APC提供兩種緩衝功能,即緩衝Opcode(目標檔案),我們稱之為apc_compiler_cache。同時它還提供一些介面用於PHP開發人員將使用者資料駐留在記憶體中,我們稱之為apc_user_cache
想用一下APC緩衝到底效果如何,無奈在windows找不到相應版本的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
|
最後記得重啟伺服器:
| 代碼如下 |
複製代碼 |
| service httpd restart |
,然後用PHP的phpinfo()函數可以檢測到:
APC緩衝函數執行個體
在APC中我們也可以享受APC帶來的緩衝大檔案上傳進度的特性,需要在php.ini中將apc.rfc1867設為1,
並且在表單中加一個隱藏欄位 APC_UPLOAD_PROGRESS,這個域的值可以隨機產生一個hash,以確保唯一。
APC有很多設定,你可以在php.ini中對它設定,如:
| 代碼如下 |
複製代碼 |
[APC] apc.enabled = 1 apc.shm_segments = 1 apc.shm_size = 64 apc.max_file_size = 10M apc.stat=1
|
我試用了下PHP中常見的APC函數:
| 代碼如下 |
複製代碼 |
/*添加變數到資料存放區 bool apc_add ( string $key , mixed $var [, int $ttl = 0 ] ) 如果key存在了,不會覆蓋,但返回false */ apc_add('url','http://www.111cn.Net'); /*從緩衝中取出儲存的變數 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是不存在的"; } /*遞增一個儲存的數字,成功時返回 key 的當前值, 或者在失敗時返回 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); /*遞減一個儲存變數的數字,成功時返回 key 的當前值, 或者在失敗時返回 FALSE int apc_dec ( string $key [, int $step = 1 [, bool &$success ]] ) */ $ret = apc_dec('astring', 1, $fail); var_dump($ret); var_dump($fail); |
另外提供一個很好用的APC緩衝類:
| 代碼如下 |
複製代碼 |
/********************************************************************************* * APC緩衝類,著作權(摘自InitPHP架構) ***********************************************************************************/ class MyApc { /** * 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擷取快取資料 * @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); } /** * 欄位自增-用於記數 * @param string $key KEY值 * @param int $step 新增的step值 */ public function inc($key, $step) { return apc_inc($key, (int) $step); } /** * 欄位自減-用於記數 * @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.phpddt.com'); print_r($apc->get_cache('key')); |
總結
1,使用Spinlocks鎖機制,能夠達到最佳效能。
2,APC提供了apc.php,用於監控與管理APC緩衝。不要忘記修改管理員名和密碼
3,APC預設通過mmap匿名映射建立共用記憶體,緩衝對象都存放在這塊”大型”的記憶體空間。由APC自行管
理該共用記憶體
4,我們需要通過統計調整apc.shm_size、apc.num_files_hints、apc.user_entries_hint的值。直到最
佳
5,好吧,我承認apc.stat = 0 可以獲得更佳的效能。要我做什麼都可以接受.
6,PHP預定義常量,可以使用apc_define_constants()函數。不過據APC開發人員介紹說pecl hidef效能更
佳,拋異define吧,它是低效的。
7,函數apc_store(),對於系統設定等PHP變數,生命週期是整個應用(從httpd守護進程直到httpd守護進
程關閉),使用APC比Memcached會更好。必竟不要經過網路傳輸協議tcp。
8,APC不適於通過函數apc_store()緩衝頻繁變更的使用者資料,會出現一些奇異現象。
http://www.bkjia.com/PHPjc/629903.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/629903.htmlTechArticle今天要做一個大檔案上傳進度效果,後來網上說有php apc可以實現,後來百度了一下php apc資訊,PHP APC提供兩種緩衝功能,即緩衝Opcode(目標文...