This module uses ArangoDB as data storage for different services.
Feature | status |
---|---|
Cache backend | ✅ POC ready |
Queue core | ✅ POC ready |
Queue advanced | ✅ POC ready |
Logger | ✅ POC ready |
Lock | ✅ POC ready |
Flood | ✅ POC ready |
KeyValue | ✅ POC ready |
State | See KeyValue |
Session | not yet |
[SearchAPI server] | not yet |
Config entity storage | not yet |
Content entity storage | not yet |
Full database driver | not yet |
One or more connection can be defined. Usually the endpoint
and/or the
database
is the difference between these connections.
This parameter is used by the arangodb.connection_factory
service.
DRUPAL_ROOT/sites/*/services.arangodb.yml
parameters:
arangodb.connection_options:
default:
endpoint: 'tcp://127.0.0.1:8529'
Connection: 'Close'
timeout: 3
Reconnect: true
policy: 'last'
createCollection: false
AuthType: 'Basic'
AuthUser: 'me'
AuthPasswd: 'mySecret01'
database: 'cache'
Connection credentials (username/password) also can be defined as service parameters,
but easier to manage them in the settings.local.php
. See below.
Connection options defined in settings.local.php
have a higher priority over the ones
defined in services.*.yml#/parameters/arangodb.connection_options
.
DRUPAL_ROOT/sites/*/settings.local.php
use ArangoDBClient\ConnectionOptions as ArangoDbConnectionOptions;
use ArangoDBClient\DefaultValues as ArangoDbDefaultValues;
$settings['arangodb.connection_options'] = [
'default' => [
ArangoDbConnectionOptions::OPTION_ENDPOINT => getenv('APP_ARANGODB_CONNECTION_DEFAULT_ENDPOINT') ?: 'tcp://127.0.0.1:8529',
ArangoDbConnectionOptions::OPTION_AUTH_TYPE => ArangoDbDefaultValues::DEFAULT_AUTH_TYPE,
ArangoDbConnectionOptions::OPTION_AUTH_USER => getenv('APP_ARANGODB_CONNECTION_DEFAULT_USER') ?: getenv('USER'),
ArangoDbConnectionOptions::OPTION_AUTH_PASSWD => getenv('APP_ARANGODB_CONNECTION_DEFAULT_PASSWD') ?: 'admin',
ArangoDbConnectionOptions::OPTION_DATABASE => getenv('APP_ARANGODB_CONNECTION_DEFAULT_DATABASE') ?: $databases['default']['default']['database'],
],
];
Remaining tasks:
- tests
- documentation
settings.local.php
$settings['cache']['default'] = 'cache.backend.arangodb_default';
$settings['cache']['bins']['config'] = 'cache.backend.arangodb_no_serializer';
Remaining tasks:
- tests
- documentation
settings.local.php
$settings['queue_default'] = 'arangodb.queue_core.storage.shared';
$settings['queue_reliable_service_foo'] = 'arangodb.queue_core.storage.dedicated';
//$settings['queue_service_bar'] = 'arangodb.queue_core.storage.dedicated';
The integration is done by implementing an AdvancedQueue/Backend
plugin.
Logger in the arangodb
module isn't activated by default.
In order to activate the logger, the following line has to be added to the settings.local.php
.
settings.local.php
$settings['container_yamls']['arangodb.logger'] = 'modules/contrib/arangodb/arangodb.services.logger.yml';
To store locks with arangodb
module isn't activated by default.
In order to use ArangoDB as lock storage, the following line has to be added to the settings.local.php
.
settings.local.php
$settings['container_yamls']['arangodb.lock'] = 'modules/contrib/arangodb/arangodb.services.lock.yml';
To store flood events with arangodb
module isn't activated by default.
In order to use ArangoDB as flood event storage, the following line has to be added to the settings.local.php
.
settings.local.php
$settings['container_yamls']['arangodb.flood'] = 'modules/contrib/arangodb/arangodb.services.flood.yml';
Tasks:
- Basic implementation
- write more tests
ArangoDB module defines a few KeyValue factory services in the arangodb.services.yml
.
These service names can be listed by the following command:
yq eval \
'.services | keys | .[] | select(test("^arangodb\.keyvalue\.factory\."))' \
'arangodb.services.yml'
arangodb.keyvalue.factory.simple_shared_php
arangodb.keyvalue.factory.simple_shared_loafer
arangodb.keyvalue.factory.simple_dedicated_php
arangodb.keyvalue.factory.simple_dedicated_loafer
arangodb.keyvalue.factory.expirable_shared_php
arangodb.keyvalue.factory.expirable_shared_loafer
arangodb.keyvalue.factory.expirable_dedicated_php
arangodb.keyvalue.factory.expirable_dedicated_loafer
A „KeyValue collection” can be paired with a „KeyValue storage factory” in an additional services.*.yml
file.
parameters:
factory.keyvalue:
my_module_01_collection_01: 'arangodb.keyvalue.factory.simple_shared_php'
factory.keyvalue.expirable:
my_module_01_collection_02: 'arangodb.keyvalue.factory.expirable_shared_php'
Usage:
/** @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface $simple_storage */
$simple_storage = \Drupal::getContainer()
->get('keyvalue')
->get('my_module_01_collection_01');
$simple_storage->set('my_key_01', 'my_data_01');
/** @var \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface $expirable_storage */
$expirable_storage = \Drupal::getContainer()
->get('keyvalue.expirable')
->get('my_module_01_collection_02');
$expirable_storage->setWithExpire('my_key_02', 'my_data_02', 3600);
The „KeyValue collection” identifiers are defined by modules on demand.
There is no hook or any kind of API to get a list of the possible „KeyValue collection” identifiers.
A „KeyValue collection” which has no dedicated „KeyValue storage factory” will uses the default factory.
By default the default factory is keyvalue.database
.
See \Drupal\Core\KeyValueStore\KeyValueFactory::DEFAULT_SERVICE
.
The default factory can be changed in a services.*.yml
file.
parameters:
factory.keyvalue:
default: '<name of a keyvalue factory service>'
factory.keyvalue.expirable:
# https://www.drupal.org/project/drupal/issues/2769955
keyvalue_expirable_default: '<name of a keyvalue factory service>'
I am not sure if a KeyValue factory service from custom module works during the installation.
In the background State uses the KeyValue as storage backend.
The KeyValue collection name is state
.
@todo list
- Create an individual package
sweetchuck/php-session-arangodb
- PHP Session
- Symfony compatible session storage.
- Example implementation: symfony/http-foundation#/Session/Storage/Handler
- Framework (Drupal) independent.
- Drupal integration.
@todo
@todo
@todo