Memcache::connect

(PECL memcache >= 0.2.0)

Memcache::connect打开 memcached 服务器连接

说明

Memcache::connect(string $host, int $port = ?, int $timeout = ?): bool

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);

/* OO API */

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

?>

注释

警告

port 未指定时,此方法默认为 PHP ini 指令 memcache.default_port 的设置值。如果此值在您的应用程序中的其他地方被更改,可能会导致意外结果:因此,建议始终在方法调用中明确指定端口。

参见

添加注释

用户贡献的注释 5 个注释

10
geoffrey dot hoffman at gmail dot com
13 年前
如果 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: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
(10060) in C:\Program Files\Support Tools\- on line 1

Warning: memcache_connect(): Can't connect to 127.0.0.1:11211, A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
(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 可能没有运行
}
?>
-4
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;
}
}

?>

用无效的主机替换并测试超时不会有任何影响!它仅用于连接到已占用的套接字。

有关 memcached 中超时故障排除的更多详细信息,请访问 google code。
-8
djbrd
13 年前
要抑制(或处理)连接失败时抛出的警告和通知,您可以使用自定义错误处理函数,例如:

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{

if (
E_WARNING === $errno)
{
Log("PHP Warning: $errstr, $errfile, $errline", Logging::WARN);
return
true;
}

if (
E_NOTICE === $errno)
{
Log("PHP Notic: $errstr, $errfile, $errline", Logging::NOTICE);
return
true;
}

return
false;
}

set_error_handler('myErrorHandler');
?>
-12
chrisn at allipo dot com
17 年前
Memcache::connect() 的行为始终是无论之前调用 addServer() 多少次,都从头开始重新初始化连接池。

例如:

<?php
$mmc
= new Memcache()
$mmc->addServer('node1', 11211);
$mmc->addServer('node2', 11211);
$mmc->addServer('node3', 11211);

$mmc->connect('node1', 11211);
?>

最后一次 connect() 调用会清除连接池,然后添加和连接 node1:11211,使其成为唯一的服务器。

如果您想要一个 Memcache 服务器池,请不要使用 connect() 函数。

如果您只需要一台 Memcache 服务器,则无需使用 addServer() 函数。
-15
tom at all dash community dot de
12 年前
有一个不太明显的方法可以检查 MemCache 服务器是否可用。

使用 ($memCache->connect() == false) 会在无法连接时等待超时。如果您有一个高流量的网站,这可能不是一个好的选择。因此,当服务器宕机时,您可能希望避免在每个请求上等待此超时,而是尝试每 X 秒重新连接一次。

如果是这样,这段代码可能会有帮助:

<?php
$memCache
= new \Memcache();
$memCache->addServer($host, $port);
$stats = @$memCache->getExtendedStats();
$available = (bool) $stats["$host:$port"];
if (
$available && @$memCache->connect($host, $port))
// MemCache is there
else
// go on without MemCache
?>

getExtendedStats() 的结果是一个数组。信息由 MemCache 本身缓存和维护。如果服务器不可用,结果将为 FALSE。

即使结果不为 false,服务器可能仍然不可用。因此,您需要检查 connect() != false,但前提是第一次检查返回 TRUE,从而在大多数情况下避免 1 秒的超时。
getExtendedStats() 和 connect() 都会在服务器不可用时发出通知/警告。因此,您必须静默这两个调用。

不要为此目的使用 getServerStatus():结果在服务器启动时被缓存,并且不会在连接到服务器期间丢失(或重新建立)时识别。
To Top