Как не кэшировать файл PHP, где называется cachmanifest.
-
26-09-2019 - |
Вопрос
Я создаю приложение для iPhone с jqtouch, и я использую cachemanifest, чтобы кэшировать все статические файлы (изображения, CSS, JavaScript), чтобы загрузить его быстрее. Однако на странице используется PHP для динамического контента, и я не хочу кэшировать это. Поэтому я генерирую CACHEMANIFEST с этим PHP-скриптом (Mainest.php):
<?php
header('Content-Type: text/cache-manifest');
echo "CACHE MANIFEST\n";
$hashes = "";
$lastFileWasDynamic = FALSE;
$dir = new RecursiveDirectoryIterator(".");
foreach(new RecursiveIteratorIterator($dir) as $file) {
if ($file->IsFile() && $file != "./manifest.php" &&
substr($file->getFilename(), 0, 1) != ".") {
if(preg_match('/.php$/', $file)) {
if(!$lastFileWasDynamic) {
echo "\n\nNETWORK:\n";
}
$lastFileWasDynamic = TRUE;
} else {
if($lastFileWasDynamic) {
echo "\n\nCACHE:\n";
$lastFileWasDynamic = FALSE;
}
}
echo $file . "\n";
$hashes .= md5_file($file);
}
}
echo "\nNETWORK:\nhttp://chart.apis.google.com/\n\n# Hash: " . md5($hashes) . "\n";
?>
На самом деле это работает действительно хорошо, кроме одной раздражающей вещи:
От того, что я прочитал где-то файл, который называет CACHEMANIFEST, автоматически включается в манифест и является кэшированием в городе. Вича означает, что моя начальная страница index.php, где я называю Cachmanifest - это кеширование. Это приводит к очень раздражающим проблемам.
Есть ли способ разобраться с этим или любым умным обстоянием? Страница находится в CACHEMANIFEST, перечисленном в виде сети, но похоже, что это входит в пчел, изменившись тем, что Cachmanifest вызывается из файла.
Решение
Идея Футты - это верно, но то, что вы, вероятно, найдете, является то, что только один раздел вашей фронтской страницы часто меняется. Оставьте это пусто, то пусть остальная часть страницы будет кэширована и не беспокойтесь об этом. Когда вы посещаете страницу, кэшированная версия мгновенно вызывается, и вы можете запустить скрипт, чтобы захватить фрагмент динамической страницы с сервера и установить его на InnerHTML для завершения страницы. Эффект заключается в том, что есть еще один HTTP-запрос (плюс один для манифеста), поэтому он не медленнее, и он добавляется, что вы можете показать часть вашего приложения, пока загружается динамический раздел. Если вы когда-либо хотите обновить всю страницу, прокомментируйте комментарий в манифесте, разметкой версии, и увеличивайте это для перезагрузки всего приложения.
Чистый и аккуратный. Я думаю, что это то, как система предназначена для использования, не пытаясь избежать немного JavaScript, поскольку это в конце концов, вы можете играть в автономном режиме и сделать полезные вещи с приложением при внедрении в автономном режиме.
Другие советы
У меня такой же опыт, но имейте следующий возможный обходной путь в моем Todo-списке:
- Создать манифест со всеми статическими активами
- Включите ссылку на этот манифест только в одной HTML-странице (BuildCache.php)
- Проверьте, поддерживается ли окно. Оборота.
- Перенаправить один раз на сеанс к Cache.html для создания / проверки / обновления кэша
- есть PublyCache.php отображать некоторую информацию о том, что делается (используя PrienteCache EventListeners)
- иметь RUBLECACHE.PHP перенаправить обратно к нормальному индексу (где манифест не определен)
Я надеюсь (и кто-то утверждал, что это дело в комментарии в моем блоге) Чтобы все страницы в том же домене будут использовать статические активы в ApplicationCache, даже если манифест не ссылается во всех них.
Другое решение было бы сохранить свой index.php в качестве пустой нагрузки или экрана всплеск некоторого сорта, затем перенаправляя пользователя на фактическую динамическую страницу PHP. Поскольку манифест находится в index.php и index.php перенаправляет на реальный index.php проблема может быть меньше аноирования.