2

PHP の Memcached の永続性に問題があります。Memcached lib はgetServerList()、10 の同時接続が存在するまで空を返します。それについての賢明な説明は見つかりませんでしたが、同じ問題を抱えている人を見つけました(解決策なし)。

私の例:

class Cache {

    protected $memcached;

    public function __construct($cache_name) {
        $instance_name = 'persistent-' . $cache_name;
        $this->memcached = new Memcached($instance_name);
        $server_count = count($this->memcached->getServerList());
        echo '[MC] Server count of ', $instance_name, ': ', $server_count, PHP_EOL;

        if (0 == $server_count) {
            $servers = array(array("localhost","16586"),array("localhost","16587"));
            echo '[MC] Adding servers: ', json_encode($servers), PHP_EOL;
            // options don't change anything in my case
            $this->memcached->setOptions(array(
                Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT,
                Memcached::OPT_LIBKETAMA_COMPATIBLE => true
            ));
            $this->memcached->addServers($servers);
        }

        $stats = $this->memcached->getStats();
        foreach($stats as $server => $data){
            echo '[MC] Stats of ', $server, ' curr_connections: ', $data['curr_connections'], ' total_connections: ', $data['total_connections'], PHP_EOL;
        }
    }

    public function get($key) {
        echo '[MC] Server for key: ', $key, ' is ', json_encode($this->memcached->getServerByKey($key)), PHP_EOL;
        $ret = $this->memcached->get($key);
        echo '[MC] Getting ', $key, ' with result: ', $ret, PHP_EOL;
        return $ret;
    }

    public function set($key, $data, $timeout = 0) {
        echo '[MC] Set of ', $key, ' with data: ', $data, PHP_EOL;
        return $this->memcached->set($key, $data, $timeout);
    }
}

$cache = new Cache('instance');

$ret = $cache->get('something');

if(empty($ret)) {
    $cache->set('something', true);
}

このコードに期待するのはaddServers、接続が確立された後の 1 回の実行です。

新規実行 (memcached/apache の再起動後) は次のように表示されます。

// first run
[MC] Server count of persistent-instance: 0
[MC] Adding servers: [["localhost","16586"],["localhost","16587"]]
[MC] Stats of localhost:16586 curr_connections: 5 total_connections: 6
[MC] Stats of localhost:16587 curr_connections: 5 total_connections: 6
[MC] Server for key: something is {"host":"localhost","port":16587,"weight":1}
[MC] Getting something with result: 
[MC] Set of something with data: 1

// second
[MC] Server count of persistent-instance: 0
[MC] Adding servers: [["localhost","16586"],["localhost","16587"]]
[MC] Stats of localhost:16586 curr_connections: 6 total_connections: 7
[MC] Stats of localhost:16587 curr_connections: 6 total_connections: 7
[MC] Server for key: something is {"host":"localhost","port":16587,"weight":1}
[MC] Getting something with result: 1

// up to 6th call curr_connections are growing and still adding servers to pool
[MC] Server count of persistent-instance: 0
[MC] Adding servers: [["localhost","16586"],["localhost","16587"]]
[MC] Stats of localhost:16586 curr_connections: 10 total_connections: 11
[MC] Stats of localhost:16587 curr_connections: 10 total_connections: 11
[MC] Server for key: something is {"host":"localhost","port":16587,"weight":1}
[MC] Getting something with result: 1

// 7th+ call finally with expected result
[MC] Server count of persistent-instance: 2
[MC] Stats of localhost:16586 curr_connections: 10 total_connections: 11
[MC] Stats of localhost:16587 curr_connections: 10 total_connections: 11
[MC] Server for key: something is {"host":"localhost","port":16587,"weight":1}
[MC] Getting something with result: 1

何か不足していますか?何が起こっていますか?

私の設定:

  • Ubuntu 13.04
  • アパッチ 2.2.22
  • Memcached サーバー 1.4.14 (4 インスタンス)
  • libmemcached 1.0.8
  • PHP 5.4.9-4ubuntu2.3
  • PHP最新のMemcached ライブラリ。

2014.04.22更新

私の最新の設定にはまだ問題があります:

  • Xubuntu 13.10 (カーネル 3.11.0-19)
  • アパッチ 2.4.6
  • Memcached 1.4.14
  • libmemcached 1.0.8
  • PHP 5.5.3-1ubuntu2.3
  • PHP 2.1.0 用 Memcached ライブラリ
4

2 に答える 2

0

php-fpm (または Apache の同様の構成) を使用している場合、各 php 子は memcache への独自の永続的な接続を作成します。したがって、php-fpm が 10 個の子を作成するように構成されている場合、ログ出力は完全に理にかなっています :-)

于 2016-12-21T17:39:36.270 に答える