Installation:
composer require tarantool/client
For Decimal (Tarantool ≥2.3) and UUID support, install extensions:
pecl install decimal uuid
First Connection:
use Tarantool\Client\Client;
$client = Client::fromDsn('tcp://127.0.0.1:3301');
Or via defaults:
$client = Client::fromDefaults(); // Connects to 127.0.0.1:3301
First Query (Binary Protocol):
$space = $client->getSpace('users');
$result = $space->select(\Tarantool\Client\Criteria::key([1]));
print_r($result); // Returns [[1, "user_data"]]
First SQL Query (if enabled):
$result = $client->execute("SELECT * FROM users WHERE id = 1");
print_r($result);
persistent: true in options to avoid reconnecting:
$client = Client::fromOptions([
'uri' => 'tcp://127.0.0.1:3301',
'persistent' => true,
]);
$client = Client::fromDefaults()
->withMiddleware(new \Tarantool\Client\Middleware\AuthenticationMiddleware('user', 'pass'));
$client = Client::fromDefaults()
->withMiddleware(\Tarantool\Client\Middleware\RetryMiddleware::exponential(3));
$client = Client::fromDefaults()
->withMiddleware(new \Tarantool\Client\Middleware\LoggingMiddleware(new \Monolog\Logger('tarantool')));
// Create/Insert
$space->insert([1, 'data']);
// Read
$user = $space->select(\Tarantool\Client\Criteria::key([1]))[0];
// Update
$space->update([1], \Tarantool\Client\Operations::set(1, 'updated_data'));
// Delete
$space->delete([1]);
$space->select(\Tarantool\Client\Criteria::index('secondary')
->andKey(['value'])
->andLimit(10));
$result = $client->execute("SELECT * FROM users WHERE id = ?", [1]);
$client->beginTransaction();
try {
$client->execute("INSERT INTO users VALUES (?, ?)", [2, 'new_user']);
$client->commit();
} catch (\Exception $e) {
$client->rollback();
throw $e;
}
$space->insert([1, \Tarantool\Client\Decimal::fromString('123.45'), \Ramsey\Uuid\Uuid::uuid4()]);
try {
$client->execute("SELECT * FROM nonexistent");
} catch (\Tarantool\Client\Exception\CommunicationFailed $e) {
// Handle connection errors
} catch (\Tarantool\Client\Exception\RequestFailed $e) {
// Handle request errors (e.g., invalid query)
}
Middleware Order Matters:
RetryMiddleware before AuthenticationMiddleware ensures re-authentication on retry.$client->withMiddleware(
new \Tarantool\Client\Middleware\AuthenticationMiddleware('user', 'pass'),
\Tarantool\Client\Middleware\RetryMiddleware::linear()
);
Persistent Connections:
persistent: true may cause performance overhead in long-running apps due to repeated reconnects.'persistent' => env('APP_ENV') !== 'local',
SQL vs. Binary Protocol:
box.cfg{sql_enabled = true}).Decimal/UUID Extensions:
decimal or uuid extensions, operations on these types will fail with UnsupportedTypeException.Timeouts:
connect_timeout (5s) and socket_timeout (5s) may be too short for unreliable networks.'connect_timeout' => 10.0,
'socket_timeout' => 30.0,
Large Payloads:
max_input_vars or Tarantool’s msgpack limits.Enable Logging Middleware:
$client->withMiddleware(new \Tarantool\Client\Middleware\LoggingMiddleware(
new \Monolog\Logger('tarantool', ['handlers' => [new \Monolog\Handler\StreamHandler('php://stderr')]])
));
Check Connection State:
StreamConnection::isConnected() to verify active connections in middleware:
$client->withMiddleware(new class implements \Tarantool\Client\Middleware {
public function handle(\Tarantool\Client\Request $request, callable $next) {
if (!$request->getConnection()->isConnected()) {
throw new \RuntimeException("Connection lost!");
}
return $next($request);
}
});
Validate Tarantool Schema:
number field) cause silent failures.Operations::set('field_name', value) (Tarantool ≥2.3) for explicit field mapping.Handle Retry Exhaustion:
\Tarantool\Client\Middleware\RetryMiddleware::exponential(3, 100) // Max delay: 100ms
Custom Middleware:
\Tarantool\Client\Middleware to add features like:
$client->withMiddleware(new class implements \Tarantool\Client\Middleware {
public function handle(\Tarantool\Client\Request $request, callable $next) {
if ($request instanceof \Tarantool\Client\Request\CallRequest && $request->getFunction() === 'admin.ping') {
return new \Tarantool\Client\Response\SuccessResponse([['pong']]);
}
return $next($request);
}
});
Custom Packer/Unpacker:
PurePacker for custom serialization (e.g., Protobuf):
$packer = new class implements \Tarantool\Client\Packer {
public function pack(array $data) { /* ... */ }
public function unpack(string $data) { /* ... */ }
};
$client = new \Tarantool\Client\Client(new \Tarantool\Client\Handler\DefaultHandler(
$connection, $packer
));
DSN Parsing:
\Tarantool\Client\DsnParser to support custom URI schemes (e.g., tarantool://).Event Listeners:
Client::on() events (e.g., connect, disconnect) for lifecycle hooks:
$client->on('connect', function () {
\Log::info("Connected to Tarantool");
});
multi() for bulk inserts/updates:How can I help you explore Laravel packages today?