php+apc 安裝與優化
阿新 • • 發佈:2019-01-28
php 程式碼快取APC
PHP語言是一個功能強大的嵌入式HTML指令碼語言,很多程式設計師都在使用這一語言來進行網站的建立。PHP APC,全稱是Alternative PHP Cache,官方翻譯叫”可選PHP快取”,但我個人覺得應該叫”另一個PHP快取”。
PHP APC提供兩種快取功能,即快取Opcode(目標檔案),我們稱之為apc_compiler_cache。同時它還提供一些介面用於PHP開發人員將使用者資料駐留在記憶體中,我們稱之為apc_user_cache。
PHP APC的安裝:
下載php_apc.dll
開啟php.ini.搜尋;extension=php_zip.dll 在這一行下面加上
extension=php_apc.dll
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64
apc.optimization = 0
apc.num_files_hint = 1000
apc.ttl = 0
apc.gc_ttl = 3600
apc.cache_by_default = On
apc.slam_defense = 0
apc.file_update_protection = 2
apc.enable_cli = 0
apc.stat=0
apc.rfc1867 = on
儲存php.ini,重新啟動你的IIS或者Apache.就安裝成功了..
開啟phpinfo.php 如果看到 apc那麼就安裝成功了.
PHP APC的使用:
PHP APC的使用:
APC的使用其實倒說不上.APC是個優化器,自安裝之日起,就默默地在後臺為您的PHP應用服務了.您的所有PHP程式碼會被快取起來. 另外,APC可提供一定的記憶體快取功能.但是這個功能並不是十分完美,有報告說如果頻繁使用APC快取的寫入功能,會導致不可預料的錯誤.如果想使用這個功能,可以看看apc_fetch,apc_store等幾個與apc快取相關的函式. APC引入了一個小甜餅,解決了困擾大家已久的大檔案上傳的進度條問題.
PHP APC的高階使用
1.快取期限: APC的快取分兩部分:系統快取和使用者資料快取.
系統快取 是自動使用的,是指APC把PHP檔案原始碼的編譯結果快取起來,然後在再次呼叫時先對比時間標記。如果未過期,則使用快取程式碼執行。預設快取 3600s(一小時).但是這樣仍會浪費大量CPU時間.因此可以在php.ini中設定system快取為永不過期(apc.ttl=0).不過如果這樣設定,執行php程式碼後需要restart一下您的web伺服器(比如apache…).目前對APC的效能測試一般指的是這一層cache;
使用者資料快取 由使用者在編寫php程式碼時用apc_store和apc_fetch函式操作讀取、寫入的.如果量不大的話我建議可以使用一下.如果量大,我建議使用memcache會更好.
2.狀態控制和分析: PHP APC的原始碼包自帶了一個apc.php;您可以將這個檔案上傳到web伺服器的某個目錄下,用瀏覽器訪問,這會顯示當前的狀態.我們可以從這裡的表格分析當前的快取狀況,作出進一步優化. apc-info-clublocalhost2.png 這是某test站點的狀態.您可以慢慢分析,這個工具會提供很多有用的工具.比如您可以看到哪些檔案經常被包含(訪問),您快取的哪個變數經常被讀取,或經常被更新等. 最後順便提一句,有獨立報告說,PHP APC的程式碼快取、優化效果要高出zend優化器.
注意:在不久的將來, 此加速器可能變得更好,據說PHP6.X版本中要整合此加速器.
pc的用法比較簡單,只有幾個函式,列舉如下
apc_clear_cache() 清除apc快取內容預設(無引數)時,只清除系統快取,要清除使用者快取,需用’user’引數
apc_define_constants ( string key, array constants [, bool case_sensitive] )將陣列constants以常量加入快取
apc_load_constants (string Key)取出常量快取
apc_store ( string key, mixed var [, int ttl] )在快取中儲存資料
apc_fetch ( string key )獲得apc_store儲存的快取內容
apc_delete ( string key )刪除apc_store儲存的內容
以常量加入快取 並取出快取
<?php
$constants = array('APC_FILE' => 'apc.php', 'AUTHOR' => 'tim');
apc_define_constants('numbers', $constants);
apc_load_constants('numbers');
echo 'APC_FILE='.APC_FILE;
echo 'AUTHOR='.AUTHOR;
?>
新增和取出快取
<?php
if(!apc_fetch('time1')){ //判斷是否儲存快取 如果fei 的話那麼就新增快取
apc_store('time1', time());
}
if(!apc_fetch('time2')) {
apc_store('time2', time(),2); //新增過期時間
}
//取出
echo 'time1:'.apc_fetch('time1');
echo 'time2:'.apc_fetch('time2');
?>
快取物件並取出,取出後可以訪問物件的屬性和方法
<?php
class a{
function b(){
return '你訪問了a類的b方法';
}
}
header('content-type: text/html;charset=utf-8');
apc_store('obj',new a());
$a = apc_fetch('obj');
echo $a->b();
?>
陣列快取
<?php
$arr = array('a'=>'i am a','b'=>'i am b');
apc_store('arr',$arr);
$apc_arr = apc_fetch('arr');
print_r($apc_arr);
?>
提示:如果設定了快取時間 那麼可以重新整理一下,看ttl設定是否生效
在 PHP Cache 層,Facebook 採用了 APC。
與PHP中其他的機制不同,使用 apc_store() 儲存的變數 在不同的請求之間一直持久存在(直到從快取系統中移除)。
其他常用apc 函式
apc_exists — 檢查APC中是否存在某個或者某些key
<?php
$fruit = 'apple';
apc_store('foo', $fruit);
if (apc_exists('foo')) {
echo "Foo exists: ";
echo apc_fetch('foo');
} else {
echo "Foo does not exist";
}
?>
apc_clear_cache(); 自動清除系統快取
apc_clear_cache('user'); 自動使用者快取
class apcInit {
/**
* 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();
}
}
PHP語言是一個功能強大的嵌入式HTML指令碼語言,很多程式設計師都在使用這一語言來進行網站的建立。PHP APC,全稱是Alternative PHP Cache,官方翻譯叫”可選PHP快取”,但我個人覺得應該叫”另一個PHP快取”。
PHP APC提供兩種快取功能,即快取Opcode(目標檔案),我們稱之為apc_compiler_cache。同時它還提供一些介面用於PHP開發人員將使用者資料駐留在記憶體中,我們稱之為apc_user_cache。
PHP APC的安裝:
下載php_apc.dll
開啟php.ini.搜尋;extension=php_zip.dll 在這一行下面加上
extension=php_apc.dll
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64
apc.optimization = 0
apc.num_files_hint = 1000
apc.ttl = 0
apc.gc_ttl = 3600
apc.cache_by_default = On
apc.slam_defense = 0
apc.file_update_protection = 2
apc.enable_cli = 0
apc.stat=0
apc.rfc1867 = on
儲存php.ini,重新啟動你的IIS或者Apache.就安裝成功了..
開啟phpinfo.php 如果看到 apc那麼就安裝成功了.
PHP APC的使用:
PHP APC的使用:
APC的使用其實倒說不上.APC是個優化器,自安裝之日起,就默默地在後臺為您的PHP應用服務了.您的所有PHP程式碼會被快取起來. 另外,APC可提供一定的記憶體快取功能.但是這個功能並不是十分完美,有報告說如果頻繁使用APC快取的寫入功能,會導致不可預料的錯誤.如果想使用這個功能,可以看看apc_fetch,apc_store等幾個與apc快取相關的函式. APC引入了一個小甜餅,解決了困擾大家已久的大檔案上傳的進度條問題.
PHP APC的高階使用
1.快取期限: APC的快取分兩部分:系統快取和使用者資料快取.
系統快取 是自動使用的,是指APC把PHP檔案原始碼的編譯結果快取起來,然後在再次呼叫時先對比時間標記。如果未過期,則使用快取程式碼執行。預設快取 3600s(一小時).但是這樣仍會浪費大量CPU時間.因此可以在php.ini中設定system快取為永不過期(apc.ttl=0).不過如果這樣設定,執行php程式碼後需要restart一下您的web伺服器(比如apache…).目前對APC的效能測試一般指的是這一層cache;
使用者資料快取 由使用者在編寫php程式碼時用apc_store和apc_fetch函式操作讀取、寫入的.如果量不大的話我建議可以使用一下.如果量大,我建議使用memcache會更好.
2.狀態控制和分析: PHP APC的原始碼包自帶了一個apc.php;您可以將這個檔案上傳到web伺服器的某個目錄下,用瀏覽器訪問,這會顯示當前的狀態.我們可以從這裡的表格分析當前的快取狀況,作出進一步優化. apc-info-clublocalhost2.png 這是某test站點的狀態.您可以慢慢分析,這個工具會提供很多有用的工具.比如您可以看到哪些檔案經常被包含(訪問),您快取的哪個變數經常被讀取,或經常被更新等. 最後順便提一句,有獨立報告說,PHP APC的程式碼快取、優化效果要高出zend優化器.
注意:在不久的將來, 此加速器可能變得更好,據說PHP6.X版本中要整合此加速器.
pc的用法比較簡單,只有幾個函式,列舉如下
apc_clear_cache() 清除apc快取內容預設(無引數)時,只清除系統快取,要清除使用者快取,需用’user’引數
apc_define_constants ( string key, array constants [, bool case_sensitive] )將陣列constants以常量加入快取
apc_load_constants (string Key)取出常量快取
apc_store ( string key, mixed var [, int ttl] )在快取中儲存資料
apc_fetch ( string key )獲得apc_store儲存的快取內容
apc_delete ( string key )刪除apc_store儲存的內容
以常量加入快取 並取出快取
<?php
$constants = array('APC_FILE' => 'apc.php', 'AUTHOR' => 'tim');
apc_define_constants('numbers', $constants);
apc_load_constants('numbers');
echo 'APC_FILE='.APC_FILE;
echo 'AUTHOR='.AUTHOR;
?>
新增和取出快取
<?php
if(!apc_fetch('time1')){ //判斷是否儲存快取 如果fei 的話那麼就新增快取
apc_store('time1', time());
}
if(!apc_fetch('time2')) {
apc_store('time2', time(),2); //新增過期時間
}
//取出
echo 'time1:'.apc_fetch('time1');
echo 'time2:'.apc_fetch('time2');
?>
快取物件並取出,取出後可以訪問物件的屬性和方法
<?php
class a{
function b(){
return '你訪問了a類的b方法';
}
}
header('content-type: text/html;charset=utf-8');
apc_store('obj',new a());
$a = apc_fetch('obj');
echo $a->b();
?>
陣列快取
<?php
$arr = array('a'=>'i am a','b'=>'i am b');
apc_store('arr',$arr);
$apc_arr = apc_fetch('arr');
print_r($apc_arr);
?>
提示:如果設定了快取時間 那麼可以重新整理一下,看ttl設定是否生效
在 PHP Cache 層,Facebook 採用了 APC。
與PHP中其他的機制不同,使用 apc_store() 儲存的變數 在不同的請求之間一直持久存在(直到從快取系統中移除)。
其他常用apc 函式
apc_exists — 檢查APC中是否存在某個或者某些key
<?php
$fruit = 'apple';
apc_store('foo', $fruit);
if (apc_exists('foo')) {
echo "Foo exists: ";
echo apc_fetch('foo');
} else {
echo "Foo does not exist";
}
?>
apc_clear_cache(); 自動清除系統快取
apc_clear_cache('user'); 自動使用者快取
class apcInit {
/**
* 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();
}
}