PHP पर सर्वरलेस फ़ंक्शन: AWS Lambda — सिद्धांत से उन्नत अभ्यास तक
\n\nसर्वरलेस आर्किटेक्चर लंबे समय से एक विदेशी अवधारणा नहीं रही है, और PHP ने Bref और Laravel Vapor जैसे टूल्स की बदौलत सर्वर रहित कंप्यूटिंग की दुनिया में अपनी जगह मजबूती से बना ली है। इस लेख में, हम AWS Lambda पर PHP के साथ काम करने की उन्नत तकनीकों पर चर्चा करेंगे: कोल्ड स्टार्ट को कैसे हराया जाए, VPC के अंदर काम कैसे सेट किया जाए, और S3 और SQS से इवेंट को प्रभावी ढंग से कैसे संसाधित किया जाए। यह सामग्री उन डेवलपर्स के लिए है जो Lambda पर PHP एप्लिकेशन डिप्लॉय करने की मूल बातों से पहले से परिचित हैं।
\n\n1. कोल्ड स्टार्ट ऑप्टिमाइज़ेशन: 2 सेकंड से 200 मिलीसेकंड तक
\n\nPHP पर सर्वरलेस एप्लिकेशन का मुख्य दुश्मन कोल्ड स्टार्ट है। Node.js या Python के विपरीत, PHP को इंटरप्रेटर और फ्रेमवर्क लोड करने की आवश्यकता होती है। यहां देरी को कम करने का तरीका बताया गया है।
\n\n1.1. Bref और पूर्व-संकलित लेयर्स का उपयोग
\n\nBref Lambda पर PHP चलाने के लिए डी-फैक्टो मानक है। यह PHP इंटरप्रेटर के साथ तैयार लेयर्स प्रदान करता है। गति बढ़ाने के लिए bref/extra-php-extensions का उपयोग करें और केवल आवश्यक एक्सटेंशन शामिल करें।
serverless.yml का मूल कॉन्फ़िगरेशन उदाहरण:
\nservice: 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\n1.2. आलसी लोडिंग और कॉन्फ़िगरेशन कैशिंग
\n\nप्रत्येक अनुरोध पर पूरे फ्रेमवर्क (Laravel, Symfony) को लोड न करें। Swoole या RoadRunner के साथ Laravel Octane का उपयोग करें, लेकिन Lambda के लिए Bref Laravel Bridge बेहतर है, जो कॉन्फ़िग और रूट्स को कैश करता है।
\n\nbootstrap.php में कॉन्फ़िगरेशन कैशिंग के लिए कोड:
\n// public/index.php (Lambda के लिए एंट्री पॉइंट)\nrequire_once __DIR__ . '/../vendor/autoload.php';\n\n$app = require_once __DIR__ . '/../bootstrap/app.php';\n\n// पहले रन पर कॉन्फ़िगरेशन कैश करें\nif (! file_exists(__DIR__ . '/../bootstrap/cache/config.php')) {\n $app->make('config')->get('app');\n // संकलित कॉन्फ़िग सेव करें\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सुझाव: गति और लागत के संतुलन के लिए memorySize को 1024 MB और timeout को 30 सेकंड पर सेट करें। अधिक मेमोरी का मतलब तेज़ प्रोसेसर है।
2. VPC के साथ कार्य: RDS और ElastiCache से कनेक्शन
\n\nLambda फ़ंक्शन डिफ़ॉल्ट रूप से आपकी VPC के बाहर काम करते हैं। डेटाबेस (RDS, Aurora) या कैश (ElastiCache) तक पहुंचने के लिए, फ़ंक्शन को VPC के अंदर रखना आवश्यक है। यह जटिलता बढ़ाता है और कोल्ड स्टार्ट को 5-10 सेकंड तक बढ़ा देता है।
\n\n2.1. serverless.yml में VPC कॉन्फ़िगरेशन
\n\nfunctions:\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\n2.2. PDO के माध्यम से कनेक्शन प्रबंधन
\n\nएक Lambda कंटेनर के अंदर कनेक्शन के पुन: उपयोग के लिए RDS Proxy कनेक्शन पूल या ElastiCache का उपयोग करें।
\n\nपुन: उपयोग के साथ DB कार्य के लिए क्लास का उदाहरण: