aboutsummaryrefslogtreecommitdiffhomepage
path: root/application/feed/CachedPage.php
blob: c23c200f3370869b952cc681daf98cfc456c4666 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php

declare(strict_types=1);

namespace Shaarli\Feed;

use DatePeriod;

/**
 * Simple cache system, mainly for the RSS/ATOM feeds
 */
class CachedPage
{
    /** Directory containing page caches */
    protected $cacheDir;

    /** Should this URL be cached (boolean)? */
    protected $shouldBeCached;

    /** Name of the cache file for this URL */
    protected $filename;

    /** @var DatePeriod|null Optionally specify a period of time for cache validity */
    protected $validityPeriod;

    /**
     * Creates a new CachedPage
     *
     * @param string      $cacheDir       page cache directory
     * @param string      $url            page URL
     * @param bool        $shouldBeCached whether this page needs to be cached
     * @param ?DatePeriod $validityPeriod Optionally specify a time limit on requested cache
     */
    public function __construct($cacheDir, $url, $shouldBeCached, ?DatePeriod $validityPeriod)
    {
        // TODO: check write access to the cache directory
        $this->cacheDir = $cacheDir;
        $this->filename = $this->cacheDir . '/' . sha1($url) . '.cache';
        $this->shouldBeCached = $shouldBeCached;
        $this->validityPeriod = $validityPeriod;
    }

    /**
     * Returns the cached version of a page, if it exists and should be cached
     *
     * @return string a cached version of the page if it exists, null otherwise
     */
    public function cachedVersion()
    {
        if (!$this->shouldBeCached) {
            return null;
        }
        if (!is_file($this->filename)) {
            return null;
        }
        if ($this->validityPeriod !== null) {
            $cacheDate = \DateTime::createFromFormat('U', (string) filemtime($this->filename));
            if (
                $cacheDate < $this->validityPeriod->getStartDate()
                || $cacheDate > $this->validityPeriod->getEndDate()
            ) {
                return null;
            }
        }

        return file_get_contents($this->filename);
    }

    /**
     * Puts a page in the cache
     *
     * @param string $pageContent XML content to cache
     */
    public function cache($pageContent)
    {
        if (!$this->shouldBeCached) {
            return;
        }
        file_put_contents($this->filename, $pageContent);
    }
}