Memcache и memcached: кто есть кто?

Для меня на днях стало открытием, что memcache и memcached это не разные сервисы кеширования и даже не опечатка :). На самом деле существует только сервис кеширования под названием memcached. 

Memcache, как оказалось, это название php-расширения для работы с сервисом кеширования memcached. Но все не так просто 🙂 Существует еще одно (а может и не одно) php-расширение для работы сервисом кеширования memcached с названием memcached. o_0

Итого имеется:

  • один сервис кеширования memcached
  • два php-расширения для работы с указанным выше сервисом кеширования:

Отличия между этими разширениями небольшие, вот некоторые из них:

  • memcache немного быстрее memcached (бытует мнение, что разница в пределах 10%);
  • memcache имеет много меньше возможностей по работе с сервисом кеширования чем memcached (если пройти по ссылкам выше можно в этом убедиться);
  • memcache старше memcached (начало разработки в 2004 против 2009);
  • memcached требует для работы 5.2+;
  • memcache запускается на 5.1, а в требованиях у него стоит более ранний 4.3.3+.

Возможно не все из приведенных отличий значимы, но если бы я узнал о последних двух на этапе исследования этой темы, это сэкономило бы мне пару часов.

Профилирование в MySQL

Недавно познакомился с интересными возможностями MySQL:

Это встроенные в MySQL средства профилирования. Для первого необходимо настроить время выполнения запроса, превышая которое запрос считается медленным, и путь, куда сохранять запросы время выполнения которых превысило указанное значение. Для второго необходимо изменять код приложения: включить профилирование при старте приложения и показать результаты при его завершении.

Включить профилирование: «set profiling=1;»

Показать результат: «show profiles;»

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

Но тут, как нельзя кстати, в php есть функция register_shutdown_function, с помощью которой можно выполнить любую функцию по завершении работы всего скрипта. Выглядеть решение будет примерно следующим образом:

mysql_query("set profiling=1;");

function show_profiles() {
    $resource = mysql_query("show profiles;");
    // тут форматированный вывод
}

register_shutdown_function('show_profiles');

Приведенный код нужно разместить после успешного коннекта к БД.

Конечно, в проекте на ZF или любом другом фреймворке можно воспользоватся и встроенными в фреймворк средствами профилирования, но:

  1. существуют еще проекты без фреймворков с сотней скриптов в корневой папке;
  2. Slow Query Log пригодится в любом случае.