123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- <?php
- namespace Aws\DynamoDb;
- use Aws\DynamoDb\Exception\DynamoDbException;
- /**
- * The standard connection performs the read and write operations to DynamoDB.
- */
- class StandardSessionConnection implements SessionConnectionInterface
- {
- use SessionConnectionConfigTrait;
-
- /** @var DynamoDbClient The DynamoDB client */
- protected $client;
-
- /**
- * @param DynamoDbClient $client DynamoDB client
- * @param array $config Session handler config
- */
- public function __construct(DynamoDbClient $client, array $config = [])
- {
- $this->client = $client;
- $this->initConfig($config);
- }
- public function read($id)
- {
- $item = [];
- try {
- // Execute a GetItem command to retrieve the item.
- $result = $this->client->getItem([
- 'TableName' => $this->getTableName(),
- 'Key' => $this->formatKey($id),
- 'ConsistentRead' => $this->isConsistentRead(),
- ]);
- // Get the item values
- $result = isset($result['Item']) ? $result['Item'] : [];
- foreach ($result as $key => $value) {
- $item[$key] = current($value);
- }
- } catch (DynamoDbException $e) {
- // Could not retrieve item, so return nothing.
- }
- return $item;
- }
- public function write($id, $data, $isChanged)
- {
- // Prepare the attributes
- $expires = time() + $this->getSessionLifetime();
- $attributes = [
- $this->getSessionLifetimeAttribute() => ['Value' => ['N' => (string) $expires]],
- 'lock' => ['Action' => 'DELETE'],
- ];
- if ($isChanged) {
- if ($data != '') {
- $type = $this->getDataAttributeType();
- if ($type == 'binary') {
- $attributes[$this->getDataAttribute()] = ['Value' => ['B' => $data]];
- } else {
- $attributes[$this->getDataAttribute()] = ['Value' => ['S' => $data]];
- }
- } else {
- $attributes[$this->getDataAttribute()] = ['Action' => 'DELETE'];
- }
- }
- // Perform the UpdateItem command
- try {
- return (bool) $this->client->updateItem([
- 'TableName' => $this->getTableName(),
- 'Key' => $this->formatKey($id),
- 'AttributeUpdates' => $attributes,
- ]);
- } catch (DynamoDbException $e) {
- return $this->triggerError("Error writing session $id: {$e->getMessage()}");
- }
- }
- public function delete($id)
- {
- try {
- return (bool) $this->client->deleteItem([
- 'TableName' => $this->getTableName(),
- 'Key' => $this->formatKey($id),
- ]);
- } catch (DynamoDbException $e) {
- return $this->triggerError("Error deleting session $id: {$e->getMessage()}");
- }
- }
- public function deleteExpired()
- {
- // Create a Scan iterator for finding expired session items
- $scan = $this->client->getPaginator('Scan', [
- 'TableName' => $this->getTableName(),
- 'AttributesToGet' => [$this->getHashKey()],
- 'ScanFilter' => [
- $this->getSessionLifetimeAttribute() => [
- 'ComparisonOperator' => 'LT',
- 'AttributeValueList' => [['N' => (string) time()]],
- ],
- 'lock' => [
- 'ComparisonOperator' => 'NULL',
- ]
- ],
- ]);
- // Create a WriteRequestBatch for deleting the expired items
- $batch = new WriteRequestBatch($this->client, $this->getBatchConfig());
- // Perform Scan and BatchWriteItem (delete) operations as needed
- foreach ($scan->search('Items') as $item) {
- $batch->delete(
- [$this->getHashKey() => $item[$this->getHashKey()]],
- $this->getTableName()
- );
- }
- // Delete any remaining items that were not auto-flushed
- $batch->flush();
- }
- /**
- * @param string $key
- *
- * @return array
- */
- protected function formatKey($key)
- {
- return [$this->getHashKey() => ['S' => $key]];
- }
- /**
- * @param string $error
- *
- * @return bool
- */
- protected function triggerError($error)
- {
- trigger_error($error, E_USER_WARNING);
- return false;
- }
- }
|