Я смотрел документы php на memcache и заметил, что вместо того, чтобы делать
$mem->connect('localhost', 11211)
Я могу сделать вместо этого
$mem->addServer('localhost', 11211)
И таким образом, если я не воспользуюсь соединением memcache, он не свяжется с подключением.
Это заставило меня задаться вопросом, почему кто-то когда-либо использовал connect()
над addServer()
?
Это просто похоже на возможную ненужную связь. Я что-то упускаю?
connect
и pconnect
кажутся более низкоуровневыми вызовами, которые выполняют одну задачу без больших накладных расходов. addServer
OTOH более высокий уровень, управляя несколькими серверами, повторяя, когда один из них терпит неудачу, и т. д. У меня создается впечатление, что последний полагается на то, что первый выполняет свою задачу.
С точки зрения конечного пользователя, очень мало преимуществ в использовании функции нижнего уровня, за исключением, возможно, небольшого улучшения производительности (если вы знаете, что сразу используете соединение, у вас есть только один сервер memcached и не нужно поддерживать постоянное соединение – или на самом деле хочет сбросить его для устранения неполадок и т. д. – возможно, быстрее будет просто подключаться по требованию). Только если вам нужно больше контролировать жизненный цикл соединения (например, если вы разрабатываете собственную стратегию кэширования), эти функции будут полезны.
Другими словами, тот факт, что эти функции отображаются в API, не означает, что для них будет использоваться общий прецедент. Тем не менее, часто лучше предоставлять больше инструментов для взаимодействия с системой, чем меньше, поскольку это способствует созданию платформы.
Разница на самом деле хорошо объясняется на странице документов для Memcache :: addServer
connect () делает прямое подключение к одному экземпляру memcached.
addServer () добавляет запись в пул серверов, которую использует расширение Memcache, но фактически не соединяется, пока вы не выполните что-то, что требует подключения.
При использовании этого метода (в отличие от Memcache :: connect () и Memcache :: pconnect ()) сетевое соединение не устанавливается до фактического уровня. Таким образом, нет накладных расходов при добавлении большого количества серверов в пул, хотя они могут не все использоваться.
Использование пула серверов означает, что если один экземпляр / соединение memcached вызывает ошибку низкого уровня, расширение Memcache будет автоматически подключаться к другому серверу для выполнения запроса.
Memcache – это распределенный кеш по дизайну. Когда вы используете пул серверов, объекты хранятся на всех серверах с помощью механизма распределения ключей, который выбирает сервер на основе веса сервера и хэша самого ключа.
Теперь, в настройке на 2 серверах memcache, можно было бы сделать следующее:
$memcache = new Memcache; $memcache->addServer('memcache_host1', 11211); $memcache->addServer('memcache_host2', 11211);
отправьте эти вызовы, процесс php увидит пул серверов с двумя серверами и равномерно распределит их по ним, поскольку значения по умолчанию будут выбраны в вызовах Memcache :: addServer. Таким образом, вызов Memcache :: get или Memcache :: set будет сохранять объект или извлекать значение ключа из правильного хоста из пула серверов в зависимости от ключа.
Memcache :: connect, однако повторно инициализирует пул хостов и предполагает наличие только одного хоста, и все объекты хранятся на этом хосте. Это также означает, что если вы это сделаете:
$memcache = new Memcache; $memcache->addServer('memcache_host1', 11211); $memcache->addServer('memcache_host2', 11211); $memcache->connect('memcache_host1', 11211);
Последний вызов очистит пул серверов и все ключи после того, как вызов Memcache :: connect будет сохранен в memcache_host1. Таким образом, Memcache :: connect идеально используется на одной установке хоста и никогда не с пулом, если не намерено говорить с конкретным хостом в пуле для получения статистики, операций технического обслуживания или специальных схем кэширования. Больше обсуждения здесь .