Brand

DataStax PHP Driver

Attention: Viewing documentation for version
Download
since cassadra v2.1

Client-side timestamps

Cassandra uses timestamps to serialize write operations. That is, values with more current timestamps are considered to be the most up-to-date version of that information. By default, timestamps are assigned by Cassandra on the server-side (Cassandra\TimestampGenerator\ServerSide()). The PHP Driver also allows for timestamps to be assigned client-side in two ways:

  • By providing a client-side timestamp generator such as Cassandra\TimestampGenerator\Monotonic().
  • Explicitly assigning a ‘timestamp’ when executing a statement or batch using Cassandra\ExecutionOptions.

Background

Given
a running Cassandra cluster
And
the following schema:
CREATE KEYSPACE simplex WITH replication = {
 'class': 'SimpleStrategy',
 'replication_factor': 1
};
USE simplex;
CREATE TABLE playlists (
 id uuid,
 title text,
 album text,
 artist text,
 song_id uuid,
 PRIMARY KEY (id, title, album, artist)
);

Create a simple statement with a client-side timestamp

Given
the following example:
<?php
$cluster = Cassandra::cluster()
 ->withContactPoints('127.0.0.1')
 ->build();
$session = $cluster->connect("simplex");
$simple = new Cassandra\SimpleStatement(
 "INSERT INTO playlists (id, song_id, artist, title, album) " .
 "VALUES (62c36092-82a1-3a00-93d1-46196ee77204, ?, ?, ?, ?)"
 );
$arguments = array(
 'song_id' => new Cassandra\Uuid('756716f7-2e54-4715-9f00-91dcbea6cf50'),
 'title' => 'La Petite Tonkinoise',
 'album' => 'Bye Bye Blackbird',
 'artist' => 'Joséphine Baker'
);
$options = new Cassandra\ExecutionOptions(array(
 'arguments' => $arguments,
 'timestamp' => 1234
));
$session->execute($simple, $options);
$statement = new Cassandra\SimpleStatement(
 "SELECT artist, title, album, WRITETIME(song_id) FROM simplex.playlists");
$result = $session->execute($statement);
foreach ($result as $row) {
 echo $row['artist'] . ": " . $row['title'] . " / " . $row['album'] . " (". $row['writetime(song_id)'] . ")\n";
}
When
it is executed
Then
its output should contain:
Joséphine Baker: La Petite Tonkinoise / Bye Bye Blackbird (1234)

Create a batch with a client-side timestamp

Given
the following example:
<?php
$cluster = Cassandra::cluster()
 ->withContactPoints('127.0.0.1')
 ->build();
$session = $cluster->connect("simplex");
$prepared = $session->prepare(
 "INSERT INTO playlists (id, song_id, artist, title, album) " .
 "VALUES (62c36092-82a1-3a00-93d1-46196ee77204, ?, ?, ?, ?)"
 );
$simple = new Cassandra\SimpleStatement(
 "INSERT INTO playlists (id, song_id, artist, title, album) " .
 "VALUES (62c36092-82a1-3a00-93d1-46196ee77204, ?, ?, ?, ?)"
 );
$batch = new Cassandra\BatchStatement(Cassandra::BATCH_LOGGED);
$batch->add($prepared, array(
 'song_id' => new Cassandra\Uuid('756716f7-2e54-4715-9f00-91dcbea6cf50'),
 'title' => 'La Petite Tonkinoise',
 'album' => 'Bye Bye Blackbird',
 'artist' => 'Joséphine Baker'
));
$batch->add($simple, array(
 new Cassandra\Uuid('f6071e72-48ec-4fcb-bf3e-379c8a696488'),
 'Willi Ostermann', 'Die Mösch', 'In Gold',
));
$batch->add($prepared, array(
 new Cassandra\Uuid('fbdf82ed-0063-4796-9c7c-a3d4f47b4b25'),
 'Mick Jager', 'Memo From Turner', 'Performance'
));
$options = new Cassandra\ExecutionOptions(array("timestamp" => 5678));
$session->execute($batch, $options);
$statement = new Cassandra\SimpleStatement(
 "SELECT artist, title, album, WRITETIME(song_id) FROM simplex.playlists");
$result = $session->execute($statement);
foreach ($result as $row) {
 echo $row['artist'] . ": " . $row['title'] . " / " . $row['album'] . " (". $row['writetime(song_id)'] . ")\n";
}
When
it is executed
Then
its output should contain:
Joséphine Baker: La Petite Tonkinoise / Bye Bye Blackbird (5678)
And
its output should contain:
Willi Ostermann: Die Mösch / In Gold (5678)
And
its output should contain:
Mick Jager: Memo From Turner / Performance (5678)

Create a new session using a timestamp generator

Given
the following example:
<?php
$cluster = Cassandra::cluster()
 ->withContactPoints('127.0.0.1')
 ->withTimestampGenerator(new Cassandra\TimestampGenerator\Monotonic())
 ->build();
$session = $cluster->connect("simplex");
$simple = new Cassandra\SimpleStatement(
 "INSERT INTO playlists (id, song_id, artist, title, album) " .
 "VALUES (62c36092-82a1-3a00-93d1-46196ee77204, ?, ?, ?, ?)"
 );
for ($i = 0; $i < 10; $i++) {
 $arguments = array(
 'song_id' => new Cassandra\Uuid("756716f7-2e54-4715-9f00-91dcbea6cf5$i"),
 'title' => 'La Petite Tonkinoise',
 'album' => 'Bye Bye Blackbird',
 'artist' => 'Joséphine Baker'
 );
 $options = new Cassandra\ExecutionOptions(array(
 'arguments' => $arguments,
 'timestamp' => 1234
 ));
 $session->execute($simple, $options);
}
$statement = new Cassandra\SimpleStatement(
 "SELECT artist, title, album, song_id FROM simplex.playlists");
$result = $session->execute($statement);
foreach ($result as $row) {
 echo $row['artist'] . ": " . $row['title'] . " / " . $row['album'] . " (". $row['song_id'] . ")\n";
}
When
it is executed
Then
its output should contain:
Joséphine Baker: La Petite Tonkinoise / Bye Bye Blackbird (756716f7-2e54-4715-9f00-91dcbea6cf59)

AltStyle によって変換されたページ (->オリジナル) /