Постоянство memcached в PHP не работает должным образом

Я немного поиграл с другой библиотекой memcached и версией плагина, чтобы обеспечить реальное постоянство между клиентом PHP memcache и сервером memcached.

Проблема в том, что все еще соединения открываются и закрываются, так что счетчик соединений увеличивается вместо повторного использования существующего постоянного соединения.

Я скомпилировал демон memcached из новейшего источника на машине RedHat. Я использую версию memcached -1.4.14 и начал с "#/opt/memcached/bin/memcached -vvvv"

Плагин php, который я также скомпилировал из новейшей исходной версии memcached -2.0.1, я скомпилировал его с 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
...

. Мы хотим использовать memcache в высокопроизводительной среде с большим количеством входящих соединений, и в настоящее время количество соединений убивает дочерние элементы apache. Любые идеи, как включить реальную настойчивость?

Используемое программное обеспечение:

  • Red Hat Enterprise Linux Server, выпуск 6.2 (Сантьяго)
  • Версия PHP 5.3.3
  • Apache/2.2.15 в префорке
  • Сервер кэша памяти 1.4.14
  • libmemcached 1.0.9
  • Плагин PHP memcached 2.0.1
6
задан Artur Wawrzynkiewicz 1 August 2012 в 09:51
поделиться