| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | <?phpnamespace 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;    }}
 |