mirror of
https://github.com/sorenpeter/timeline.git
synced 2025-12-15 19:07:01 +00:00
Merge pull request #16 from eapl-gemugami/feat/implement-refresh-if-modified-since
feat(refresh): implement if-modified-since detection to only refresh newer content
This commit is contained in:
commit
22661baee0
1 changed files with 59 additions and 26 deletions
|
|
@ -1,4 +1,5 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
$config = parse_ini_file('private/config.ini');
|
||||
|
|
@ -320,27 +321,59 @@ function getCachedFileContents($filePath) {
|
|||
return null;
|
||||
}
|
||||
|
||||
function updateCachedFile($filePath, $cacheDurationSecs = 15) {
|
||||
function updateCachedFile($filePath) {
|
||||
$cacheFilePath = getCachedFileName($filePath);
|
||||
# TODO: Report down URLs and stop loading them after a few tries
|
||||
|
||||
// File doesn't exist in cache or has expired, so fetch and cache it
|
||||
// TODO: Seems it's not working right!
|
||||
$fileDoesntExist = !file_exists($cacheFilePath);
|
||||
$fileIsOld = false;
|
||||
if (!$fileDoesntExist) {
|
||||
$fileIsOld = !((time() - filemtime($cacheFilePath)) < $cacheDurationSecs);
|
||||
}
|
||||
# Get the last modification time of the local file
|
||||
$lastModifiedTime = file_exists($cacheFilePath) ? filemtime($cacheFilePath) : false;
|
||||
$lastModifiedHeader = $lastModifiedTime ? gmdate('D, d M Y H:i:s', $lastModifiedTime) . ' GMT' : null;
|
||||
|
||||
if ($fileDoesntExist || $fileIsOld) {
|
||||
#echo "Loading Cached file $cacheFilePath<br>\n";
|
||||
$contents = @file_get_contents($filePath);
|
||||
# echo "lastModifiedHeader: $lastModifiedHeader<br>\n";
|
||||
|
||||
if ($contents === false) {
|
||||
// File loaded with errors, skip saving it
|
||||
# Set up the HTTP context with the 'If-Modified-Since' header
|
||||
$options = [
|
||||
'http' => [
|
||||
'method' => 'GET',
|
||||
'header' => $lastModifiedHeader ? "If-Modified-Since: $lastModifiedHeader\r\n" : '',
|
||||
]
|
||||
];
|
||||
|
||||
$context = stream_context_create($options);
|
||||
|
||||
$response = @file_get_contents($filePath, false, $context);
|
||||
|
||||
# Check if HTTP headers are available, usually when the server is available
|
||||
if (!isset($http_response_header)) {
|
||||
# echo "Failed to fetch headers. No HTTP request was made.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
file_put_contents($cacheFilePath, $contents);
|
||||
if ($http_response_header) {
|
||||
# var_dump($http_response_header);
|
||||
|
||||
foreach ($http_response_header as $header) {
|
||||
# Look for the Last-Modified header
|
||||
if (preg_match('/^Last-Modified:\s*(.+)$/i', $header, $matches)) {
|
||||
$dateString = $matches[1]; // Extracted date
|
||||
# echo "Extracted Date: $dateString\n";
|
||||
|
||||
// Convert to Unix timestamp
|
||||
$lastModifiedTimestamp = strtotime($dateString);
|
||||
if ($lastModifiedTimestamp > $lastModifiedTime) {
|
||||
# echo "Remote file is newer. Load it!<br>\n";
|
||||
} else {
|
||||
# echo "Not modified since last request. No update needed.<br>\n";
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Save the content if it was successfully retrieved
|
||||
if ($response !== false) {
|
||||
file_put_contents($cacheFilePath, $response);
|
||||
#echo "File updated successfully.\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue