memcache模塊是一個高效的守護進程,提供用於內存緩存的過程式程序和麪向對象的方便的接口,特別是對於設計動態web程序時減小對數據庫的訪問。php
memcache也提供用於通訊對話(session_handler)的處理。web
更多Memcache 模塊相關信息能夠到 http://www.danga.com/memcached/ 查閱。算法
名稱 | 默認值 | 是否可變 | 改變日誌 |
memcache.allow_failover | 「1」 | PHP_INI_ALL | Available since memcache 2.0.2. |
memcache.max_failover_attempts | "20" | PHP_INI_ALL | Available since memcache 2.1.0. |
memcache.chunk_size | "8192" | PHP_INI_ALL | Available since memcache 2.0.2. |
memcache.default_port | "11211" | PHP_INI_ALL | Available since memcache 2.0.2. |
memcache.hash_strategy | "standard" | PHP_INI_ALL | Available since memcache 2.2.0. |
memcache.hash_function | "crc32" | PHP_INI_ALL | Available since memcache 2.2.0. |
session.save_handler | "files" | PHP_INI_ALL | Supported since memcache 2.1.2 |
session.save_path | "" | PHP_INI_ALL | Supported since memcache 2.1.2 |
有關 PHP_INI_* 常量進一步的細節與定義參見PHP手冊php.ini 配置選項。數據庫
memcache.allow_failover Boolean後端
在錯誤時是否透明的故障轉移到其餘服務器上處理(注:故障轉移是動詞)。數組
memcache.max_failover_attempts integer緩存
定義服務器的數量類設置和獲取數據,只聯合 memcache.allow_failover 一同使用。
服務器
memcache.chunk_size integersession
數據將會被分紅指定大小(chunk_size)的塊來傳輸,這個值(chunk_size)越小,寫操做的請求就越多,若是發現其餘的沒法解釋的減速,請試着將這個值增大到32768.tcp
memcache.default_port string
當鏈接memcache服務器的時候,若是沒有指定端口這個默認的tcp端口將被用。
memcache.hash_strategy string
控制在映射 key 到服務器時使用哪一種策略。設置這個值一致能使hash 算法始終如一的使用於服務器接受添加或者刪除池中變量時將不會被從新映射。設置這個值以標準的結果在舊的策略被使用時。
memcache.hash_function string
控制哪一種 hsah 函數被應用於 key映射 到服務器過程當中,默認值「crc32」使用 CRC32 算法,而「fnv」則表示使用 FNV-1a 算法。
session.save_handler string
經過設置這個值爲memcache來肯定使用 memcache 用於通訊對話的處理(session handler)。
session.save_path string
定義用於通話存儲的各服務器連接的分隔符號,例如:「tcp://host1:11211, tcp://host2:11211」。
每服務器個連接能夠包含被接受於該服務器的參數,比較相似使用 Memcache::addServer() 來添加的服務器,例如:「tcp://host1:11211?persistent=1&weight=1&timeout=1& amp;retry_interval=15」。
名稱 | 類型 | 描述 |
MEMCACHE_COMPRESSED | integer | 用於調整在使用 Memcache::set(), Memcache::add() 和 Memcache::replace() 幾個函數時的壓縮比率。 |
MEMCACHE_HAVE_SESSION | integer | 若是通訊對話的處理(session handler)被容許使用其值爲 1,其餘狀況值爲 0。 |
bool Memcache::connect ( string $host [, int $port [, int $timeout ]] )
鏈接memcache服務器
$host(string) 服務器域名或ip
$port(int) 服務器tcp端口號,默認值是11211
$timeout 鏈接memcache進程的失效時間,在修改它的默認值1的時候要三思,以避免失去全部memcache緩存的優點致使鏈接變得很慢。
若是成功則返回true,失敗則返回false
<?php
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* OO API */
$memcache = new Memcache;
$memcache->connect(‘memcache_host‘, 11211);
?>
bool Memcache::pconnect ( string $host [, int $port [, int $timeout ]] )
以常鏈接方式鏈接服務器
$host(string) 服務器域名或ip
$port(int) 服務器tcp端口號,默認值是11211
$timeout 鏈接memcache進程的失效時間,在修改它的默認值1的時候要三思,以避免失去全部memcache緩存的優點致使鏈接變得很慢。
若是成功則返回true,失敗則返回false
<?php
/* procedural API */
$memcache_obj = memcache_pconnect(‘memcache_host‘, 11211);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->pconnect(‘memcache_host‘, 11211);
?>
bool Memcache::close ( void )
關閉對象 (對常鏈接不起做用)
若是成功則返回true,失敗則返回false
<?php
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* do something here .. */
memcache_close($memcache_obj);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect(‘memcache_host‘, 11211);
/* do something here .. */
$memcache_obj->close();
?>
bool Memcache::addServer ( string $host [, int $port [, bool $persistent [, int $weight [, int $timeout [, int $retry_interval [, bool $status [, callback $failure_callback ]]]]]]] )
向對象添加一個服務器(注:addServer沒有鏈接到服務器的動做,因此在memcache進程沒有啓動的時候,執行addServer成功也會返回true)
host 服務器域名或 IP
port 端口號,默認爲 11211
persistent 是否使用常鏈接,默認爲 TRUE
weight 權重,在多個服務器設置中佔的比重
timeout 鏈接服務器失效的秒數,修改默認值 1 時要三思,有可能失去全部緩存方面的優點致使鏈接變得很慢
retry_interval 服務器鏈接失敗時的重試頻率,默認是 15 秒一次,若是設置爲 -1 將禁止自動重試,當擴展中加載了 dynamically via dl() 時,不管本參數仍是常鏈接設置參數都會失效。
每個失敗的服務器在失效前都有獨自的生存期,選擇後端請求時會被跳過而不服務於請求。一個過時的鏈接將成功的從新鏈接或者被標記爲失敗的鏈接等待下一次 重試。這種效果就是說每個 web server 的子進程在服務於頁面時的重試鏈接都跟他們本身的重試頻率有關。
status 控制服務器是否被標記爲 online,設置這個參數爲 FALSE 並設置 retry_interval 爲 -1 可使鏈接失敗的服務器被放到一個描述不響應請求的服務器池子中,對這個服務器的請求將失敗,接受設置爲失敗服務器的設置,默認參數爲 TRUE,表明該服務器能夠被定義爲 online。
failure_callback 失敗時的回調函數,函數的兩個參數爲失敗服務器的 hostname 和 port
成功返回 TRUE,失敗返回 FALSE。
注:在測試addServer函數的時候咱們主要測試了其參數retry_interval和status
2.4.4.1.retry_interval參數的測試
<?php
$mem = new Memcache;
$is_add = $mem->addServer(‘localhost‘, 11211, true, 1, 1, 15, true); // retrt_interval=15
$is_set = $mem->set(‘key1‘, ‘中華人民共和國‘);
?>
上面的例子中若是localhost服務器down掉或是memcache守護進程當掉,執行請求的時候鏈接服務器失敗時算起15秒後會自動重試連 接服務器,可是在這15秒內不會去鏈接這個服務器,就是隻要有請求,沒15秒就會嘗試鏈接服務器,可是每一個服務器鏈接重試是獨立的。好比說我一次添加了兩 個服務器一個是localhost,一個是172.16.100.60,它們分別是從各自鏈接失敗那個時間算起,只要對各自服務器有請求就會每隔15秒去 鏈接各自的服務器的。
2.4.4.2.retry_interval和status結合使用的狀況
<?php
$mem = new Memcache;
$is_add = $mem->addServer(‘localhost‘, 11211, true, 1, 1, -1, false); // retrt_interval=-1, status=false
$is_set = $mem->set(‘key1‘, ‘中華人民共和國‘);
?>
在上面的retrt_interval=-1, status=false這種狀況下,將鏈接失敗的服務器放到一個不響應請求的一個池子中,所以對key分配的算法也就沒有影響了,而他是當即返回錯誤失敗仍是故障轉移還要看memcache.allow_failover的設置,執行set, add, replace,get等請求的時候都會失敗返回false,即便memcache進程運行正常。
除了與retry_interval結合使用,status單獨使用的狀況會對函數memcache::getServerStatu得到的結果產生影響
不管memcache進程的正常運行仍是當掉,status爲true的時候getServerStatus的結果都是true,反之則爲false
可是在memcache進程正常運行的狀況下,對set,add,replace,get等函數都沒有影響。
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
添加一個要緩存的數據若是做爲這個緩存的數據的鍵在服務器上還不存在的狀況下,
key 緩存數據的鍵 其長度不能超過250個字符
var 值,整型將直接存儲,其餘類型將被序列化存儲 ,其值最大爲1M
flag 是否使用 zlib 壓縮 ,當flag=MEMCACHE_COMPRESSED的時侯,數據很小的時候不會採用zlib壓縮,只有數據達到必定大小纔對數據進行zlib壓縮。(沒有具體的測試數據進行壓縮的最小值是多少)
expire 過時時間,0 爲永不過時,可以使用 unix 時間戳格式或距離當前時間的秒數,設爲秒數時不能大於 2592000(30 天)
成功返回 TRUE,失敗返回 FALSE,若是這個鍵已經存在,其餘方面memcache:;add()的行爲與memcache::set類似
<?php
$memcache_obj = memcache_connect("localhost", 11211);
/* procedural API */
memcache_add($memcache_obj, ‘var_key‘, ‘test variable‘, FALSE, 30);
/* OO API */
$memcache_obj->add(‘var_key‘, ‘test variable‘, FALSE, 30);
?>
bool Memcache::replace ( string $key , mixed $var [, int $flag [, int $expire ]] )
替換一個指定 已存在key 的的緩存變量內容
key 緩存數據的鍵, 其長度不能超過250個字符
var 值,整型將直接存儲,其餘類型將被序列化存儲,其值最大爲1M
flag 是否使用 zlib 壓縮 ,當flag=MEMCACHE_COMPRESSED的時侯,數據很小的時候不會採用zlib壓縮,只有數據達到必定大小纔對數據進行zlib壓縮。(沒有具體的測試數據進行壓縮的最小值是多少)
expire 過時時間,0 爲永不過時,可以使用 unix 時間戳格式或距離當前時間的秒數,設爲秒數時不能大於 2592000(30 天)
成功返回 TRUE,失敗返回 FALSE。
<?php
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* procedural API */
memcache_replace($memcache_obj, "test_key", "some variable", FALSE, 30);
/* OO API */
$memcache_obj->replace("test_key", "some variable", FALSE, 30);
?>
bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )
設置一個指定 key 的緩存變量內容
key 緩存數據的鍵, 其長度不能超過250個字符
var 值,整型將直接存儲,其餘類型將被序列化存儲,其值最大爲1M
flag 是否使用 zlib 壓縮 ,當flag=MEMCACHE_COMPRESSED的時侯,數據很小的時候不會採用zlib壓縮,只有數據達到必定大小纔對數據進行zlib壓縮。(沒有具體的測試數據進行壓縮的最小值是多少)
expire 過時時間,0 爲永不過時,可以使用 unix 時間戳格式或距離當前時間的秒數,設爲秒數時不能大於 2592000(30 天)
成功返回 TRUE,失敗返回 FALSE。
<?php
/* procedural API */
/* connect to memcached server */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/*
set value of item with key ‘var_key‘
using 0 as flag value, compression is not used
expire time is 30 second
*/
memcache_set($memcache_obj, ‘var_key‘, ‘some variable‘, 0, 30);
echo memcache_get($memcache_obj, ‘var_key‘);
?>
<?php
/* OO API */
$memcache_obj = new Memcache;
/* connect to memcached server */
$memcache_obj->connect(‘memcache_host‘, 11211);
/*
set value of item with key ‘var_key‘, using on-the-fly compression
expire time is 50 seconds
*/
$memcache_obj->set(‘var_key‘, ‘some really big variable‘, MEMCACHE_COMPRESSED, 50);
echo $memcache_obj->get(‘var_key‘);
?>
string Memcache::get ( string $key [, int &$flags ] )
array Memcache::get ( array $keys [, array &$flags ] )
獲取某個 key 的變量緩存值
key 緩存值的鍵
flags 若是是傳址某個變量,獲取緩存值被set或是add的flag結果將被存於該變量
返回緩存的指定 key 的變量內容或者是在失敗或該變量的值不存在時返回 FALSE
若是傳出的key的數組中的key都不存在,返回的結果是一個空數組,反之則返回key與緩存值相關聯的關聯數組
<?php
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
$var = memcache_get($memcache_obj, ‘some_key‘);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect(‘memcache_host‘, 11211);
$var = $memcache_obj->get(‘some_key‘);
/*
You also can use array of keys as a parameter.
If such item wasn‘t found at the server, the result
array simply will not include such key.
*/
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
$var = memcache_get($memcache_obj, Array(‘some_key‘, ‘another_key‘));
//若是some_key,another_key不存在 $var = array();
//若是some_key,another_key存在 $var = array(‘some_key‘=>‘緩存值‘, ‘another_key‘=>‘緩存值‘);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect(‘memcache_host‘, 11211);
$var = $memcache_obj->get(Array(‘some_key‘, ‘second_key‘));
?>
bool Memcache::delete ( string $key [, int $timeout ] )
刪除某一個變量的緩存
key 緩存的鍵 鍵值不能爲null和‘’,當它等於前面兩個值的時候php會有警告錯誤。
timeout 刪除這項的時間,若是它等於0,這項將被馬上刪除反之若是它等於30秒,那麼這項被刪除在30秒內
成功返回 TRUE,失敗返回 FALSE。
2.9.4.範例
<?php
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* after 10 seconds item will be deleted by the server */
memcache_delete($memcache_obj, ‘key_to_delete‘, 10);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect(‘memcache_host‘, 11211);
$memcache_obj->delete(‘key_to_delete‘, 10);
?>
bool Memcache::flush ( void )
清空全部緩存內容,不是真的刪除緩存的內容,只是使全部變量的緩存過時,使內存中的內容被重寫
成功返回 TRUE,失敗返回 FALSE。
<?php
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
memcache_flush($memcache_obj);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect(‘memcache_host‘, 11211);
$memcache_obj->flush();
?>
array Memcache::getExtendedStats ([ string $type [, int $slabid [, int $limit ]]] )
獲取全部服務器擴展靜態信息
type 靜態信息類型,有效值包括{reset, malloc, maps, cachedump, slabs, items, sizes},依照必定規則協議這個可選參數是爲了方便開發人員查看不一樣類別的信息而輸入的標題
slabid 用於按指定類型聯合設置 cache 堆爲有效的片到堆中。緩存堆被被命令綁定到服務器上並被嚴格的用於調試用途
limit 用於按指定類型聯合設置 cache 堆爲輸入的數字所限制的大小到堆,默認值爲 100
返回一個由服務器擴展靜態信息二維數組,失敗時返回 FALSE
<?php
$memcache_obj = new Memcache;
$memcache_obj->addServer(‘memcache_host‘, 11211);
$memcache_obj->addServer(‘failed_host‘, 11211);
$stats = $memcache_obj->getExtendedStats(); print_r($stats);
?>
輸出結果
Array(
[memcache_host:11211] => Array(
[pid] => 3756
[uptime] => 603011
[time] => 1133810435
[version] => 1.1.12
[rusage_user] => 0.451931
[rusage_system] => 0.634903
[curr_items] => 2483
[total_items] => 3079
[bytes] => 2718136
[curr_connections] => 2
[total_connections] => 807
[connection_structures] => 13
[cmd_get] => 9748
[cmd_set] => 3096
[get_hits] => 5976
[get_misses] => 3772
[bytes_read] => 3448968
[bytes_written] => 2318883
[limit_maxbytes] => 33554432
),
[failed_host:11211] =>
)
array Memcache::getStats ([ string $type [, int $slabid [, int $limit ]]] )
獲取最後添加服務器靜態信息
type 靜態信息類型,有效值包括{reset, malloc, maps, cachedump, slabs, items, sizes},依照必定規則協議這個可選參數是爲了方便開發人員查看不一樣類別的信息而輸入的標題
slabid 用於按指定類型聯合設置 cache 堆爲有效的片到堆中。緩存堆被被命令綁定到服務器上並被嚴格的用於調試用途
limit 用於按指定類型聯合設置 cache 堆爲輸入的數字所限制的大小到堆,默認值爲 100
返回一個服務器靜態信息數組,失敗時返回 FALSE
int Memcache::getServerStatus ( string $host [, int $port ] )
經過輸入的 host 及 port 來獲取相應的服務器信息
host 服務器域名或 IP
port 端口號,默認爲 11211
返回服務器狀態,0 爲失敗,其餘狀況返回非 0 數字
<?php
/* OO API */
$memcache = new Memcache;
$memcache->addServer(‘memcache_host‘, 11211);
echo $memcache->getServerStatus(‘memcache_host‘, 11211);
/* procedural API */
$memcache = memcache_connect(‘memcache_host‘, 11211);
echo memcache_get_server_status($memcache, ‘memcache_host‘, 11211);
?>
string Memcache::getVersion ( void )
獲取服務器的版本號信息
成功返回服務器的版本號字符串,失敗返回 FALSE
<?php
/* OO API */
$memcache = new Memcache;
$memcache->connect(‘memcache_host‘, 11211);
echo $memcache->getVersion();
/* procedural API */
$memcache = memcache_connect(‘memcache_host‘, 11211);
echo memcache_get_version($memcache);
?>
bool Memcache::setCompressThreshold ( int $threshold [, float $min_savings ] )
設置壓縮極限
threshold 設置控制自動壓縮的變量長度的最小值
min_saving 指定的最低壓縮比率,值必須介於 0 - 1 之間,默認爲 0.2 表明 20% 的壓縮比率
成功返回 TRUE,失敗返回 FALSE。
<?php
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->addServer(‘memcache_host‘, 11211);
$memcache_obj->setCompressThreshold(20000, 0.2);
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
memcache_set_compress_threshold($memcache_obj, 20000, 0.2);
?>
bool Memcache::setServerParams ( string $host [, int $port [, int $timeout [, int $retry_interval [, bool $status [, callback $failure_callback ]]]]] )
Memcache version 2.1.0 後增長的函數,運行時設置服務器參數
host 服務器域名或 IP
port 端口號,默認爲 11211
timeout 超時鏈接失效的秒數,修改默認值 1 時要三思,有可能失去全部緩存方面的優點致使鏈接變得很慢
retry_interval 服務器鏈接失敗時的重試頻率,默認是 15 秒一次,若是設置爲 -1 將禁止自動重試,當擴展中加載了 dynamically via dl() 時,不管本參數仍是常鏈接設置參數都會失效。 每個失敗的服務器在失效前都有獨自的生存期,選擇後端請求時會被跳過而不服務於請求。一個過時的鏈接將成功的從新鏈接或者被標記爲失敗的鏈接等待下一次 重試。這種效果就是說每個 web server 的子進程在服務於頁面時的重試鏈接都跟他們本身的重試頻率有關。
status 控制服務器是否被標記爲 online,設置這個參數爲 FALSE 並設置 retry_interval 爲 -1 可使鏈接失敗的服務器被放到一個描述不響應請求的服務器池子中,對這個服務器的請求將失敗,接受設置爲失敗服務器的設置,默認參數爲 TRUE,表明該服務器能夠被定義爲 online。
failure_callback 失敗時的回調函數,函數的兩個參數爲失敗服務器的 hostname 和 port
成功返回 TRUE,失敗返回 FALSE。
<?php
function _callback_memcache_failure($host, $port)
{
print "memcache ‘$host:$port‘ failed";
}
/* OO API */
$memcache = new Memcache;
// Add the server in offline mode
$memcache->addServer(‘memcache_host‘, 11211, FALSE, 1, 1, -1, FALSE);
// Bring the server back online
$memcache->setServerParams(‘memcache_host‘, 11211, 1, 15, TRUE, ‘_callback_memcache_failure‘);
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
memcache_set_server_params($memcache_obj, ‘memcache_host‘, 11211, 1, 15, TRUE, ‘_callback_memcache_failure‘);
?>
int Memcache::increment ( string $key [, int $value ] )
給指定 key 的緩存變量一個增值,若是該變量不是數字時不會被轉化爲數字,這個增值將會加到該變量原有的數字之上,變量不存在不會新增變量,對於壓縮存儲的變量不要使用本函數由於相應的取值方法會失敗。
key 緩存值的鍵
var 值,整型將直接存儲,其餘類型將被序列化存儲
成功返回新的變量值,失敗返回 FALSE。
<?php
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* increment counter by 2 */
$current_value = memcache_increment($memcache_obj, ‘counter‘, 2);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect(‘memcache_host‘, 11211);
/* increment counter by 3 */
$current_value = $memcache_obj->increment(‘counter‘, 3);
?>
int Memcache::decrement ( string $key [, int $value ] )
給指定 key 的緩存變量一個遞減值,與 increment 操做相似,將在原有變量基礎上減去這個值,該項的值將會在轉化爲數字後減去,新項的值不會小於 0,對於壓縮存儲的變量不要使用本函數由於相應的取值方法會失敗。
key 緩存值的鍵
var 值,整型將直接存儲,其餘類型將被序列化存儲
成功返回新的變量值,失敗返回 FALSE。
<?php
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* decrement item by 2 */
$new_value = memcache_decrement($memcache_obj, ‘test_item‘, 2);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect(‘memcache_host‘, 11211);
/* decrement item by 3 */
$new_value = $memcache_obj->decrement(‘test_item‘, 3);
?>
bool memcache_debug ( bool $on_off )
設置 memcache 的調試器是否開啓,值爲 TRUE 或 FALSE。 受影響於 php 安裝時是否使用了 --enable-debug 選項,若是使用了該函數纔會返回 TRUE,其餘狀況將始終返回 FALSE。
on_off 設置調試模式是否開啓,TRUE 爲開啓,FALSE 爲關閉
php 安裝時若是使使用了 --enable-debug 選項返回 TRUE,不然將返回 FALSE。