Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的memcached持久性无法按预期工作_Php_Memcached_Persistent_Persistent Connection_Libmemcached - Fatal编程技术网

PHP中的memcached持久性无法按预期工作

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

我已经使用了不同的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
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扩展可以实现真正的持久化。从PHP文档中:

如果您使用的是PHP-CGI 持久连接可以在整个应用程序过程中共享,但会在脚本完成(页面加载)时关闭

如果您使用Apache的多进程模块 一个请求将派生一个具有持久连接的子进程。如果有一个新请求进入,而前一个请求尚未完成,则将使用现有的持久连接。但是,如果没有发出其他请求,则在子进程完成时将关闭持久连接


您提供的脚本在测试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() );
?>