وظائف Serverless بلغة PHP: AWS Lambda مستوى متقدم

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

وظائف Serverless بلغة PHP: AWS Lambda — من النظرية إلى الممارسة المتقدمة

\n\n

لم تعد بنية Serverless شيئًا غريبًا، وقد حجزت PHP، بفضل أدوات مثل Bref و Laravel Vapor، مكانتها بثقة في عالم الحوسبة بدون خوادم. في هذه المقالة، سنستعرض التقنيات المتقدمة للعمل مع AWS Lambda بلغة PHP: كيفية التغلب على البداية الباردة، وإعداد العمل داخل VPC، ومعالجة الأحداث من S3 و SQS بكفاءة. المادة موجهة للمطورين الذين هم على دراية بالفعل بأساسيات نشر تطبيقات PHP على Lambda.

\n\n

1. تحسين البداية الباردة: من ثانيتين إلى 200 مللي ثانية

\n\n

العدو الرئيسي لتطبيقات serverless بلغة PHP هو البداية الباردة. على عكس Node.js أو Python، تتطلب PHP تحميل المفسر والإطار. إليك كيفية تقليل التأخير.

\n\n

1.1. استخدام Bref والطبقات المترجمة مسبقًا

\n\n

Bref هو المعيار الفعلي لتشغيل PHP على Lambda. يوفر طبقات جاهزة (Layers) مع مفسر PHP. للتسريع، استخدم bref/extra-php-extensions وقم بتوصيل الإضافات الضرورية فقط.

\n\n

مثال على التكوين الأساسي لـ serverless.yml:

\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. التحميل البطيء وتخزين التهيئات مؤقتًا

\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 ثانية لتحقيق توازن بين السرعة والتكلفة. ذاكرة أكبر تعني معالجًا أسرع.

\n\n

2. العمل مع VPC: الاتصال بـ RDS و ElastiCache

\n\n

تعمل وظائف Lambda افتراضيًا خارج VPC الخاصة بك. للوصول إلى قواعد البيانات (RDS, Aurora) أو ذاكرة التخزين المؤقت (ElastiCache)، يجب وضع الوظيفة داخل VPC. هذا يضيف تعقيدًا ويزيد من البداية الباردة بمقدار 5-10 ثوانٍ.

\n\n

2.1. إعداد VPC في 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. إدارة الاتصالات عبر PDO

\n\n

استخدم مجمع اتصالات RDS Proxy أو ElastiCache لإعادة استخدام الاتصالات داخل حاوية Lambda واحدة.

\n\n

مثال لفئة للعمل مع قاعدة البيانات مع إعادة الاستخدا

المدونات

توصيات الكتب