Nano Hash - криптовалюты, майнинг, программирование

срок действия заголовка истекает в файле PHP с выводом JS

Как поместить заголовок с истекающим сроком действия в файл PHP, который выходит за пределы файла JS?

.htaccess

ExpiresActive on
ExpiresByType image/gif A29030400
ExpiresByType image/jpeg A29030400
ExpiresByType image/png A29030400
ExpiresByType text/css A29030400
ExpiresByType application/javascript A29030400

заголовок в файле JS

Cache-Control   max-age=29030400
Connection  Keep-Alive
Date    Thu, 18 Oct 2012 09:23:16 GMT
Etag    "300000002c8ba-15f-4cc3069c72d00"
Expires Thu, 19 Sep 2013 09:23:16 GMT
Keep-Alive  timeout=5, max=94
Server  Apache/2.2.22 (Win32) PHP/5.4.3

заголовок в файле PHP, который выводит файл JS

Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection  Keep-Alive
Content-Length  1195
Content-Type    application/javascript
Date    Thu, 18 Oct 2012 09:23:16 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive  timeout=5, max=100
Pragma  no-cache
Server  Apache/2.2.22 (Win32) PHP/5.4.3
X-Powered-By    PHP/5.4.3

PHP-файл с кодом

<?php
header('Content-Type: application/javascript');
$js_output = array('something' => 'some value');
?>
var <?=json_encode($js_output)?>

  • Вы хотите, чтобы файл PHP создавал заголовки, подобные тем, которые используются для файла JS, поставляемого apache? 26.10.2012

Ответы:


1

Вы можете установить заголовки кэша:

<?php
header('Content-Type: application/javascript');
header("Cache-Control: max-age=29030400");
header("Cache-Control: public", false); 
$js_output = array('something' => 'some value');
?>
var <?=json_encode($js_output)?>

см. также: http://php.net/manual/en/function.header.php< /а>

20.10.2012
  • нельзя ли управлять через htaccess и apache? 21.10.2012
  • Хотя срок действия этого объявления ответа истекает, сервер всегда будет обрабатывать весь php, и конечным результатом является то, что сервер постоянно возвращает статус ответа 200 OK. Конечным результатом является то, что из кэша клиента ничего не извлекается. 24.10.2012
  • Вы не можете сделать это полностью в htaccess из-за того, что процессор php мешает. Вы могли бы, если вы поиграете с AddHandler T flag из mod_rewrite http://httpd.apache.org/docs/current/rewrite/flags.html#flag_t и ваши заголовки с истекающим сроком действия, но я думаю, что в конечном итоге он просто покажет исходный код файла php. Вам нужно будет удалить RemoveHandler в расширении php и сделать свое собственное, и это не оптимально, имхо. 24.10.2012
  • Не совсем так, @AnthonyHatzopoulos. Большинство клиентов кэшируют ответ и не запрашивают еще одну копию до тех пор, пока (а) не закончится сеанс или (б) не истечет максимальный возраст. Но когда клиенты делают условный запрос, этот код всегда будет возвращать новую копию. Поведение клиента при кэшировании сильно различается. 27.10.2012
  • Вы должны либо нажать перезагрузку, либо перейти к строке URL и нажать Enter (что большинство браузеров воспринимает как неявную перезагрузку). Вы получите совершенно другое поведение, по крайней мере, в Chrome, если вы (1) откроете новую вкладку/окно (2) включите инструменты отладки и выберите «Сеть», затем (3) вставьте свой URL-адрес в адресную строку и нажмите Enter. В этом случае, который больше похож на случайный просмотр, вы определенно получите страницу из кеша. Однако вы правы в том, что в тех случаях, когда браузер решает перезагрузить страницу, условное получение более эффективно. Просто большинству людей сложнее кодировать. 29.10.2012

  • 2

    Вам нужно сохранить почти те же настройки Expire в вашем .htaccess, то есть:

    ExpiresActive on
    ExpiresByType image/gif A29030400
    ExpiresByType image/jpeg A29030400
    ExpiresByType image/png A29030400
    ExpiresByType text/css A29030400
    ExpiresByType application/javascript A29030400
    ExpiresDefault "access plus 1 month"
    

    Затем в вашем PHP-коде, который пишет файл JS, используйте правильные Content-Type и :

    <?php
    header('Content-Type: application/javascript');
    exitIfNotModifiedSince(setLastModified());
    
    function setLastModified($lastModified=NULL) {
        $pageModified = getlastmod();
    
        if(empty($lastModified) || ($lastModified < $pageModified))
            $lastModified = $pageModified;
        $headerModified = filemtime(__FILE__);
        if($headerModified > $lastModified)
            $lastModified = $headerModified;
        header('Last-Modified: ' . date("r",$lastModified));
        return $lastModified;
    }
    
    function exitIfNotModifiedSince($lastModified) {
        if(array_key_exists("HTTP_IF_MODIFIED_SINCE",$_SERVER)) {
            $ifModifiedSince = strtotime(preg_replace('/;.*$/', '',
                                         $_SERVER["HTTP_IF_MODIFIED_SINCE"]));
            if($ifModifiedSince >= $lastModified) { 
                header("HTTP/1.0 304 Not Modified");
                exit();
            }
        }
    }
    $jsData  = array('foo' => 'bar');
    ?>
    var <?=json_encode( $jsData );?>
    

    наверху. Следите за своими заголовками в Firebug, и он должен показать вам что-то вроде этого:

    HTTP/1.1 304 Not Modified
    Cache-Control:max-age=29030400
    Connection:close
    Date:Wed, 24 Oct 2012 19:10:43 GMT
    Expires:Wed, 25 Sep 2013 19:10:43 GMT
    Server:Apache/2.2.9 (Unix) mod_ssl/2.2.9 OpenSSL/0.9.8h DAV/2 PHP/5.2.6
    Content-Length: 31
    Content-Type: application/javascript
    
    23.10.2012
  • Да, в значительной степени, но затем вы также указали в своем вопросе Expires Thu, 19 Nov 1981 08:52:00 GMT, что не совпадает с тем, что я получил, пытаясь понять это правильно. 24.10.2012
  • То же самое и здесь, хотя срок действия объявления этого ответа истекает, сервер всегда будет обрабатывать весь php, и конечным результатом является то, что сервер постоянно возвращает статус ответа 200 OK. Конечным результатом является то, что из кэша клиента ничего не извлекается. 24.10.2012
  • @AnthonyHatzopoulos: Пожалуйста, проверьте мой отредактированный ответ, в котором используются заголовки Last-Modified и HTTP_IF_MODIFIED_SINCE. 24.10.2012
  • @anubhava разве ты не видел мой пост, который я сделал за несколько часов до того, как использовал HTTP_IF_MODIFIED_SINCE? 24.10.2012
  • @AnthonyHatzopoulos: OMG, я открыл эту вкладку с утра и не заметил, что ваш ответ также был опубликован здесь, я только что посмотрел ваш комментарий здесь и переработал свой ответ на основе этого :) 24.10.2012

  • 3

    Это решение вернет правильный ответ 304 и остановит выполнение php, позволяя клиенту использовать кешированную копию. Вы не можете сделать это полностью в htaccess, используя mod_rewrite, так как процессор php всегда будет мешать.

    .htaccess

    <IfModule mod_expires.c>
        ExpiresActive on
        ExpiresByType application/javascript   "access plus 1 year"
    </IfModule>
    <IfModule mod_headers.c>
        Header append Cache-Control "public"
    </IfModule>
    

    пример.js.php

    <?php
    header('Content-Type: application/javascript');
    
    if (false === ($timestamp = getlastmod())) {
        if (false === ($timestamp = @filemtime(__FILE__))) {
            if (false === ($timestamp = @filemtime($_SERVER['SCRIPT_FILENAME']))) {
                trigger_error('Failed to retrieve timestamp', E_USER_ERROR);
            }
        }
    }
    $timestamp_string = gmdate('r', $timestamp);
    
    // Check if the client has the same page cached
    if (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]) &&
        ($_SERVER["HTTP_IF_MODIFIED_SINCE"] == $timestamp_string)) {
        header("HTTP/1.1 304 Not Modified");
        exit;
    }
    
    // Inform the user agent what is our last modification date
    header("Last-Modified: ".$timestamp_string);
    
    $js_output = array('something' => 'some value');
    echo 'var json = '.json_encode($js_output).PHP_EOL;
    exit;
    ?>
    

    Первый ответ GET

    HTTP/1.1 200 OK
    Date: Wed, 24 Oct 2012 16:20:05 GMT
    Server: Apache/2.2.16 (Win32) PHP/5.3.3
    X-Powered-By: PHP/5.3.3
    Last-Modified: Wed, 24 Oct 2012 16:16:34 GMT
    Cache-Control: max-age=31536000
    Expires: Thu, 24 Oct 2013 16:20:05 GMT
    Content-Length: 39
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Type: application/javascript
    

    Второй и последующие ответы GET

    HTTP/1.1 304 Not Modified
    Date: Wed, 24 Oct 2012 16:21:31 GMT
    Server: Apache/2.2.16 (Win32) PHP/5.3.3
    Connection: Keep-Alive
    Keep-Alive: timeout=5, max=100
    Expires: Thu, 24 Oct 2013 16:21:31 GMT
    Cache-Control: max-age=31536000
    
    24.10.2012
  • Ваш ответ не работает, но он помог мне в правильном направлении :) это решение работает ... если вы укажете его в своем ответе, я отмечу его как решенный function cache_headers(){ $gmt_mtime = gmdate('r', filemtime($_SERVER['SCRIPT_FILENAME'])); header('Last-Modified: '.$gmt_mtime); header('Cache-Control: public'); if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){ if($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime){ header('HTTP/1.1 304 Not Modified'); exit(); } } } 24.10.2012
  • @clarkk он работал отлично, когда я тестировал его. Как еще я получил эти ответы. Единственное, что отличается, это то, что вы используете gmdate('r', что является сокращением того, что я поставил, и устанавливаете cache-control public, который вам не нужен, если вы явно не устанавливаете управление кешем где-то еще, например, в своем htaccess. Может быть, __FILE__ не работает на вашем сервере по какой-то странной причине. 24.10.2012
  • Есть еще одна проблема. Теперь кажется, что я не могу использовать js-версии файла (например, file.js?v=43), если не изменена дата изменения файла? 25.10.2012
  • @clarkk Ну, это что-то новое и не является частью вашего исходного вопроса. Во-вторых, зачем вам обслуживать один и тот же файл, если он не изменился? Решение вашей проблемы довольно простое. Есть несколько способов ее решить. 25.10.2012
  • @clarkk Я только что протестировал свое решение, и оно отлично работает с добавлением строк запросов для очистки кеша. Откройте свою сетевую панель и посмотрите ответы. 25.10.2012
  • Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..