Итак, я написал этот класс, переопределяющий базовый QWebPage.Кэш QtWebKit, похоже, не работает
Это с Qt4.8.5. Я не могу перейти на более новую версию по всем причинам ... В любом случае классы кэширования были введены в 4.4, поэтому я должен быть в порядке.
Это написано на основе следующей док: http://blog.qt.digia.com/blog/2011/04/29/http-caching-with-qt/
MyQWebPage::MyQWebPage(QObject* parent /*= nullptr*/) : QWebPage(parent)
{
QWebHistory *history = this->history();
history->setMaximumItemCount(0);
QNetworkAccessManager * pNAM = networkAccessManager();
if (pNAM) {
QNetworkDiskCache * pNDC = new QNetworkDiskCache(parent);
pNDC->setCacheDirectory(QDir::homePath() + "/AppData/Roaming/Autodesk/ash_web_cache");
qint64 size = pNDC->cacheSize();
printf("cache size = %ld\n", size);
size = pNDC->maximumCacheSize();
printf("maximum cache size = %ld\n", size);
const qint64 desired = 1024*1024*1024;
if (size < desired) {
pNDC->setMaximumCacheSize(desired);
size = pNDC->maximumCacheSize();
printf("new maximum cache size = %ld\n", size);
}
QString dir = pNDC->cacheDirectory();
printf("cache directory = %s\n", (const char*)dir.toUtf8());
pNAM->setCache(pNDC);
}
}
Я даю 1 ГБ кэш-памяти сейчас, просто чтобы убедиться, что я делаю следует кэшировать должным образом.
Итак, у меня появился мой webapp, я открываю инспектора, я заходил на вкладку сети. На моей веб-странице отображается куча миниатюр. Когда я перезагружаю свою страницу, я не вижу много кэширования, хотя должно быть много свободного места!
Если я делаю то же самое в хроме, все мои миниатюры получают 200-OK-fromcache, как и ожидалось! Таким образом, нет никаких проблем с датой, etag и т. Д., Так как все работает в хроме.
Но в этом веб-приложении qt нет, даже не 304 ... Все полностью не кэшировано.
В PRINTF строки в коде выше напечатает:
cache size = 8342691
maximum cache size = 52428800
new maximum cache size = 1073741824
Размер кэша 8342691 точно размер каталога, я приставил в setCacheDirectory
(точнее, один из его подкаталогов называется данных7) .. Но я не могу найти мои миниатюры там.
Есть ли что-нибудь, что я делаю неправильно?
Кстати, я заметил эту функцию здесь в QtWebSettings:
void QWebSettings::setObjectCacheCapacities(int cacheMinDeadCapacity, int cacheMaxDead, int totalCapacity) [static]
Я не проверял это еще ...
Существует также такой контроль кэш, который я мог бы настроить:
enum QNetworkRequest::CacheLoadControl
Controls the caching mechanism of QNetworkAccessManager.
QNetworkRequest::AlwaysNetwork 0 always load from network and do not check if the cache has a valid entry (similar to the "Reload" feature in browsers); in addition, force intermediate caches to re-validate.
QNetworkRequest::PreferNetwork 1 default value; load from the network if the cached entry is older than the network entry. This will never return stale data from the cache, but revalidate resources that have become stale.
QNetworkRequest::PreferCache 2 load from cache if available, otherwise load from network. Note that this can return possibly stale (but not expired) items from cache.
QNetworkRequest::AlwaysCache 3 only load from cache, indicating error if the item was not cached (i.e., off-line mode)
Но по умолчанию AlwaysNetwork
должно быть хорошо, поэтому я не думаю, что мне нужно изменить это.