Использование заголовков cURL и HTTP для правильного кэширования XML-канала с помощью PHP - PullRequest
0 голосов
/ 23 ноября 2011

Я использую cURL, чтобы получить XML-фид и сохранить его в XML-файл, например,

if (file_exists($filename) && (filemtime($filename) > time() - 30)) {
    // load cached XML from file
    $output = simplexml_load_file($filename);

    return $output;
} else {
    // Initiate the curl session
    $ch = curl_init();

    // Set the URL
    curl_setopt($ch, CURLOPT_URL, $url);

    // Removes the headers from the output
    curl_setopt($ch, CURLOPT_HEADER, 0);

    // Callback to get custom headers
    curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this,'readHeader'));

    // Return the output instead of displaying it directly
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // Execute the curl session
    $output = curl_exec($ch);

    // Return headers
    $headers = curl_getinfo($ch);

    // Merge headers into one array
    $this->response_meta_info = array_merge($headers, $this->response_meta_info);

    // Close the curl session
    curl_close($ch);

    // Cache feed
    file_put_contents($filename, $output);

    // XML to object
    $output = simplexml_load_string($output);

    // Return the output as an array
    return  $output;
}

Возвращает следующие http-заголовки

Array(
    [url] => http://example.com
    [content_type] => text/xml
    [http_code] => 200
    [header_size] => 425
    [request_size] => 108
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.677605
    [namelookup_time] => 0.181104
    [connect_time] => 0.342955
    [pretransfer_time] => 0.343036
    [size_upload] => 0
    [size_download] => 6579
    [speed_download] => 9709
    [speed_upload] => 0
    [download_content_length] => 6579
    [upload_content_length] => 0
    [starttransfer_time] => 0.515733
    [redirect_time] => 0
    [expires] => Wed, 23 Nov 2011 15:49:24 GMT
)

Я хочу использовать заголовок [expires] => Wed, 23 Nov 2011 15:49:24 GMT вместо использования текущего времени минус 30 секунд этого оператора if, если (file_exists($filename) && (filemtime($filename) > time() - 30)) {, поскольку тогда он будет обновлять кэш только тогда, когда это необходимо.

Но я не могу понять, как это сделать.

1 Ответ

1 голос
/ 23 ноября 2011

Вы можете touch() XML-файл с отметкой времени, возвращенной на strtotime,
пример: -

date_default_timezone_set('Asia/Singapore'); // replace to your timezone
$time = strtotime('Wed, 23 Nov 2011 15:49:24 GMT');
// after file_put_contents
// call this to change the time
touch($filename, $time);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...