У меня есть расширения memcache на apache / php windows 10 (подробности в конце)
Создан простой тест:
$memcache = new Memcache;
$memcache->addServer("ext-memcached.e-memcached.xxx.net",11211);
$memcache->addServer("ext-memcached.e-memcached2.xxx.net",11211);
$memcache->addServer("ext-memcached.e-memcached3.xxx.net",11211);
$key='xxx_54921';
$settings = $memcache->get($key);
print_r ($settings);
серверы memcache работают на AWS и работают хорошо (производственные серверы).
Этот тестовый код работает — он получает значение с серверов memcache.
Однако, если я подожду пару минут и обновлю, это не вернет значение.
Затем, если я обновлю снова, он вернет значение.
Тот же код / конфиг работает с другого компьютера разработчика.
Что может вызвать это?
Config:
PHP Version 5.6.34
Windows NT SPECTRE 6.2 build 9200 (Windows 8 Home Premium Edition) i586
Build Date Feb 28 2018 17:45:55
Compiler MSVC11 (Visual C++ 2012)
Architecture x86
Memcache extension:
ts x86 version from here:
https://windows.php.net/downloads/pecl/releases/memcache/3.0.8/
memcache info:
memcache support enabled
Version 3.0.8
Revision $Revision: 329835 $
Directive Local Value Master Value
memcache.allow_failover 1 1
memcache.chunk_size 32768 32768
memcache.compress_threshold 20000 20000
memcache.default_port 11211 11211
memcache.hash_function crc32 crc32
memcache.hash_strategy standard standard
memcache.lock_timeout 600 600
memcache.max_failover_attempts 20 20
memcache.protocol ascii ascii
memcache.redundancy 1 1
memcache.session_redundancy 2 2
Сервис memcached на самом деле не устанавливает расширение PHP memcached для вас. Он устанавливает только сервер memcached, используемый для хранения вашего кэша.
Сначала вам нужно будет загрузить Windows DLL из репозитория PECL (нажмите на синюю ссылку Windows DLL). Затем необходимо добавить строку extension = php_memcache.dll в правильный файл php.ini для вашего SAPI. Также обратите внимание, что файл DLL расширения необходимо поместить в правильный путь для вашей установки XAMPP.
Для Apache просто создайте скрипт в корневом каталоге вашего документа со строкой
Для CLI SAPI вы можете использовать php.exe —ini, чтобы сделать то же самое. Опять же, вам может понадобиться полагаться на пакет XAMPP, если он изменил ваш путь конфигурации (так как это директива времени компиляции).
После внесения изменений в php.ini вам нужно будет перезапустить PHP, чтобы изменения вступили в силу.
Вы можете сослаться на: https://pureform.wordpress.com/2008/01/10/installing-memcache-on-windows-for-php/
Поскольку вы используете PHP 7 в Windows, вероятно, также важно отметить, что скомпилированная DLL из PECL может фактически не работать под Apache для Windows, потому что вы, скорее всего, используете theaded SAPI. Поэтому убедитесь, что вы загружаете правильную версию. Насколько я могу судить, эта версия скомпилирована только для работы до PHP 5.6. Альтернатива github для PHP 7 доступна по адресу https://github.com/nono303/PHP7-memcahe-dll как упомянуто в комментариях проверено под безопасностью потока. Таким образом, вы можете быть в состоянии заставить это работать только для ваших скриптов CLI в Windows.
Проблема, кажется, больше в том, как вы пишете (set
) и получать (get
) данные, имеющие несколько узлов. — Memcache не поддерживает репликацию.
Попробуйте один узел, в этом случае вы должны быть доступны для получения данных сразу после установки.
При наличии нескольких узловSharding«это общий подход к хранению данных, это означает, что реализована логика для определения того, какой сервер использовать для записи или получения данных:
От https://en.wikipedia.org/wiki/Memcached:
Клиенты используют клиентские библиотеки для связи с серверами, которые по умолчанию предоставляют свои услуги через порт 11211. Поддерживаются как TCP, так и UDP. Каждый клиент знает все серверы; серверы не общаются друг с другом. Если клиент желает установить или прочитать значение, соответствующее определенному ключу, клиентская библиотека сначала вычисляет хэш ключа, чтобы определить, какой сервер использовать. Это дает простую форму сегментирования и масштабируемой архитектуры без совместного использования ресурсов на всех серверах.
Поэтому в PHP-клиенте вы можете попробовать согласованное хеширование:
$memcache = new Memcache;
$memcache->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
От: http://www.php.net/manual/en/memcached.constants.php
Memcached::OPT_LIBKETAMA_COMPATIBLE
Enables or disables compatibility with libketama-like behavior. When enabled,
the item key hashing algorithm is set to MD5 and distribution is set
to be weighted consistent hashing distribution. This is useful because
other libketama-based clients (Python, Ruby, etc.) with the same server
configuration will be able to access the keys transparently.
Note:
It is highly recommended to enable this option if you want to use
consistent hashing, and it may be enabled by default in future releases.
Также попробуйте:
memcache.hash_strategy = consistent;
Проверьте этот пост для более подробной информации: https://blog.fedecarg.com/2008/12/24/memcached-consistent-hashing-mechanism/
и этот ответ: https://stackoverflow.com/a/48006009/1135424
Проверьте свои
memcache.redundancy
memcache.redundancy
настройки, ваши данные не будут доступны на каждом memcached узле. Установка в 3 должна быть достаточной в вашем примере.