-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgrpc-example.php
More file actions
114 lines (89 loc) · 2.87 KB
/
grpc-example.php
File metadata and controls
114 lines (89 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php
declare(strict_types=1);
/**
* gRPC transport example for the Spooled PHP SDK.
*
* Requirements:
* - ext-grpc (pecl install grpc)
* - ext-protobuf (pecl install protobuf)
* - composer require grpc/grpc google/protobuf
*/
require_once __DIR__ . '/../vendor/autoload.php';
use Spooled\SpooledClient;
use Spooled\Config\ClientOptions;
use Spooled\Grpc\SpooledGrpcClient;
use Spooled\Grpc\GrpcOptions;
// Check if gRPC is available
if (!SpooledGrpcClient::isAvailable()) {
echo "gRPC support requires ext-grpc and ext-protobuf extensions.\n";
echo "Install with: pecl install grpc protobuf\n";
exit(1);
}
// Method 1: Create gRPC client via main client
$client = new SpooledClient(new ClientOptions(
apiKey: getenv('API_KEY') ?: 'your-api-key',
baseUrl: getenv('BASE_URL') ?: 'https://api.spooled.cloud',
grpcAddress: getenv('GRPC_ADDRESS') ?: 'grpc.spooled.cloud:443',
));
try {
// Get gRPC client (lazy initialized)
$grpc = $client->grpc();
// Wait for connection
$grpc->waitForReady();
echo "gRPC connected!\n";
// Enqueue via gRPC (faster than REST for high throughput)
$result = $grpc->queue->enqueue([
'queueName' => 'grpc-test-queue',
'payload' => [
'message' => 'Hello from gRPC!',
'timestamp' => time(),
],
'priority' => 5,
]);
echo "Created job via gRPC: {$result['jobId']}\n";
// Get queue stats via gRPC
$stats = $grpc->queue->getStats([
'queueName' => 'grpc-test-queue',
]);
echo "Queue stats - pending: {$stats['pending']}, completed: {$stats['completed']}\n";
// Close gRPC connection
$grpc->close();
echo "gRPC connection closed.\n";
} catch (\Throwable $e) {
echo "Error: {$e->getMessage()}\n";
exit(1);
}
// Method 2: Create standalone gRPC client
echo "\n--- Standalone gRPC client ---\n";
$grpcClient = new SpooledGrpcClient(new GrpcOptions(
address: getenv('GRPC_ADDRESS') ?: 'grpc.spooled.cloud:443',
apiKey: getenv('API_KEY') ?: 'your-api-key',
secure: true,
));
try {
$grpcClient->waitForReady();
// Register a worker via gRPC
$worker = $grpcClient->workers->register([
'queueName' => 'grpc-test-queue',
'hostname' => gethostname(),
'concurrency' => 5,
]);
echo "Registered worker via gRPC: {$worker['workerId']}\n";
// Send heartbeat
$heartbeat = $grpcClient->workers->heartbeat([
'workerId' => $worker['workerId'],
'currentJobs' => 0,
'status' => 'idle',
]);
echo "Heartbeat acknowledged: " . ($heartbeat['acknowledged'] ? 'yes' : 'no') . "\n";
// Deregister worker
$grpcClient->workers->deregister([
'workerId' => $worker['workerId'],
]);
echo "Worker deregistered.\n";
} catch (\Throwable $e) {
echo "Error: {$e->getMessage()}\n";
} finally {
$grpcClient->close();
}
echo "\nDone!\n";