MadelineProto is built on AMPHP, a modern asynchronous PHP framework that enables non-blocking I/O operations. This allows your bot to handle thousands of concurrent operations efficiently.
MadelineProto v8 uses AMPHP v3 and Revolt event loop for all asynchronous operations.
Traditional synchronous code blocks on I/O operations:
// Synchronous (blocking)$result1 = $api->messages->sendMessage(...); // Wait$result2 = $api->messages->sendMessage(...); // Wait$result3 = $api->messages->sendMessage(...); // Wait// Total time: 3x request time
Asynchronous code runs operations concurrently:
// Asynchronous (non-blocking)use function Amp\Future\await;use function Amp\async;$futures = [ async($api->messages->sendMessage(...)), async($api->messages->sendMessage(...)), async($api->messages->sendMessage(...)),];$results = await($futures);// Total time: ~1x request time
use function Amp\Future\await;use function Amp\async;// Run multiple operations concurrently$futures = [ async($this->messages->sendMessage(...)), async($this->messages->sendMessage(...)), async($this->messages->sendMessage(...)),];// Wait for all to complete$results = await($futures);
use Amp\DeferredFuture;$deferred = new DeferredFuture;$future = $deferred->getFuture();// Later, resolve it$deferred->complete($value);// Or reject it$deferred->error(new Exception('Failed'));
use Revolt\EventLoop;// Execute after delay (in seconds)$callbackId = EventLoop::delay(5.0, function() { $this->logger("Delayed callback executed");});// Cancel if neededEventLoop::cancel($callbackId);
use Revolt\EventLoop;// Execute every N seconds$callbackId = EventLoop::repeat(10.0, function() { $this->logger("Periodic callback executed");});// Cancel when doneEventLoop::cancel($callbackId);
For periodic tasks in event handlers, use the #[Cron] attribute instead of manual EventLoop::repeat().
All event handler methods run within the event loop context:
class MyEventHandler extends SimpleEventHandler{ #[FilterCommand('test')] public function testCommand(Message $message): void { // Already in event loop context // All API calls are automatically async $result = $this->messages->sendMessage( peer: $message->chatId, message: 'Response' ); }}
#[Handler]public function handleMessage(Incoming&Message $message): void{ // Each message is handled in its own fiber // Multiple messages are processed simultaneously // This won't block other message handlers $this->sleep(5); $message->reply('Done!');}