gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:30:53 25 4
gpt4 key购买 nike

我尝试了一些不同的 memcached 库和插件版本,以实现 PHP memcache 客户端和 memcached 服务器之间的真正持久性。

问题是仍然会打开和关闭连接,因此连接计数器会增加,而不是重新使用现有的持久连接。

我已经在 redhat 机器上从最新的源代码编译了 memcached 守护进程。我使用版本 memcached-1.4.14 并以“#/opt/memcached/bin/memcached -vvvv”开头

我还从最新的源版本 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() );
?>

在触发脚本时,我在输出中看到没有添加服务器,只有在超时期限之后。

Array ( [@�qVG:11211] => Array ( [pid] => 3728 [uptime] => 73 [threads] => 4 [time] => 1343813688 [pointer_size] => 64 [rusage_user_seconds] => 0 [rusage_user_microseconds] => 6998 [rusage_system_seconds] => 0 [rusage_system_microseconds] => 31995 [curr_items] => 37 [total_items] => 37 [limit_maxbytes] => 67108864 [curr_connections] => 38 [total_connections] => 47 [connection_structures] => 39 [bytes] => 3589 [cmd_get] => 37 [cmd_set] => 37 [get_hits] => 37 [get_misses] => 0 [evictions] => 0 [bytes_read] => 3267 [bytes_written] => 39458 [version] => 1.4.14 ) )

但是连接计数器仍然上升,我想客户端创建了一个连接,并且在服务器端重新使用了持久连接。

#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
...

我们希望在具有大量传入连接的高性能环境中使用内存缓存,并且连接数量目前确实会杀死 apache 子节点。有什么想法可以实现真正的持久性吗?

使用的软件:

  • Red Hat Enterprise Linux Server 6.2 版(圣地亚哥)
  • PHP 版本 5.3.3
  • Prefork 中的 Apache/2.2.15
  • 内存缓存服务器 1.4.14
  • libmemcached 1.0.9
  • PHP 内存缓存插件 2.0.1

最佳答案

那是因为您在每次请求时都设置了 Memcached::OPT_TCP_NODELAY。像这样的一些选项会导致 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() );
?>

关于php - PHP 中的 memcached 持久性无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11756732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com