Диагностика проблемы: почему Redis мешает активации лицензий
Redis — популярное решение для объектного кеширования в WordPress, ускоряющее работу сайта. Однако при активации лицензий плагинов часто возникают ситуации, когда запросы на проверку лицензии возвращают устаревшие данные или вообще не проходят. Это связано с тем, что Redis кеширует ответы API-запросов проверки лицензий или transient-значения, которые должны обновляться в реальном времени.
Признаки проблемы:
- Лицензия не активируется, хотя ключ введён верно;
- Сайт не получает обновления статуса лицензии после её отзыва;
- На странице активации отображается ошибка проверки, связанная с кешем;
- Логи сервера показывают, что запросы к лицензионному серверу не отправляются.
Пошаговое решение проблемы с Redis и активацией лицензий
1. Определение кешируемых запросов
Чаще всего лицензия проверяется через HTTP-запросы c помощью wp_remote_get или wp_remote_post, а результаты сохраняются в transient или объектный кеш. Необходимо найти, какие transient-ключи или кеш-ключи Redis используются для хранения результатов проверки.
2. Исключение transient из кеша Redis
Если вы используете плагин Redis Object Cache, добавьте фильтр, чтобы исключить transient, связанные с лицензиями, из кеша Redis. Например:
add_filter('redis_object_cache_transient_blacklist', function($blacklist) {
$blacklist[] = 'license_check'; // ключ или часть ключа transient
return $blacklist;
});В зависимости от конкретного плагина лицензирования замените 'license_check' на ваши ключи transient.
3. Отключение кеширования для запросов API лицензии
Если плагин использует HTTP-запросы с кешированием, убедитесь, что они идут без кеша. Можно добавить фильтр для pre_http_request, возвращающий false при запросах на лицензионный сервер:
add_filter('pre_http_request', function($pre, $args, $url) {
if (strpos($url, 'license-server-domain.com') !== false) {
return false; // Отключить кеширование для лицензии
}
return $pre;
}, 10, 3);4. Очистка Redis кеша
После внесения изменений обязательно очистите кеш Redis, чтобы убедиться, что устаревшие данные удалены:
redis-cli flushallИли через SSH консоль сервера или панель управления хостингом.
Проверка результата после внедрения
- Выполните активацию лицензии в админке плагина;
- Проверьте, что статус лицензии обновился и лицензия активна;
- В логах сервера или отладочном режиме (WP_DEBUG) убедитесь, что запросы к лицензионному серверу проходят;
- Запустите повторную проверку лицензии, чтобы убедиться, что данные не берутся из кеша Redis;
- Убедитесь, что нет ошибок кеширования в консоли браузера и в логах PHP.
Частые ошибки и как их исправить
Ошибка 1: Кеширование ключей transient не отключено полностью
Решение: Проверьте, что фильтр для исключения transient срабатывает и что ключи совпадают с теми, что реально используются плагином. Для отладки можно вывести все transient в базе данных:
global $wpdb;
$results = $wpdb->get_results("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_%'");
foreach ($results as $row) {
error_log($row->option_name);
}Ошибка 2: Кеширование HTTP-запросов не отключено
Решение: Используйте pre_http_request для отключения кеширования именно для URL лицензионного сервера. Проверьте URL лицензии и корректно пропишите условие.
Ошибка 3: Не очищен кеш Redis после внесения изменений
Решение: Выполните команду flushall или очистите кеш через панель. Иногда требуется перезапустить сервис Redis.
Практические советы по безопасности и производительности
- Не отключайте весь кеш Redis целиком — это снизит производительность сайта.
- Ограничьте кеширование только для transient, связанных с лицензиями, чтобы сохранить эффективность кеша.
- Настройте мониторинг ошибок лицензий и кеша, чтобы оперативно реагировать на проблемы.
- Используйте WP-Cron для периодической очистки устаревших transient, связанных с лицензиями.
Сравнение решений для работы с кешем лицензий и Redis
| Подход | Описание | Плюсы | Минусы |
|---|---|---|---|
| Исключение transient лицензий из кеша Redis | Добавление transient в blacklist Redis кеша | Сохраняет кеш для всего сайта, решает проблему лицензий | Требует точного определения ключей transient |
| Отключение кеширования HTTP-запросов лицензии | Фильтр pre_http_request для отмены кеша | Прямой контроль запросов, предотвращает кеширование нежелательных запросов | Нужно знать точные URL для проверки |
| Полное отключение Redis | Отключение плагина Redis Object Cache | Максимальная простота, решает проблему кардинально | Снижает производительность сайта |