Serverless-Funktionen in PHP: AWS Lambda Fortgeschrittenes Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Serverless-Funktionen in PHP: AWS Lambda — von der Theorie zur fortgeschrittenen Praxis

\n\n

Die Serverless-Architektur ist längst keine Exotik mehr, und PHP hat sich dank Tools wie Bref und Laravel Vapor selbstbewusst seine Nische in der Welt des serverlosen Rechnens erobert. In diesem Artikel behandeln wir fortgeschrittene Techniken für die Arbeit mit AWS Lambda in PHP: wie man den Kaltstart besiegt, die Arbeit innerhalb einer VPC einrichtet und Ereignisse von S3 und SQS effizient verarbeitet. Das Material richtet sich an Entwickler, die bereits mit den Grundlagen des Deployments von PHP-Anwendungen auf Lambda vertraut sind.

\n\n

1. Optimierung des Kaltstarts: von 2 Sekunden auf 200 Millisekunden

\n\n

Der Hauptfeind von Serverless-Anwendungen in PHP ist der Kaltstart. Im Gegensatz zu Node.js oder Python erfordert PHP das Laden des Interpreters und des Frameworks. So minimieren Sie Verzögerungen.

\n\n

1.1. Verwendung von Bref und vorab kompilierten Layern

\n\n

Bref ist der De-facto-Standard für die Ausführung von PHP auf Lambda. Es bietet vorgefertigte Layer mit PHP-Interpreter. Verwenden Sie zur Beschleunigung bref/extra-php-extensions und binden Sie nur die erforderlichen Erweiterungen ein.

\n\n

Beispiel einer grundlegenden serverless.yml-Konfiguration:

\n
service: my-php-app\n\nprovider:\n  name: aws\n  runtime: provided.al2\n  region: eu-central-1\n\nplugins:\n  - ./vendor/bref/bref\n\nfunctions:\n  api:\n    handler: public/index.php\n    layers:\n      - ${bref:layer.php-81}\n    events:\n      - httpApi: '*'\n
\n\n

1.2. Lazy Loading und Caching von Konfigurationen

\n\n

Laden Sie nicht das gesamte Framework (Laravel, Symfony) bei jeder Anfrage. Verwenden Sie Laravel Octane mit Swoole oder RoadRunner, aber für Lambda ist Bref Laravel Bridge besser geeignet, das Konfigurationen und Routen cached.

\n\n

Code zum Caching der Konfiguration in bootstrap.php:

\n
// public/index.php (Einstiegspunkt für Lambda)\nrequire_once __DIR__ . '/../vendor/autoload.php';\n\n$app = require_once __DIR__ . '/../bootstrap/app.php';\n\n// Konfiguration beim ersten Start cachen\nif (! file_exists(__DIR__ . '/../bootstrap/cache/config.php')) {\n    $app->make('config')->get('app');\n    // Kompilierte Konfiguration speichern\n    file_put_contents(\n        __DIR__ . '/../bootstrap/cache/config.php',\n        '<?php return ' . var_export($app->make('config')->all(), true) . ';'\n    );\n} else {\n    $config = require __DIR__ . '/../bootstrap/cache/config.php';\n    $app->instance('config', $config);\n}\n\n$kernel = $app->make(Illuminate\\Contracts\\Http\\Kernel::class);\n$response = $kernel->handle(\n    $request = Illuminate\\Http\\Request::capture()\n);\n$response->send();\n$kernel->terminate($request, $response);\n
\n\n

Tipp: Setzen Sie memorySize auf 1024 MB und timeout auf 30 Sekunden für ein ausgewogenes Verhältnis von Geschwindigkeit und Kosten. Mehr Speicher bedeutet einen schnelleren Prozessor.

\n\n

2. Arbeit mit VPC: Verbindung zu RDS und ElastiCache

\n\n

Lambda-Funktionen arbeiten standardmäßig außerhalb Ihrer VPC. Für den Zugriff auf Datenbanken (RDS, Aurora) oder Caches (ElastiCache) muss die Funktion innerhalb der VPC platziert werden. Dies erhöht die Komplexität und verlängert den Kaltstart um 5-10 Sekunden.

\n\n

2.1. VPC-Konfiguration in serverless.yml

\n\n
functions:\n  processUser:\n    handler: src/handlers/userHandler.php\n    layers:\n      - ${bref:layer.php-81}\n    vpc:\n      securityGroupIds:\n        - sg-0123456789abcdef0\n      subnetIds:\n        - subnet-abc123\n        - subnet-def456\n    events:\n      - sqs:\n          arn: arn:aws:sqs:eu-central-1:123456789012:user-queue\n
\n\n

2.2. Verwaltung von Verbindungen über PDO

\n\n

Verwenden Sie RDS Proxy oder ElastiCache für die Wiederverwendung von Verbindungen innerhalb eines einzelnen Lambda-Containers.

\n\n

Beispiel einer Klasse für die Datenbankarbeit mit wiederverwendbaren

Blogs

Buchempfehlungen