Memcached + PHP под Windows

42

Вступление

В принципе, вступление тут вовсе не требуется, но так уж получается, что не могу я не налить воды. Зато во вступлении могу заранее предупредить, что мы будем не просто ставить Memcached, но и пытаться подружить его с PHP, и все это под всеми любимой ОС Windows. Именно эти нюансы рождают проблему и решение, описанные ниже.

Кто-то может задать вполне резонный вопрос — а зачем под Windows? Могут дать вполне резонный ответ — а вот нужно. Нужно это бывает тогда, когда программист и швец и жнец, и на дуде игрец.

Во-первых, если приходится писать не только программный код, но и решать вопросы верстки, а это весьма частый случай, то без Photohop’а и старого доброго IE никуда, а они в свою очередь как-то не прижились под линуксами. Во-вторых, как не крути, а линуксы не всем такие родные, как продукт дядюшки Билла.

В чем же сложность?

У нас имеются две проблемы, которые заставили меня написать этот материал. Обе они упираются в такую малую распространенность актуальных и рабочих версий вполне экзотических библиотек, собранных под ОС Windows.

  • Днем с огнем не найти php_memcache.dll
  • Даже если мы нашли php_memcache.dll, нам осталось немало сил приложить к поиску работающего с ним Memcached.

Библиотеку php_memcache.dll я нашел в pecl версии 5.2.6-Win32. И, судя по всему, это последняя существующая версия pecl для Windows, во всяком случае, более поздних я не видел. Конечно, все это не проблема, если есть желание/время/возможность собрать библиотеку из исходников, но не об этом речь.

Библиотекой для PHP мы обзавелись (ссылки на скачивание в конце статьи), осталось скачать сам демон. На момент написания статьи, из стабильных версий для скачивания доступна 1.2.8, но вот беда, упомянутая библиотека с ней конфликтует. Благо на винте была более ранняя версия демона, а именно 1.2.1. Версия, конечно, старовата и, если почитать change-log, многого лишена, но для отладки чего-либо не очень сложного вполне должно хватить. Опять же, если не хватит, то вперед и с песней идем компилировать библиотеку для PHP.

Установка

Процесс установки до безобразия прост и по объему описания в несколько раз меньше чем то, что я уже написал.

  1. Распаковываем Memcached в любую удобную вам папку
  2. С помощью командной строки (Пуск > Выполнить > cmd) запускаем установку Memcached
    memcached.exe -d install
  3. Заходим в Панель управления > Администрирование > Службы (в Windows Vista нечто аналогичное), ищем memcached Server и запускаем его. Также можно поставить тип запуска «Авто», дабы сервер автоматически стартовал при загрузке системы.
  4. В директории, где у нас лежит PHP, в папку ext кладем php_memcache.dll
  5. В файле php.ini, в секцию, где подключаются расширения добавляем строку
    extension = php_memcache.dll

Теперь остается создать скрипт с функцией phpinfo(). Запускаем этот скрипт и ищем на странице секцию Memcache. Если секция найдена, то memcache установлен и готов к работе.

Последний нюанс

При подключении к серверу memcache из скрипта, как правило, указывают localhost, во всяком случае, в данном примере это будет именно так, потому, что демон мы установили на локальную машину. Но, я настоятельно рекомендую указывать ip-адрес в качестве хоста – 127.0.0.1. Дело в том, что в Windows Vista по-умолчанию включена поддержка протокола Ipv6, но, как известно, далеко не все умеют с ним работать, и memcache именно тот случай. Если указать localhost, memcache пожалуется на то, что не может отрезольвить ip для указанного хоста.

Когда сам столкнулся с этой проблемой, долго ломал голову над тем, в чем же может быть дело, пока не сделал ping localhost :)

P.S: Не пользуйтесь Windows, ну хотя бы Вистой :) Удачи!

Файлы:

memcached-121-win32
php_memcache

Автор: Мурашов Олег
Источник: http://inroot.ru/

PHP

Комментарии (42 комментариев)

  1. Alex, июня 18, 2009 at 10:46 Сказал:

    Отлично все описано, спасибо, помогло.
    Установил с версией мемкешеда 1.2.6 (взял здесь http://code.jellycan.com/memcached/) и Вашим dll.

  2. admin, июня 18, 2009 at 10:56 Сказал:

    На здоровье. За дополнительную информацию спасибо

  3. Павел, июля 8, 2009 at 11:51 Сказал:

    пробовал ставить под vista64
    сервис ставится и работает phpinfo пишет что тоже все ок
    var_dump выдает:
    object(Memcache)[1]
    public ‘connection’ => resource(3, memcache connection)

    однако при попытке обратиться к мемкешу получаю следующее сообщение:

    Notice: Memcache::getversion() [memcache.getversion]: Server 127.0.0.1 (tcp 11211) failed with: Failed reading line from stream (0) in …

  4. Павел, июля 8, 2009 at 11:57 Сказал:

    при запуске мемкеша в консоли вижу что PHP коннектится и посылает запрос,
    мемкеш ему отвечает VERSION 1.2.1
    и далее пишет
    failed to write, and not due to blocking: Resource temporarily unavailable

    в PHP соответственно ошибка описанная в предыдущем посте

  5. Av@tar, июля 8, 2009 at 12:04 Сказал:

    А php код покажите пожалуйста, а то уж очень странно ругается MC

  6. А под PHP 5.3 что-то не заводится… =(

  7. Av@tar, сентября 2, 2009 at 10:48 Сказал:

    А на что жалуется? В принципе, подозреваю, что это из-за php_memcache.dll. Если будет время, пересоберу библиотеку из исходников и выложу здесь. Или можете попробовать сделать это самостоятельно

  8. С PHP 5.3 apache при запуске выдает:
    memcache: Unable to initialize module
    Module compiled with module API=20060613
    PHP compiled with module API=20090626
    These option need to match

    Видимо, пересборка поможет.

  9. Сейчас попробую подключить к php 5.3.1 под денверном. Пожелайте мне удачи )

  10. Олег Мурашов, февраля 16, 2010 at 15:20 Сказал:

    Удачи :) Сообщайте о результатах)

    Если будет время, соберу из исходников dll для 5.3.*

  11. Олег, не надо, все уже собрали за нас ) http://downloads.php.net/pierre/php%5Fmemcache-cvs-20090703-5.3-VC6-x86.zip (ну или можно просмотреть саму директорию).

    Так что вот. Вроде работает, но Doctrine почему-то не кэшируется (по крайней мере плюсов не вижу).

  12. Олег Мурашов, февраля 16, 2010 at 22:53 Сказал:

    Спасибо за ссылочку, а то я про нее как-то и не знал

  13. Доброе время суток поставил , установил, но PHP не видет Memcache ,что не так сделал подскажите! PHP Version 5.2.1

  14. Олег Мурашов, марта 1, 2010 at 16:36 Сказал:

    Что значит не видит? В phpinfo есть секция Memcache? Если нет, значит вы не установили расширение mc. Или версия не подходит.

  15. Установил как выше написано и запустил , в процессах отображается, а вот в PHP нет.Операционная система стоит Windows XP SP3, может в ней проблемка?

  16. А что такое расширение mc , подскажите как устанавливать :)

  17. Олег Мурашов, марта 2, 2010 at 17:14 Сказал:

    “А что такое расширение mc”
    Я имел ввиду PHP Extension php_memcache.dll. Обратите внимание на 5 и 6-й пункты описания процесса установки. Также посмотрите, есть ли информация о Memcached в phpinfo. Если нет, значит PHP не подхватил DLL по какой-то причине.

  18. Во спс )) поставил другой php и заработало вот данные
    Active persistent connections 0
    Version 2.2.4-dev
    Правельно или нет? ))

  19. Олег Мурашов, марта 9, 2010 at 13:14 Сказал:

    Откуда эти данные? Чтобы узнать, правильно ли установлен сервер, проще всего создать тестовый скрипт :)

  20. Вадим, марта 17, 2010 at 12:13 Сказал:

    И ни одного упоминания где взять класс для работы с memcache

  21. Олег Мурашов, марта 17, 2010 at 12:46 Сказал:

    По-моему, только об этом здесь и упоминается

  22. Уил Смит, марта 17, 2010 at 18:47 Сказал:

    >>По-моему, только об этом здесь и упоминается
    memcached.exe – да
    php_memcache.dll – да

    Но ткните носом… на ссылку вида classMemcahe.php

    Или каким образом будут работать конструкции:
    // Помещаем данные в кэш на 24 часа
    $cache->set(‘user’ . $user_id, $user_data, MEMCACHE_COMPRESSED, 60*60*24);

  23. Олег Мурашов, марта 18, 2010 at 12:15 Сказал:

    Установка php_memcache.dll делает доступным класс Memcache. Создаете от него объект и используете. Никаких дополнительных файлов с расширением php подключать не нужно.

  24. Валерия, апреля 29, 2010 at 16:51 Сказал:

    Ура! Спасибо!

  25. Олег Мурашов, апреля 29, 2010 at 17:03 Сказал:

    Всегда пожалуйста :)

  26. gustav, июня 6, 2010 at 20:10 Сказал:

    У меня что-то не получается, пробовал делать по пунктам:
    memcached.exe -d install выполнил не в командной строке, а в тотал командере, после этого выполнил строчку в cmd и получил вот что: failed to install service or service already installed
    в службах memcached Server нету (
    phpinfo ничего про mc не знает (dll кинул, в .ini прописал)
    ОС – Виста
    PHP 5.1.2
    MC 121
    Помогите разобраться пожалуйста!

  27. Олег Мурашов, июня 6, 2010 at 21:35 Сказал:

    То, чем выругалась командая строка, означает, что MC установился. Может вы в службах плохо смотрели? Если смотрели хорошо, а все равно сервис отсутствует, попробуйте переустановить MC, но уже из консоли, запущенной от администратора.
    Я вообще не силен в администрировании Windows, поэтому просто предполагаю.

    Что касается DLL, то ситуация не менее странная. Уверены, что все правильно сделали? Если бы версия dll не подходила, то PHP выругался бы при запуске.

    Покажите что ли как вы в php.ini подключаете библиотеку.

  28. gustav, июня 8, 2010 at 15:41 Сказал:

    С установкой MC разобрался, нужно запустить cmd от администратора как вы и сказали, это можно сделать как описано здесь: http://blogs.msdn.com/b/tims/archive/2006/11/02/windows-vista-secret-10-open-an-elevated-command-prompt-in-six-keystrokes.aspx (кому лень читать – просто нужно набрать в стартовом меню cmd и нажать ctrl+shift+enter и cmd запустится в режиме админа) …. так вот, служба появляется все ок, а вот phpinfo() ниче про MC не выдает, я сделал все как описано в статье, вставил в php.ini строку extension = php_memcache.dll, в папке ext dll лежит …

  29. gustav, июня 14, 2010 at 11:06 Сказал:

    В общем, разобрался наконец … дело было наверно в настройке самого PHP и Apache, переустановил эти компоненты и настроил по этому руководству – http://www.tmanager.ru/russian/apache.html – все заработало
    ЗЫ. PHP 5.3.2, Apache 2.2.15

  30. Олег Мурашов, июня 15, 2010 at 4:01 Сказал:

    Признаться, не вижу смысла вручную собирать Apache+PHP+MySQL под винду.Если уж тратить время, то под Linux. Впрочем, там вариантов особо нет. А вот под Win платформу проще всего взять какой-то готовый пакет. Я использовал Denwer. Быстро и удобно. Установка занимает пару минут. Сервер можно перенести с одной машины на другую простым копированием. Есть масса аналогов, на любой цвет.

    В любом случае, поздравляю с успехом :)

Оставить комментарий