class MemoryQueue in Purge 8.3
A QueueInterface compliant volatile memory buffer queue.
@warning This queue does not extend core's Memory queue on purpose, as it does not suit extending it very well nor does its lease time handling work.
Plugin annotation
@PurgeQueue(
id = "memory",
label = @Translation("Memory"),
description = @Translation("A non-persistent, per-request memory queue (not useful on production systems)."),
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\purge\Plugin\Purge\Queue\QueueBase implements QueueInterface uses QueueBasePageTrait
- class \Drupal\purge\Plugin\Purge\Queue\MemoryQueue implements QueueInterface
- class \Drupal\purge\Plugin\Purge\Queue\QueueBase implements QueueInterface uses QueueBasePageTrait
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of MemoryQueue
3 files declare their use of MemoryQueue
- AQueue.php in tests/
modules/ purge_queue_test/ src/ Plugin/ Purge/ Queue/ AQueue.php - BQueue.php in tests/
modules/ purge_queue_test/ src/ Plugin/ Purge/ Queue/ BQueue.php - CQueue.php in tests/
modules/ purge_queue_test/ src/ Plugin/ Purge/ Queue/ CQueue.php
File
- src/
Plugin/ Purge/ Queue/ MemoryQueue.php, line 18
Namespace
Drupal\purge\Plugin\Purge\QueueView source
class MemoryQueue extends QueueBase implements QueueInterface {
/**
* Whether the buffer has been initialized or not.
*
* @var bool
*/
protected $bufferInitialized;
/**
* The internal buffer where all data is copied in.
*
* @var array[]
*/
protected $buffer;
/**
* Define constants for the array indiced in our buffer.
*/
const DATA = 0;
const EXPIRE = 1;
const CREATED = 2;
/**
* Initialize the buffer.
*/
private function bufferInitialize() {
if (!$this->bufferInitialized) {
$this->bufferInitialized = TRUE;
$this->buffer = [];
}
}
/**
* {@inheritdoc}
*/
public function createItem($data) {
$this
->bufferInitialize();
end($this->buffer);
$id = key($this->buffer) + 1;
$this->buffer[$id] = [
self::DATA => serialize($data),
self::EXPIRE => 0,
self::CREATED => time(),
];
return $id;
}
/**
* {@inheritdoc}
*/
public function createItemMultiple(array $items) {
$this
->bufferInitialize();
end($this->buffer);
$id = key($this->buffer) + 1;
$ids = [];
foreach ($items as $data) {
$this->buffer[$id] = [
self::DATA => serialize($data),
self::EXPIRE => 0,
self::CREATED => time(),
];
$ids[] = $id;
$id++;
}
return $ids;
}
/**
* {@inheritdoc}
*/
public function numberOfItems() {
$this
->bufferInitialize();
return count($this->buffer);
}
/**
* {@inheritdoc}
*/
public function claimItem($lease_time = 3600, $id = NULL) {
if ($id == NULL) {
$this
->bufferInitialize();
reset($this->buffer);
$id = key($this->buffer);
}
if (empty($this->buffer)) {
return FALSE;
}
if (!isset($this->buffer[$id])) {
return FALSE;
}
if ($this->buffer[$id][self::EXPIRE] === 0 || $this->buffer[$id][self::EXPIRE] !== 0 && time() > $this->buffer[$id][self::EXPIRE]) {
$this->buffer[$id][self::EXPIRE] = time() + $lease_time;
$item = new \stdClass();
$item->item_id = $id;
$item->data = unserialize($this->buffer[$id][self::DATA]);
$item->expire = $this->buffer[$id][self::EXPIRE];
$item->created = $this->buffer[$id][self::CREATED];
return $item;
}
else {
$id++;
return $this
->claimItem($lease_time, $id);
}
}
/**
* {@inheritdoc}
*/
public function claimItemMultiple($claims = 10, $lease_time = 3600) {
$items = [];
for ($i = 1; $i <= $claims; $i++) {
if (($item = $this
->claimItem($lease_time, NULL)) === FALSE) {
break;
}
$items[] = $item;
}
return $items;
}
/**
* {@inheritdoc}
*/
public function releaseItem($item) {
$this
->bufferInitialize();
if (!isset($this->buffer[$item->item_id])) {
return FALSE;
}
$this->buffer[$item->item_id][self::EXPIRE] = 0;
if ($item->data !== $this->buffer[$item->item_id][self::DATA]) {
$this->buffer[$item->item_id][self::DATA] = serialize($item->data);
}
return TRUE;
}
/**
* {@inheritdoc}
*/
public function releaseItemMultiple(array $items) {
$this
->bufferInitialize();
foreach ($items as $item) {
$this
->releaseItem($item);
}
return [];
}
/**
* {@inheritdoc}
*/
public function deleteItem($item) {
$this
->bufferInitialize();
if (!isset($this->buffer[$item->item_id])) {
return FALSE;
}
unset($this->buffer[$item->item_id]);
}
/**
* {@inheritdoc}
*/
public function deleteItemMultiple(array $items) {
$this
->bufferInitialize();
foreach ($items as $item) {
$this
->deleteItem($item);
}
}
/**
* {@inheritdoc}
*/
public function createQueue() {
$this
->bufferInitialize();
}
/**
* {@inheritdoc}
*/
public function deleteQueue() {
$this
->bufferInitialize();
$this->buffer = [];
}
/**
* {@inheritdoc}
*/
public function selectPage($page = 1) {
if ($page < 1 || !is_int($page)) {
throw new \LogicException('Parameter $page has to be a positive integer.');
}
$this
->bufferInitialize();
// Calculate the start and end of the IDs we're looking for and iterate.
$items = [];
$limit = $this
->selectPageLimit();
$start = ($page - 1) * $limit + 1;
$end = $page * $limit + 1;
for ($id = $start; $id < $end; $id++) {
if (!isset($this->buffer[$id])) {
break;
}
$item = new \stdClass();
$item->item_id = $id;
$item->data = unserialize($this->buffer[$id][self::DATA]);
$item->expire = $this->buffer[$id][self::EXPIRE];
$item->created = $this->buffer[$id][self::CREATED];
$items[] = $item;
}
return $items;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
MemoryQueue:: |
protected | property | The internal buffer where all data is copied in. | |
MemoryQueue:: |
protected | property | Whether the buffer has been initialized or not. | |
MemoryQueue:: |
private | function | Initialize the buffer. | 1 |
MemoryQueue:: |
public | function |
Claims an item in the queue for processing. Overrides QueueInterface:: |
|
MemoryQueue:: |
public | function |
Claims multiple items from the queue for processing. Overrides QueueBase:: |
|
MemoryQueue:: |
constant | |||
MemoryQueue:: |
public | function |
Adds a queue item and store it directly to the queue. Overrides QueueInterface:: |
|
MemoryQueue:: |
public | function |
Add multiple items to the queue and store them efficiently. Overrides QueueBase:: |
|
MemoryQueue:: |
public | function |
Creates a queue. Overrides QueueInterface:: |
|
MemoryQueue:: |
constant | Define constants for the array indiced in our buffer. | ||
MemoryQueue:: |
public | function |
Deletes a finished item from the queue. Overrides QueueInterface:: |
|
MemoryQueue:: |
public | function |
Delete multiple items from the queue at once. Overrides QueueBase:: |
|
MemoryQueue:: |
public | function |
Deletes a queue and every item in the queue. Overrides QueueInterface:: |
1 |
MemoryQueue:: |
constant | |||
MemoryQueue:: |
public | function |
Retrieves the number of items in the queue. Overrides QueueInterface:: |
|
MemoryQueue:: |
public | function |
Releases an item that the worker could not process. Overrides QueueInterface:: |
|
MemoryQueue:: |
public | function |
Release multiple items that the worker could not process. Overrides QueueBase:: |
|
MemoryQueue:: |
public | function |
Select a page of queue data with a limited number of items. Overrides QueueInterface:: |
|
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
PluginBase:: |
public | function | Constructs a \Drupal\Component\Plugin\PluginBase object. | 92 |
QueueBase:: |
public static | function |
Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: |
|
QueueBasePageTrait:: |
protected | property | The configured limit of items on selected data pages. | |
QueueBasePageTrait:: |
public | function | ||
QueueBasePageTrait:: |
public | function | ||
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |