揮発性のメモ2

知識をメモ書きしておく

ファイルを取得して、変化があったら何かする

サーバ側 ファイルに更新が無ければ 304 を返す例

<?
// getjson.php
$name = $_REQUEST['name'];

$text = file_get_contents($name);
$last_modified = gmdate( "D, d M Y H:i:s T", filemtime( $name ) );
$etag = md5( $text );

if( $last_modified === stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
    $etag === stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) ){
    // ★ タイムスタンプもハッシュも一致してたら 304を返す
    header('content-type: application/json; charset=utf-8');
    header("HTTP/1.1 304 Not Modified");
    exit 0;
}

header('content-type: application/json; charset=utf-8');
header( "Last-Modified: {$last_modified}" ); // ★ 最終更新日付
header( "Etag: {$etag}" ); // ★ ファイルのハッシュ

echo $text;

Etag と Last-modified ヘッダを使って動的コンテンツでもブラウザキャッシュさせる - PSI Labs
【php】phpでも304 Not Modified を返すことができる at softelメモ

クライアント側 3秒おきに取得する例

function getRadio()
{
    $.ajax({
        url: "getjson.php",
        data:{ name:"piyo.json" },
        dataType: 'json',
        ifModified: true  // ★最終取得日時をつける

    }).done(function(json,status,xhr){
        if( xhr.status=="200" ){ // ★ 304 はここで無視する
            // 成功
            console.log("更新があった!");
            disp_radios(json);
        }

    }).always(function(){
        setTimeout(getRadio,3000);  // 3秒後にまた取得しにいく

    });
}

$.ajax() | jQuery 1.9 日本語リファレンス | js STUDIO
http://blog.as-is.net/2005/01/get.html
HTTP if-none-match and if-modified-since and 304 clarification in PHP - Stack Overflow




サーバ側で、Last-Modified:Etag: を付けるようにした上で、
リクエスト時にifModified: true を足すと、同一ファイルの2回目以降のリクエストに If-Modified-Since:If-None-Match: がつくようになる。

リクエストしたものが最後のリクエストから変更されていない際に、リクエストの失敗を報告させるには、 ifModifiedをtrueに設定します。

$.ajax() | jQuery 1.9 日本語リファレンス | js STUDIO

と書いてあるけど、別に If-Modified-Since:If-None-Match:が一致していても 失敗してくれない。
Apacheはファイルに更新が無くても普通に 200 を返してくる)
さらに、サーバ側で きちんと 304 を返しても、エラーにはなってくれない。
しかもfirefoxに304を返すと「要素が見つかりません」というエラーメッセージがコンソールに出てしまう。


stripslashes() を使っているのは、なんかみんな使ってたから。
クォートされることがあるのか知らないけど、多分あるんだろう。