2015-08-14 6 views
-1

Я хочу кэшировать только элемент, потому что он используется на КАЖДОЙ веб-странице моей. Здесь проверьте это изображение. Это объясняется здесь. http://i.imgur.com/Qm7AVf9.pngВозможно ли кэшировать только часть (фон, навигационная панель) веб-сайта вместо целого файла?

+0

В древности некоторые могли предложить фреймы, но теперь никто не должен просто перезагружать эти биты, это действительно не должно быть проблемой. любые изображения будут кэшироваться браузером, а html должен иметь тривиальный размер. –

+0

. Вероятно, вы захотите изучить более одностраничное веб-приложение, используя что-то вроде React или AngularJS – Orangepill

ответ

1

Не так, как вы думаете. Это будет кеширование на стороне сервера. Не клиентская сторона. Клиент кэширует только элементы страницы, такие как изображения, видео и т. Д. Они не кэшируют фактический HTML, пока сама страница не сообщит им о кешировании и не изменится с ранее кэшированной версии.

Итак, в вашем примере изображения во всех этих разделах получают кеширование, но не HTML. Лучшее, что вы можете сделать, это разбить разделы на свои собственные файлы и кешировать их на стороне сервера.

Самый большой вопрос, почему вы их кешируете? Если вы хотите сэкономить на пропускной способности, вы не получите никакой помощи от кеширования на стороне сервера.

Вы можете добавить в свой файл .htaccess:

<FilesMatch "\.(js)$"> 
Header set Cache-Control "max-age=29030400, public" 
</FilesMatch> 

<FilesMatch "\.(css)$"> 
Header set Cache-Control "max-age=7257600, public" 
</FilesMatch> 

<FilesMatch "\.(jpg)$"> 
Header set Cache-Control "max-age=29030400, public" 
</FilesMatch> 

<FilesMatch "\.(gif)$"> 
Header set Cache-Control "max-age=29030400, public" 
</FilesMatch> 

<FilesMatch "\.(png)$"> 
Header set Cache-Control "max-age=29030400, public" 
</FilesMatch> 

<FilesMatch "\.(mp4)$"> 
Header set Cache-Control "max-age=29030400, public" 
</FilesMatch> 

<FilesMatch "\.(flv)$"> 
Header set Cache-Control "max-age=29030400, public" 
</FilesMatch> 

Это будет кэшировать все элементы на странице, которые могут быть кэшируются клиентом.

Если вы пытаетесь решить проблемы с загрузкой сервера, вы можете кэшировать различные части элементов с использованием разных технологий. Memcache может кэшировать ваши запросы MySQL, а затем использовать встроенный в PHP кеш-память Opcode, поэтому PHP не скомпилируется каждый раз при запуске файла. В этом случае было бы лучше разбить разделы на свои собственные файлы и включить их в указательную страницу.

Для кэширования MySQL с помощью Memcached вы можете обернуть свой код внутри запроса, чтобы узнать, существует ли кэш, а затем в конце вашего кода сохранить результат кэширования MySQL для запуска кеша. Это выглядело бы примерно так:

// this little portion is standard if you have Memcache compiled into PHP. 

$memcache_obj = new Memcache; 
$memcache_obj->connect('127.0.0.1', 11211); 

// We try to load the memcache result if it exists 
$profile = $memcache_obj->get("YouPickThisNameOnYourOwn"); 

// Did it exist? If NOT get it from MySQL 
if (!is_array($profile)) { 

$mysqli = new MySQLi("localhost", "MYSQL_UserName","MYSQL_Password","MYSQL_Database"); 
    $sqlquery = $mysqli->query("SELECT whatever you are selecting"); 

// Run through and make the array you want normally... 
    for ($x=0;$x < $sqlquery->num_rows;$x++) { 
     $rowprofiles = $sqlquery->fetch_assoc(); 

    // Here I am creating an array with the results and I had selected id, text_description, subdir, crc, url from MYSQL 
    $profile[$x] = array ("id" => $rowprofiles['id'], "text" => $rowprofiles['text_description'], "pic" => "http://www.domain.com/{$rowprofiles["subdir"]}/{$rowprofiles["crc"]}.jpg", "url" => $rowprofiles['url']); 
    } 
    // freeing up $sqlquery resource 
    $sqlquery->free(); 

    // Here I am saving the result of the query as an associative array into memcache with a short time limite of 300 seconds. You might want longer for non changing data 
    $memcache_obj->add('YouPickThisNameOnYourOwn', $profile, false, 300); 

    // if I ended up using a query instead of memcache, close out the connection 
    if (isset($mysqli)) { $mysqli->close(); } 
} 

// end if the if... had it been memcache'd the script would bypass the query and just come here with the array and spit it out 
foreach ($profile as $piece) { 
    echo '<div class="gallery"><img src="'.$piece['pic'].'" alt="'.$piece['text'].'" width="300" height="225" border="1" /></div>'; 
    echo '<div class="gallery">'.substr($piece['text'],0,192).'</div>'; 
} 

// hope this helps! 
// You can run a file with just <? phpinfo(); ?> inside it to see if your host already has memcache compiled into your PHP installation. 
+0

Thx для понимания концепции! WEW. Большинство этого не понимают! –

+0

U спросил ** «Самый большой вопрос в том, почему вы их кешируете? Если вы хотите сэкономить на пропускной способности, вы, очевидно, не получите никакой помощи от кеширования на стороне сервера». ** Но это экономит пропускную способность, если я могу кэшировать элементы в красной прямоугольной коробке. Данные должны быть переданы пользователям независимо от их клиентской стороны (html/Js/CSS/Jquery) или серверной части (PHP, MySql)! Изображение и текст - это данные, которые особенно называются каждый раз, когда мой сайт открыт. Он сохранит большую полосу пропускания b/c, которую элементы могут быть вызваны из их локального хранилища браузера! –

+0

Не могли бы вы объяснить, что вы сделали на .htaccess с помощью