Skip to content

Commit

Permalink
feat: add dynamodb object cache
Browse files Browse the repository at this point in the history
  • Loading branch information
carlalexander committed Mar 13, 2021
1 parent ed0d103 commit d26ca59
Show file tree
Hide file tree
Showing 41 changed files with 4,224 additions and 222 deletions.
24 changes: 24 additions & 0 deletions bootstrap.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

declare(strict_types=1);

/*
* This file is part of Ymir WordPress plugin.
*
* (c) Carl Alexander <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

if (version_compare(PHP_VERSION, '7.2', '<')) {
exit(sprintf('Ymir requires PHP 7.2 or higher. Your WordPress site is using PHP %s.', PHP_VERSION));
}

// Setup class autoloader
require_once dirname(__FILE__).'/src/Autoloader.php';
\Ymir\Plugin\Autoloader::register();

global $ymir;

$ymir = new \Ymir\Plugin\Plugin(__DIR__.'/ymir.php');
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
],
"require": {
"php": "^7.2 || ^8.0",
"ext-curl": "*",
"ext-json": "*"
},
"require-dev": {
Expand Down
3 changes: 2 additions & 1 deletion grumphp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ grumphp:
- 'src/Configuration'
- 'src/CloudStorage/CloudStorageStreamWrapper.php'
- 'src/Email/Email.php'
- 'src/EventManagement/EventManager.php'
- 'src/ObjectCache/AbstractPersistentObjectCache.php'
- 'src/Support/Collection.php'
- 'tests'
phpunit:
always_execute: true
Expand Down
232 changes: 232 additions & 0 deletions object-cache-api.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
<?php

declare(strict_types=1);

/*
* This file is part of Ymir WordPress plugin.
*
* (c) Carl Alexander <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

require_once __DIR__.'/bootstrap.php';

use Ymir\Plugin\ObjectCache\ObjectCacheInterface;
use Ymir\Plugin\ObjectCache\PersistentObjectCacheInterface;
use Ymir\Plugin\ObjectCache\PreloadedObjectCacheInterface;

/**
* Ymir object cache API.
*
* @link https://developer.wordpress.org/reference/classes/wp_object_cache
*/

/**
* Adds data to the cache, if the cache key doesn't already exist.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_add
*/
function wp_cache_add($key, $data,$group = '', $expire = 0): bool
{
global $wp_object_cache;

return $wp_object_cache->add(trim((string) $group) ?: 'default', (string) $key, $data, (int) $expire);
}

/**
* Adds a group or set of groups to the list of global groups.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_add_global_groups
*/
function wp_cache_add_global_groups($groups)
{
global $wp_object_cache;

$wp_object_cache->addGlobalGroups((array) $groups);
}

/**
* Adds a group or set of groups to the list of non-persistent groups.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_add_non_persistent_groups
*/
function wp_cache_add_non_persistent_groups($groups)
{
global $wp_object_cache;

$wp_object_cache->addNonPersistentGroups((array) $groups);
}

/**
* Closes the cache.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_close
*/
function wp_cache_close(): bool
{
global $wp_object_cache;

return $wp_object_cache->close();
}

/**
* Decrements numeric cache item's value.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_decr
*/
function wp_cache_decr($key, $offset = 1, $group = '')
{
global $wp_object_cache;

return $wp_object_cache->decrement(trim((string) $group) ?: 'default', (string) $key, (int) $offset);
}

/**
* Removes the cache contents matching key and group.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_delete
*/
function wp_cache_delete($key, $group = ''): bool
{
global $wp_object_cache;

return $wp_object_cache->delete(trim((string) $group) ?: 'default', (string) $key);
}

/**
* Removes all cache items.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_flush
*/
function wp_cache_flush(): bool
{
global $wp_object_cache;

return $wp_object_cache->flush();
}

/**
* Retrieves the cache contents from the cache by key and group.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_get
*/
function wp_cache_get($key, $group = '', $force = false, &$found = null)
{
global $wp_object_cache;

return $wp_object_cache->get(trim((string) $group) ?: 'default', (string) $key, (bool) $force, $found);
}

/**
* Retrieves multiple values from the cache in one call.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_get_multiple
*/
function wp_cache_get_multiple($keys, $group = '', $force = false): array
{
global $wp_object_cache;

return $wp_object_cache->getMultiple(trim((string) $group) ?: 'default', (array) $keys, (bool) $force);
}

/**
* Increment numeric cache item's value.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_incr
*/
function wp_cache_incr($key, $offset = 1, $group = '')
{
global $wp_object_cache;

return $wp_object_cache->increment(trim((string) $group) ?: 'default', (string) $key, (int) $offset);
}

/**
* Sets up Object Cache Global and assigns it.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_init
*/
function wp_cache_init()
{
global $wp_object_cache, $ymir;

try {
$objectCache = $ymir->getContainer()->get('ymir_object_cache');

if (!$objectCache instanceof ObjectCacheInterface) {
throw new RuntimeException('Object cache needs to implement ObjectCacheInterface');
} elseif ($objectCache instanceof PersistentObjectCacheInterface && !$objectCache->isAvailable()) {
throw new RuntimeException('Persistent object cache is unavailable');
}

$wp_object_cache = $objectCache;

if ($objectCache instanceof PreloadedObjectCacheInterface) {
$objectCache->load();
}
} catch (Exception $exception) {
$wp_object_cache = $ymir->getContainer()->get('wordpress_object_cache');
}

}

/**
* Replaces the contents of the cache with new data.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_replace
*/
function wp_cache_replace($key, $data, $group = '', $expire = 0): bool
{
global $wp_object_cache;

return $wp_object_cache->replace(trim((string) $group) ?: 'default', (string) $key, $data, (int) $expire);
}

/**
* Reset internal cache keys and structures.
*
* If the cache back end uses global blog or site IDs as part of its cache keys,
* this function instructs the back end to reset those keys and perform any cleanup
* since blog or site IDs have changed since cache init.
*
* This function is deprecated. Use wp_cache_switch_to_blog() instead of this
* function when preparing the cache for a blog switch. For clearing the cache
* during unit tests, consider using wp_cache_init(). wp_cache_init() is not
* recommended outside of unit tests as the performance penalty for using it is
* high.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_reset
*/
function wp_cache_reset() {
_deprecated_function(__FUNCTION__, '3.5.0', 'WP_Object_Cache::reset()');
}

/**
* Saves the data to the cache.
*
* Differs from wp_cache_add() and wp_cache_replace() in that it will always write data.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_save
*/
function wp_cache_set($key, $data, $group = '', $expire = 0): bool
{
global $wp_object_cache;

return $wp_object_cache->set(trim((string) $group) ?: 'default', (string) $key, $data, (int) $expire);
}

/**
* Switches the internal blog ID.
*
* This changes the blog id used to create keys in blog specific groups.
*
* @link https://developer.wordpress.org/reference/functions/wp_cache_switch_to_blog
*/
function wp_cache_switch_to_blog($blogId)
{
global $wp_object_cache;

$wp_object_cache->switchToBlog((int) $blogId);
}
30 changes: 12 additions & 18 deletions src/CloudProvider/Aws/AbstractClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,20 @@

namespace Ymir\Plugin\CloudProvider\Aws;

use Ymir\Plugin\Http\Client;

/**
* Base AWS client.
*/
abstract class AbstractClient
{
/**
* The Ymir HTTP client.
*
* @var Client
*/
private $client;

/**
* The AWS API key.
*
Expand Down Expand Up @@ -46,19 +55,12 @@ abstract class AbstractClient
*/
private $securityToken;

/**
* The WordPress HTTP transport.
*
* @var \WP_Http
*/
private $transport;

/**
* Constructor.
*/
public function __construct(\WP_Http $transport, string $key, string $region, string $secret)
public function __construct(Client $client, string $key, string $region, string $secret)
{
$this->transport = $transport;
$this->client = $client;
$this->key = $key;
$this->region = $region;
$this->secret = $secret;
Expand Down Expand Up @@ -142,15 +144,7 @@ protected function request(string $method, string $uri, ?string $body = null, ar
$arguments['body'] = $body;
}

$response = $this->transport->request($this->createRequestUrl($uri), $arguments);

if ($response instanceof \WP_Error) {
throw new \RuntimeException($response->get_error_message());
} elseif (!is_array($response)) {
throw new \RuntimeException('Response must be an array');
}

return $response;
return $this->client->request($this->createRequestUrl($uri), $arguments);
}

/**
Expand Down
Loading

0 comments on commit d26ca59

Please sign in to comment.