Расширение PHP Memcache для Windows 10 работает с перерывами

У меня есть расширения 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

Ответы

Ответ 1

Служба memcached фактически не устанавливает расширение PHP memcached для вас. Он устанавливает только сервер memcached, используемый для хранения вашего кеша.

Сначала вам нужно загрузить DLL Windows из репозитория 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, потому что вы, скорее всего, используете тегированный SAPI. Поэтому убедитесь, что вы загружаете правильную версию. Насколько я могу судить, эта версия компилируется только для работы с PHP 5.6. Альтернатива github для PHP 7, доступная по адресу https://github.com/nono303/PHP7-memcahe-dll, как упоминается в комментариях, тестируется под безопасным потоком. Таким образом, вы можете только получить эту работу для ваших сценариев CLI в Windows.

Ответ 2

Проблема, похоже, больше в том, как вы пишете (set) и получаете (get) данные, имеющие несколько узлов. - Memcache не поддерживает репликацию.

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

Когда несколько узлов " осколки " являются общим подходом к хранению данных, это означает, что логика реализована на месте, чтобы определить, какой сервер использовать для записи или получения данных:

Из 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/

и этот ответ: fooobar.com/questions/505822/...

Ответ 3

Проверьте свой memcache.redundancy memcache.redundancy, ваши данные не будут доступны на каждом memcached узле. Устанавливать его на 3 должно быть достаточно в вашем примере.