Основные вопросы Memcache в PHP - PullRequest
8 голосов
/ 03 февраля 2012

Я никогда раньше не использовал memcache, поэтому извините за неопытность.Хотя это довольно очевидно, я хотел бы убедиться, что я правильно использую встроенные функции, поскольку создаю класс, который будет использоваться в коммерческих целях, поэтому он должен быть правильно закодирован и эффективен.

У меня есть нескольковопросы, но поскольку они очень простые, я подумал, что было бы неплохо объединить их в один вопрос Stackoverflow.

Если они требуют ответа на эссе, не беспокойтесь, и я опубликую его как отдельный вопрос

  1. Когда мне нужно будет использовать memcache::addServer и в чем разница между этим и memcache::connect?
  2. Перезаписывает ли memcache сохраненные значения при запускеНедостаточно памяти, даже если срок действия элемента еще не истек?
  3. Что бы я использовал для memcache::getExtendedStats?
  4. Как проверить, существует ли уже соединение с memcacheи если нет, то создать соединение?
  5. Если у меня установлен обычный сервер memcache с именем 'localhost', как мне настроить другой сервер memcache на моих выделенных серверах?ERVER?
  6. Кроме того, в чем преимущество наличия более одного сервера memcache?
  7. Должен ли я регулярно проверять обновления сервера memcache?
  8. Использует ли он многопамяти для запуска memcache :: connect в начале каждой страницы, даже если я ее не использую?
  9. Когда я могу вернуть ошибки и как их перехватить?
  10. Самое главное, если я использую memcache в другом классе, в котором есть несколько методов, которые можно вызывать более одного раза для каждого сценария, как мне начать инициализацию объекта и подключение к серверу в каждом методе?

Я думаю, для последнего вопроса было бы сделать это так:

class test {
     public function blah(){
          // Make sure the memcache object is accessible
          global $memcache;

          // Do something ...
          // Save result in memcache
          $memcache->set(...);
     }
     public function foo(){
          // Do something ...
          // No use for memcache
     }
}

// Initialise each class
$test = new test;
$memcache = new memcache;
$memcache->connect(...);

// Call some methods from the test class
$test->blah();
$test->foo();
$test->blah();

Как вы можете видеть в приведенном выше примере, я подключаюсь ксервер memcache в начале скрипта.Если бы я включал это в начале каждой страницы, даже на страницах, которые не используют memcache, это увеличило бы время отклика много или минимальные суммы? Следовательно, вопрос 8!

1 Ответ

23 голосов
/ 04 февраля 2012

Вам может понадобиться кофе или что-то еще, прежде чем вы прочитаете это:

  1. Вы хотите использовать Memcache::addServer, когда вам нужно добавить больше серверов Memcached. Например, если у вас был действительно загруженный веб-сайт или веб-приложение ... вы, вероятно, захотите иметь более одного сервера Memcached под управлением 1 . Memcache::connect используется, когда вы хотите установить соединение с одним из ваших серверов Memcached. Кроме того, согласно документам Memcache::addServer, другое различие между Memcache::addServer и Memcache::connect заключается в том, что при Memcache::addServer соединение не устанавливается до тех пор, пока оно действительно не потребуется 2 .

  2. Если Memcached не хватает ОЗУ, он отбрасывает самые старые значения 3 .

  3. Memcache::getExtendedStats используется для проверки информации о вашем сервере Memcached. Например, если вам нужно выяснить, сколько времени сервер работал (время безотказной работы), сколько подключений к серверу или общее использование сервера 4 , это отличный инструмент.

  4. Вероятно, самый простой способ проверить, существует ли уже соединение с Memcached, - это проверить переменную соединения $ memcache, чтобы узнать, возвращает ли она TRUE 5 . Если вам нужно постоянное соединение (которое продолжает работать даже после завершения скрипта), есть возможность использовать Memcache::pconnect 6 .

  5. Если вы хотите, чтобы два сервера Memcached работали ... и ваш первый сервер уже был вашим локальным хостом, вам, скорее всего, понадобится отдельный отдельный сервер для второго 7 .

  6. По крайней мере, еще одним преимуществом наличия более одного сервера Memcached является идея о том, что всякий раз, когда вы диверсифицируете свои данные (или серверы), даже когда один сервер выходит из строя ... у вас все равно остается много других серверов для собрать кусочки. Memcached выглядит 8 так, как будто он распределяется по множеству серверов, которые вы используете ... поэтому, если сервер выходит из строя, вы все равно теряете эту часть кэша. Но у вас все еще есть другие запущенные серверы, чтобы помочь продолжать работу.

  7. В общем, неплохо бы поддерживать практически любое программное обеспечение в актуальном состоянии. Похоже, Memcached по-прежнему является очень активным проектом 9 , поэтому вы можете обновить его, когда сможете. Но сущность Memcached, похоже, не сильно изменилась по сравнению с предыдущими версиями ... поэтому обновление может быть не столь критичным по сравнению с чем-то вроде программного обеспечения операционной системы.

  8. Похоже, способ, которым Memcached выделяет память для TCP-подключений (когда вы делаете вызов на ваш сервер Memcached через Memcache::connect,), в итоге стоит вашей памяти 10 . Если вы уверены, что вам не понадобится это соединение на некоторых ваших страницах, вы можете не звонить по этому соединению.

  9. Трудно сказать, какой тип ошибок может появиться в вашем коде. Но с чем-то вроде Memcached вы можете обнаружить ошибки, возникающие при нехватке памяти 11 .

  10. Как и ответ на восьмой вопрос, я все равно рекомендовал бы пытаться назвать это $memcache->connect() только в тех областях, где это абсолютно необходимо. Возможно, вы используете Memcached во многих ваших приложениях или скриптах; но, вероятно, все еще будут места, где вам это не понадобится.

Что касается идеи вашего кода для вопроса 10, то, насколько это возможно, зависит от вас. В общем, хорошо, когда это возможно, стараться избегать глобальных переменных 12 . Вместо этого, как об этом говорится в статье (12) в сноске, проще просто использовать одноэлементный вызов класса для соединения ... и затем просто вызывать его каждый раз, когда вы хотите установить соединение.

Ух ты, мои глаза устали. Надеюсь, это поможет, чувак ...!

1 http://en.wikipedia.org/wiki/Memcached (см. Раздел «Архитектура»)

2 http://www.php.net/manual/en/memcache.addserver.php

3 http://en.wikipedia.org/wiki/Memcached (см. Раздел «Архитектура»)

4 http://www.php.net/manual/en/memcache.getextendedstats.php

5 http://www.php.net/manual/en/memcache.connect.php (см. Раздел «Возвращаемые значения»)

6 http://www.php.net/manual/en/memcache.pconnect.php

7 http://www.php.net/manual/en/memcache.addserver.php#101194

8 Преимущества нескольких экземпляров memcached

9 http://code.google.com/p/memcached/

10 http://www.facebook.com/note.php?note_id=39391378919 (с точки зрения Facebook)

11 http://groups.google.com/group/memcached/browse_thread/thread/9ce1e2691efb283b

12 Как избежать использования глобальных объектов PHP?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...