-
-
Save nyamsprod/e5498e3547e61c4bb698b787c400ddb0 to your computer and use it in GitHub Desktop.
Caching Pdp classes using the filesystem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
declare(strict_types=1); | |
use Pdp\Storage\PublicSuffixListCache; | |
use Pdp\PublicSuffixList; | |
final class FilesystemCache implements PublicSuffixListCache | |
{ | |
public function __construct( | |
private DateInterval $ttl, | |
private string $cacheDirectory, | |
private string $cachePrefix = '' | |
) { | |
} | |
private function getCacheFilePath(string $uri): string | |
{ | |
return $this->cacheDirectory.DIRECTORY_SEPARATOR.$this->cachePrefix.sha1($uri).'.php'; | |
} | |
public function fetch(string $uri): ?PublicSuffixList | |
{ | |
$path = $this->getCacheFilePath($uri); | |
if (!is_readable($path)) { | |
return null; | |
} | |
$fileValidUntil = (new DateTimeImmutable('@'.filemtime($path)))->add($this->ttl); | |
$now = new DateTimeImmutable('NOW', new DateTimeZone('UTC')); | |
if ($fileValidUntil < $now) { | |
$this->forget($uri); | |
return null; | |
} | |
$rules = require $path; | |
if (!$rules instanceof PublicSuffixList) { | |
$this->forget($uri); | |
return null; | |
} | |
return $rules; | |
} | |
public function remember(string $uri, PublicSuffixList $publicSuffixList): bool | |
{ | |
$path = $this->getCacheFilePath($uri); | |
$data = '<?php' . PHP_EOL . 'return '. var_export($publicSuffixList, true) . ';'; | |
$result = false !== file_put_contents($path, $data); | |
if ($result && function_exists('opcache_invalidate')) { | |
opcache_invalidate($path); | |
} | |
return $result; | |
} | |
public function forget(string $uri): bool | |
{ | |
return @unlink($this->getCacheFilePath($uri)); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
declare(strict_types=1); | |
use Pdp\PublicSuffixList; | |
use Pdp\Rules; | |
use Pdp\Storage\PublicSuffixListClient; | |
final class PHPStreamClient implements PublicSuffixListClient | |
{ | |
/** | |
* @param resource|null $context | |
*/ | |
public function __construct(private $context = null) | |
{ | |
} | |
public function get(string $uri): PublicSuffixList | |
{ | |
return Rules::fromPath($uri, $this->context); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require 'vendor/autoload.php'; | |
require 'PublicSuffixListOpCache.php'; | |
require 'PublicSuffixListStreamClient.php'; | |
use Pdp\Storage\RulesStorage; | |
use Pdp\ResourceUri; | |
$pslStorage = new RulesStorage( | |
new FilesystemCache(new DateInterval('P1D'), __DIR__.'/storage', 'psl'), | |
new PHPStreamClient() | |
); | |
$rules = $pslStorage->get(ResourceUri::PUBLIC_SUFFIX_LIST_URI); | |
echo $rules->getCookieDomain('ulb.ac.be')->value(), PHP_EOL; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment