Как работает метод addServer для PHP Memcache/Memcached?

В настоящее время я использую 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 и т. д. Я не могу понять, как это можно сделать.)

person ibrahim tanyalcin    schedule 24.11.2018    source источник
comment
Учитывая, что это комментарий пользователя, а не официальная ручная запись, и что было бы очень сложно координировать любое неявное состояние, хранящееся между экземплярами PHP, я бы отнесся к этому с большой долей скептицизма.   -  person deceze♦    schedule 24.11.2018


Ответы (1)


Вам нужно добавить сервер один раз, иначе вы получите эту ошибку. Как следует из комментария, вы должны использовать 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());
?>
person Sascha Trifunovic    schedule 29.11.2018