Skip to content

Instantly share code, notes, and snippets.

@nyamsprod
Last active July 20, 2021 21:32
Show Gist options
  • Save nyamsprod/e5498e3547e61c4bb698b787c400ddb0 to your computer and use it in GitHub Desktop.
Save nyamsprod/e5498e3547e61c4bb698b787c400ddb0 to your computer and use it in GitHub Desktop.
Caching Pdp classes using the filesystem
<?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));
}
}
<?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);
}
}
<?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