PHP Conference Japan 2024

Memcache::connect

(PECL memcache >= 0.2.0)

Memcache::connect開啟 memcached 伺服器連線

說明

Memcache::connect(字串 $host, 整數 $port = ?, 整數 $timeout = ?): 布林值

Memcache::connect() 建立與 memcached 伺服器的連線。使用 Memcache::connect() 開啟的連線將在腳本執行結束時自動關閉。您也可以使用 Memcache::close() 關閉它。您也可以使用 memcache_connect() 函式。

參數

host

指向 memcached 監聽連線的主機。此參數也可以指定其他傳輸方式,例如 unix:///path/to/memcached.sock 來使用 UNIX 域套接字,在這種情況下,port 參數也必須設定為 0

port

指向 memcached 監聽連線的埠。當使用 UNIX 域套接字時,請將此參數設定為 0

請注意:如果未指定 port,則預設為 memcache.default_port。因此,建議在此方法呼叫中明確指定埠。

timeout

用於連線到守護行程的秒數。在更改預設值 1 秒之前請三思 - 如果您的連線太慢,您可能會失去快取的所有優勢。

返回值

成功時返回 true,失敗時返回 false

範例

範例 #1 Memcache::connect() 範例

<?php

/* 程序式 API */

$memcache_obj = memcache_connect('memcache_host', 11211);

/* 物件導向 API */

$memcache = new Memcache;
$memcache->connect('memcache_host', 11211);

?>

注意事項

警告

當未指定 port 參數時,此方法預設使用 PHP ini 指令 memcache.default_port 的設定值。如果此值在應用程式的其他地方被更改,可能會導致意外結果:因此,建議在此方法呼叫中始終明確指定埠。

參見

新增註釋

使用者貢獻的註釋 2 則註釋

geoffrey dot hoffman at gmail dot com
14 年前
如果 memcached 正常運作,呼叫 memcache_connect() 會回傳一個物件實例,而不是布林值。如果 memcached 沒有運作,呼叫 memcache_connect() 會拋出一個通知和一個警告(並且如預期般回傳 false)。

<?php
// memcache 正在運行
$test1 = memcache_connect('127.0.0.1',11211);
echo
gettype($test1);
// object
echo get_class($test1);
// Memcache

// memcached 已停止
$test2 = memcache_connect('127.0.0.1',11211);

/*
Notice: memcache_connect(): Server 127.0.0.1 (tcp 11211) failed with: 連線嘗試失敗,因為連線方在一段時間後沒有正確回應,或是建立的連線失敗,因為連線的主機沒有回應。
(10060) in C:\Program Files\Support Tools\- on line 1

Warning: memcache_connect(): 無法連線到 127.0.0.1:11211,連線嘗試失敗,因為連線方在一段時間後沒有正確回應,或是建立的連線失敗,因為連線的主機沒有回應。
(10060) in C:\Program Files\Support Tools\- on line 1
*/

echo gettype($test2);
// boolean
echo $test2===false;
// 1
?>

似乎沒有辦法在不抑制錯誤的情況下檢查 memcached 是否真的正在運行。

<?php
$test3
= @memcache_connect('127.0.0.1',11211);
if(
$test3===false ){
// memcached _可能_ 沒有運行
}
?>
webysther at gmail dot com
10 年前
在描述逾時時,有一個陳述並不完全正確,增加逾時並不一定能排除或避免 memcache 的問題,它只允許系統等待更多並行連線,而這只是少數的連線數量,這會導致幾個問題,如果增加逾時並執行一些測試,就可以簡單地修正這些問題。
為了證明這個概念並顯示如果伺服器關閉,連線不會等待

<?PHP

while ( ++$loop < 10000 ) {
try {
$memcache = new Memcache;
@
$memcache->pconnect( "127.0.0.1" , 11211 , 30 );
$loopset = 0;
$loopget = 0;

while ( ++
$loopset < 50 ) {
if ( @
$memcache->set( "foo" , "bar" ) === false ) {
echo
"Fail!" . PHP_EOL;
}
}

while ( ++
$loopget < 500 ) {
if ( @
$memcache->get( "foo" ) === false ) {
echo
"Fail!" . PHP_EOL;
}
}

if (
$loop % 100 == 0 ) {
echo
"Try: " . $loop . PHP_EOL;
}
} catch (
Exception $e ) {
echo
"Fail: " . $e->getMessage() . PHP_EOL;
}
}

?>

使用無效的主機名稱並測試逾時設定,並不會產生任何差異!它只會影響到已被佔用的 socket 連線。

更多關於 memcached 逾時問題排解的細節,請參考 Google Code。
To Top