PHP中的memcached持久性无法按预期工作
我已经使用了不同的memcached库和插件版本来实现PHP memcache客户端和memcached服务器之间的真正持久性 问题是仍然连接是打开和关闭的,因此连接计数器会上升,而不是重用现有的持久连接 我已经在redhat机器上从最新的源代码编译了memcached守护进程。 我使用memcached-1.4.14版本,以“#/opt/memcached/bin/memcached-vvv”开头 我还从最新的源代码版本memcached-2.0.1编译了php插件,我根据libmemcached-1.0.9编译了它,使其保持最新。目前它没有针对libmemcached-1.0.10进行编译 我的PHP脚本如下所示:PHP中的memcached持久性无法按预期工作,php,memcached,persistent,persistent-connection,libmemcached,Php,Memcached,Persistent,Persistent Connection,Libmemcached,我已经使用了不同的memcached库和插件版本来实现PHP memcache客户端和memcached服务器之间的真正持久性 问题是仍然连接是打开和关闭的,因此连接计数器会上升,而不是重用现有的持久连接 我已经在redhat机器上从最新的源代码编译了memcached守护进程。 我使用memcached-1.4.14版本,以“#/opt/memcached/bin/memcached-vvv”开头 我还从最新的源代码版本memcached-2.0.1编译了php插件,我根据libmemcach
<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
$key = "key_" . uniqid();
$memcached = new Memcached( 'persistent' );
$memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$memcached->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
$memcached->setOption(Memcached::OPT_SEND_TIMEOUT, 3000);
$memcached->setOption(Memcached::OPT_TCP_NODELAY, true);
$memcached->setOption(Memcached::OPT_PREFIX_KEY, 'persistent');
if( !count($memcached->getServerList() ) )
{
$memcached->addServer( 'localhost', 11211 );
}
$memcached->set($key, 'value');
$value = $memcached->get($key);
print_r( $memcached->getStats() );
?>
但是连接计数器仍然上升,我假设客户端创建了一个连接,并且在服务器端重复使用了持久连接
#netstat -an | grep 11211 | wc -l
tcp 0 0 ::1:11211 ::1:55941 VERBUNDEN
tcp 0 0 ::1:55961 ::1:11211 VERBUNDEN
tcp 0 0 ::1:55959 ::1:11211 VERBUNDEN
tcp 0 0 ::1:11211 ::1:56005 VERBUNDEN
...and so on
在服务器端,我得到冗长的输出,告诉我使用了持久性:
...
<43 get persistentkey_5018f83903ded
> FOUND KEY persistentkey_5018f83903ded
>43 sending key persistentkey_5018f83903ded
>43 END
...
。。。
找到持久密钥密钥_5018f83903ded
>43发送密钥持久密钥_5018f83903ded
>43完
...
我们希望在一个高性能环境中使用memcache,该环境中有大量的输入连接,而连接数量目前确实会杀死apache儿童。如何实现真正的持久性
使用过的软件:
- Red Hat Enterprise Linux Server 6.2版(圣地亚哥)
- PHP版本5.3.3
- Prefork中的Apache/2.2.15
- Memcache服务器1.4.14
- libmemcached 1.0.9
- PHP memcached插件2.0.1
您提供的脚本在测试memcached时可能有效,但手动运行可能无效。看一看。您可以快速创建,并向应用程序抛出100多个用户。这是因为您在每次请求时都设置了
Memcached::OPT\u TCP\u节点延迟。
像这样的一些选项会导致libmemcached库在设置时执行重新连接
由于连接选项仍然存在,因此没有理由在每次请求时都设置它们。因此,您应使用:
<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
$key = "key_" . uniqid();
$memcached = new Memcached( 'persistent' );
if( !count($memcached->getServerList() ) )
{
$memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$memcached->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
$memcached->setOption(Memcached::OPT_SEND_TIMEOUT, 3000);
$memcached->setOption(Memcached::OPT_TCP_NODELAY, true);
$memcached->setOption(Memcached::OPT_PREFIX_KEY, 'persistent');
$memcached->addServer( 'localhost', 11211 );
}
$memcached->set($key, 'value');
$value = $memcached->get($key);
print_r( $memcached->getStats() );
?>
这很有趣。我相信我正在使用某种旧版本的memcache php插件,但我通常只使用4个函数<代码>连接
,获取
,设置
和刷新
。通常我的服务器上的脚本会在memcache服务器未运行时创建memcache服务器。在任何给定时间,您有多少台prefork服务器在运行?您可以拥有与运行父服务器一样多的持久连接。假设您有20个StartServer,每个服务器有50个线程,这20个服务器中的每一个都有自己到memcached的持久连接,每个服务器的50个子线程将使用其父线程的持久连接。这些连接的PID是否与每个子进程的PID匹配?是的,Memcached扩展支持真正的持久连接。这对我来说很好,感谢您解决了这个问题。我意识到在apache预工作模式下,每个apache子进程都会打开两个连接,这似乎是一种正常的行为。我在连接日志中看到:#netstat-n | grep 11211 | grep:“| wc-l 60,这与apache进程相匹配#ps uax | grep httpd | wc-l 31(主prozess和30个childs)的本地端口已用完。你的回答救了我一命。谢谢!
<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
$key = "key_" . uniqid();
$memcached = new Memcached( 'persistent' );
if( !count($memcached->getServerList() ) )
{
$memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$memcached->setOption(Memcached::OPT_RECV_TIMEOUT, 1000);
$memcached->setOption(Memcached::OPT_SEND_TIMEOUT, 3000);
$memcached->setOption(Memcached::OPT_TCP_NODELAY, true);
$memcached->setOption(Memcached::OPT_PREFIX_KEY, 'persistent');
$memcached->addServer( 'localhost', 11211 );
}
$memcached->set($key, 'value');
$value = $memcached->get($key);
print_r( $memcached->getStats() );
?>