Как работает метод addServer в PHP Memcache / Memcached? - PullRequest
0 голосов
/ 24 ноября 2018

Я сейчас использую PHP Memcache на сервере Apache.Поскольку Memcache и Memcached имеют схожие внутренние функции, этот вопрос касается их обоих.

Мне было интересно, через addServer метод memcached здесь и второй комментарий в разделе пользователя такой:

Важно не звонить ->addServers () при каждом запуске - вызывайте его только в случае отсутствия серверов (проверьте getServerList ());в противном случае, так как addServers () не проверяет наличие дубликатов, он позволяет вам снова и снова добавлять один и тот же сервер, что приводит к сотням, если не тысячам подключений к демону MC.Особенно при использовании FastCGI.

Непонятно, что подразумевается под "каждым прогоном" .Означает ли это вызов addServer внутри скрипта несколько раз или внутри нескольких запросов различными пользователями / удаленными клиентами?Потому что рассмотрим следующий скрипт:

<?php
    $memcache_obj = new \Memcache;
    //$memcache_obj->connect('localhost', 11211); --> each time new connection, not recommended
    $memcache_obj->addServer('localhost', 11211,true,1,1,15,true,function($hostname,$port){
        //echo("There was a problem with {$hostname} at {$port}");
        die;
    });
    print_r($memcache_obj->getExtendedStats());
?>

Если в качестве клиента я сделаю запрос xmlhttp к вышеуказанному скрипту, я получу что-то вроде этого:

Array
(
    [localhost:11211] => Array
        (
            [pid] => 12308
            [uptime] => 3054538123
            ....

Пока все хорошо, еслиЯ раскомментирую часть addServer и выполняю так:

<?php
    $memcache_obj = new \Memcache;
    print_r($memcache_obj->getExtendedStats());
?>

Затем я получаю это:

<br />
<b>Warning</b>:  MemcachePool::getserverstatus(): No servers added to 
memcache connection in <b>path/to/php</b> on line <b>someLineNumber</b><br />

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

  • мы должны быть осторожны, чтобы не вызывать `addServer`` внутри одного и того же сценария PHP слишком много раз.(Я склонен понимать это так)
  • мы должны быть осторожны, чтобы не вызывать addServer среди нескольких запросов (например, 2 пользователя вызывают один и тот же скрипт php и т. Д. Я не могукажется, выяснить, как это можно сделать.)

1 Ответ

0 голосов
/ 29 ноября 2018

Вы должны добавить сервер один раз, иначе вы получите эту ошибку.Как следует из комментария, вы должны использовать getServerList(), чтобы проверить, были ли серверы уже добавлены, и добавить их, если их нет:

<?php
    $memcache_obj = new \Memcache;
    //$memcache_obj->connect('localhost', 11211); --> each time new connection, not recommended
    if (!memcache_obj->getServerList()){
        $memcache_obj->addServer('localhost', 11211,true,1,1,15,true,function($hostname,$port){
            //echo("There was a problem with {$hostname} at {$port}");
            die;
        });
    }
    print_r($memcache_obj->getExtendedStats());
?>
...