Skip to content

Commit 2e3c612

Browse files
committed
Refactor API class names for improved consistency and add comprehensive stress testing
- Rename AsyncHttp to Http for cleaner, more consistent API naming - Rename AsyncFile to File in helper functions and documentation - Add stress-mysqli.php for MySQLi-specific database stress testing with realistic e-commerce workflows - Add stress.php for AsyncPDO stress testing with concurrent user simulations - Add sample.php demonstrating AsyncPDO performance benchmarking - Add Http.php API class with fluent request builder pattern - Update all helper functions to use new class names - Add sample_http.php for HTTP API usage examples
1 parent a448294 commit 2e3c612

File tree

9 files changed

+1536
-214
lines changed

9 files changed

+1536
-214
lines changed

sample.php

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
<?php
2+
// fiberasync_benchmark_corrected.php
3+
4+
use Rcalicdan\FiberAsync\Api\AsyncPDO;
5+
use Rcalicdan\FiberAsync\PDO\DatabaseConfigFactory;
6+
use Rcalicdan\FiberAsync\Promise\Promise;
7+
8+
require 'vendor/autoload.php';
9+
10+
// Memory tracking function
11+
function getMemoryUsage() {
12+
return [
13+
'current' => memory_get_usage(true),
14+
'peak' => memory_get_peak_usage(true),
15+
'current_mb' => round(memory_get_usage(true) / 1024 / 1024, 2),
16+
'peak_mb' => round(memory_get_peak_usage(true) / 1024 / 1024, 2)
17+
];
18+
}
19+
20+
echo "=== FiberAsync MySQL Performance Benchmark ===\n\n";
21+
22+
$mysqlConfig = DatabaseConfigFactory::mysql([
23+
'host' => 'localhost',
24+
'database' => 'yo',
25+
'username' => 'hey',
26+
'password' => '1234',
27+
'port' => 3306,
28+
]);
29+
30+
AsyncPDO::init($mysqlConfig, 10);
31+
32+
echo "Warming up connection pool...\n";
33+
run(function () {
34+
await(AsyncPDO::query("SELECT 1"));
35+
});
36+
echo "Warmup completed.\n\n";
37+
38+
//===========================================
39+
// TEST 1: Simple Concurrent Queries
40+
//===========================================
41+
echo "TEST 1: Simple Concurrent Queries (5 queries)\n";
42+
echo "------------------------------------------------\n";
43+
44+
run(function () {
45+
$memoryStart = getMemoryUsage();
46+
$startTime = microtime(true);
47+
48+
$promises = [];
49+
for ($i = 1; $i <= 5; $i++) {
50+
$promises[] = AsyncPDO::query("SELECT $i as test_id, 'FiberAsync Test' as source")
51+
->then(function ($result) use ($i, $startTime) {
52+
$queryTime = microtime(true) - $startTime;
53+
echo "FiberAsync Query $i completed: " . number_format($queryTime * 1000, 1) . "ms\n";
54+
return $result;
55+
});
56+
}
57+
58+
$results = await(Promise::all($promises));
59+
$endTime = microtime(true);
60+
$memoryEnd = getMemoryUsage();
61+
62+
$totalTime = $endTime - $startTime;
63+
$qps = 5 / $totalTime;
64+
65+
echo "\nRESULTS:\n";
66+
echo "- Total Time: " . number_format($totalTime * 1000, 1) . "ms\n";
67+
echo "- QPS (Queries Per Second): " . number_format($qps, 2) . "\n";
68+
echo "- Memory Usage: {$memoryEnd['current_mb']}MB (Peak: {$memoryEnd['peak_mb']}MB)\n";
69+
echo "- Memory Increase: " . ($memoryEnd['current_mb'] - $memoryStart['current_mb']) . "MB\n\n";
70+
});
71+
72+
//===========================================
73+
// TEST 2: High Concurrency Test
74+
//===========================================
75+
echo "TEST 2: High Concurrency Test (20 queries)\n";
76+
echo "--------------------------------------------\n";
77+
78+
run(function () {
79+
$memoryStart = getMemoryUsage();
80+
$startTime = microtime(true);
81+
82+
$promises = [];
83+
for ($i = 1; $i <= 20; $i++) {
84+
$promises[] = AsyncPDO::query("SELECT $i as query_id, NOW() as timestamp");
85+
}
86+
87+
$results = await(Promise::all($promises));
88+
$endTime = microtime(true);
89+
$memoryEnd = getMemoryUsage();
90+
91+
$totalTime = $endTime - $startTime;
92+
$qps = 20 / $totalTime;
93+
94+
echo "RESULTS:\n";
95+
echo "- Total Time: " . number_format($totalTime * 1000, 1) . "ms\n";
96+
echo "- QPS (Queries Per Second): " . number_format($qps, 2) . "\n";
97+
echo "- Memory Usage: {$memoryEnd['current_mb']}MB (Peak: {$memoryEnd['peak_mb']}MB)\n";
98+
echo "- Memory Increase: " . ($memoryEnd['current_mb'] - $memoryStart['current_mb']) . "MB\n\n";
99+
});
100+
101+
//===========================================
102+
// TEST 3: Transaction Test
103+
//===========================================
104+
echo "TEST 3: Concurrent Transactions (4 transactions)\n";
105+
echo "-------------------------------------------------\n";
106+
107+
run(function () {
108+
// Setup test table
109+
await(AsyncPDO::execute("CREATE TABLE IF NOT EXISTS fiberasync_test (
110+
id INT AUTO_INCREMENT PRIMARY KEY,
111+
batch_id VARCHAR(50),
112+
name VARCHAR(100),
113+
value INT,
114+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
115+
)"));
116+
await(AsyncPDO::execute("TRUNCATE TABLE fiberasync_test"));
117+
118+
$memoryStart = getMemoryUsage();
119+
$startTime = microtime(true);
120+
121+
$promises = [];
122+
for ($i = 1; $i <= 4; $i++) {
123+
$promises[] = AsyncPDO::transaction(function ($pdo) use ($i, $startTime) {
124+
$transactionStart = microtime(true) - $startTime;
125+
echo "FiberAsync Transaction $i START: " . number_format($transactionStart * 1000, 1) . "ms\n";
126+
127+
for ($j = 1; $j <= 3; $j++) {
128+
$stmt = $pdo->prepare("INSERT INTO fiberasync_test (batch_id, name, value) VALUES (?, ?, ?)");
129+
$stmt->execute(["batch-$i", "FiberAsync-Record-$i-$j", $i * 100 + $j]);
130+
}
131+
132+
// Use your library's built-in delay function!
133+
delay(0.2); // 200ms delay
134+
135+
$transactionEnd = microtime(true) - $startTime;
136+
echo "FiberAsync Transaction $i END: " . number_format($transactionEnd * 1000, 1) . "ms\n";
137+
138+
return $i;
139+
});
140+
}
141+
142+
$results = await(Promise::all($promises));
143+
$endTime = microtime(true);
144+
$memoryEnd = getMemoryUsage();
145+
146+
$totalTime = $endTime - $startTime;
147+
$tps = 4 / $totalTime;
148+
149+
echo "\nRESULTS:\n";
150+
echo "- Total Time: " . number_format($totalTime * 1000, 1) . "ms\n";
151+
echo "- TPS (Transactions Per Second): " . number_format($tps, 2) . "\n";
152+
echo "- Memory Usage: {$memoryEnd['current_mb']}MB (Peak: {$memoryEnd['peak_mb']}MB)\n";
153+
echo "- Memory Increase: " . ($memoryEnd['current_mb'] - $memoryStart['current_mb']) . "MB\n\n";
154+
155+
// Verify transaction results
156+
$countResult = await(AsyncPDO::fetchValue("SELECT COUNT(*) FROM fiberasync_test"));
157+
echo "- Records Inserted: $countResult\n\n";
158+
});
159+
160+
//===========================================
161+
// TEST 4: Stress Test with Delays
162+
//===========================================
163+
echo "TEST 4: Stress Test with Processing Delays (10 queries)\n";
164+
echo "--------------------------------------------------------\n";
165+
166+
run(function () {
167+
$memoryStart = getMemoryUsage();
168+
$startTime = microtime(true);
169+
170+
$delays = [100, 200, 300, 150, 250, 180, 120, 350, 80, 400];
171+
$promises = [];
172+
173+
for ($i = 1; $i <= 10; $i++) {
174+
$delayMs = $delays[$i - 1];
175+
$promises[] = AsyncPDO::query("SELECT $i as query_id, '$delayMs' as delay_ms")
176+
->then(function ($result) use ($i, $delayMs, $startTime) {
177+
$queryStart = microtime(true) - $startTime;
178+
echo "FiberAsync Stress Query $i START: " . number_format($queryStart * 1000, 1) . "ms (delay: {$delayMs}ms)\n";
179+
180+
delay($delayMs / 1000.0);
181+
182+
$queryEnd = microtime(true) - $startTime;
183+
echo "FiberAsync Stress Query $i END: " . number_format($queryEnd * 1000, 1) . "ms\n";
184+
185+
return $result;
186+
});
187+
}
188+
189+
$results = await(Promise::all($promises));
190+
$endTime = microtime(true);
191+
$memoryEnd = getMemoryUsage();
192+
193+
$totalTime = $endTime - $startTime;
194+
$qps = 10 / $totalTime;
195+
196+
echo "\nRESULTS:\n";
197+
echo "- Total Time: " . number_format($totalTime * 1000, 1) . "ms\n";
198+
echo "- QPS (Queries Per Second): " . number_format($qps, 2) . "\n";
199+
echo "- Memory Usage: {$memoryEnd['current_mb']}MB (Peak: {$memoryEnd['peak_mb']}MB)\n";
200+
echo "- Memory Increase: " . ($memoryEnd['current_mb'] - $memoryStart['current_mb']) . "MB\n\n";
201+
202+
echo "Expected total delay time (sequential): " . array_sum($delays) . "ms\n";
203+
echo "Actual concurrent time should be ~" . max($delays) . "ms if truly concurrent\n";
204+
});
205+
206+
AsyncPDO::reset();
207+
208+
echo "=== FiberAsync MySQL Benchmark Complete ===\n";

sample_http.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
use Rcalicdan\FiberAsync\Api\AsyncHttp;
4+
5+
require 'vendor/autoload.php';
6+
7+
run(function () {
8+
http_get('https://jsonplaceholder.typicode.com/users/1')
9+
->then(function ($response) {
10+
echo $response->getBody()->getContents();
11+
})
12+
->catch(function ($error) {
13+
echo "Error: " . $error->getMessage();
14+
});
15+
});

src/Api/AsyncHttp.php

Lines changed: 0 additions & 169 deletions
This file was deleted.

0 commit comments

Comments
 (0)