وظائف Serverless بلغة PHP: AWS Lambda — من النظرية إلى الممارسة المتقدمة
\n\nلم تعد بنية Serverless شيئًا غريبًا، وقد حجزت PHP، بفضل أدوات مثل Bref و Laravel Vapor، مكانتها بثقة في عالم الحوسبة بدون خوادم. في هذه المقالة، سنستعرض التقنيات المتقدمة للعمل مع AWS Lambda بلغة PHP: كيفية التغلب على البداية الباردة، وإعداد العمل داخل VPC، ومعالجة الأحداث من S3 و SQS بكفاءة. المادة موجهة للمطورين الذين هم على دراية بالفعل بأساسيات نشر تطبيقات PHP على Lambda.
\n\n1. تحسين البداية الباردة: من ثانيتين إلى 200 مللي ثانية
\n\nالعدو الرئيسي لتطبيقات serverless بلغة PHP هو البداية الباردة. على عكس Node.js أو Python، تتطلب PHP تحميل المفسر والإطار. إليك كيفية تقليل التأخير.
\n\n1.1. استخدام Bref والطبقات المترجمة مسبقًا
\n\nBref هو المعيار الفعلي لتشغيل PHP على Lambda. يوفر طبقات جاهزة (Layers) مع مفسر 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) مع كل طلب. استخدم Laravel Octane مع Swoole أو RoadRunner، ولكن بالنسبة لـ Lambda، فإن Bref Laravel Bridge هو الأنسب، حيث يقوم بتخزين التهيئات والمسارات مؤقتًا.
\n\nكود لتخزين التهيئة مؤقتًا في bootstrap.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\nتعمل وظائف Lambda افتراضيًا خارج VPC الخاصة بك. للوصول إلى قواعد البيانات (RDS, Aurora) أو ذاكرة التخزين المؤقت (ElastiCache)، يجب وضع الوظيفة داخل VPC. هذا يضيف تعقيدًا ويزيد من البداية الباردة بمقدار 5-10 ثوانٍ.
\n\n2.1. إعداد VPC في serverless.yml
\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استخدم مجمع اتصالات RDS Proxy أو ElastiCache لإعادة استخدام الاتصالات داخل حاوية Lambda واحدة.
\n\nمثال لفئة للعمل مع قاعدة البيانات مع إعادة الاستخدا