مقدمة: لماذا Serverless و PHP ليسا متناقضين
لفترة طويلة، كان يُعتقد أن PHP وبنية serverless غير متوافقتين. ارتبطت PHP بعمليات Apache أو Nginx الدائمة، بينما ارتبطت serverless بـ Node.js أو Python. ومع ذلك، مع ظهور أدوات مثل Bref والدعم الرسمي لبيئات التشغيل المخصصة (Custom Runtimes) في AWS Lambda، حصلت PHP على فرصة جديدة للحياة.
تتيح وظائف Serverless تشغيل كود PHP دون إدارة خادم. أنت تدفع فقط مقابل وقت التنفيذ الفعلي (بدقة تصل إلى الميلي ثانية). هذا هو الحل المثالي لـ:
- معالجات Webhooks (Telegram، Stripe، Slack)؛
- الخدمات المصغرة ذات الأحمال المنخفضة؛
- المهام الدورية (cron) عبر CloudWatch Events؛
- وكلاء API والخلفيات الخفيفة.
في هذه المقالة، سنشرح كيفية تشغيل PHP على AWS Lambda من الصفر: من إنشاء أدوار IAM إلى نشر وظيفة عاملة.
1. بنية PHP في AWS Lambda
كيف يعمل Custom Runtime
يدعم AWS Lambda أصلاً فقط Java، Go، PowerShell، Node.js، C#، Python و Ruby. لتشغيل PHP، نستخدم Custom Runtime – وهو ملف تنفيذي خاص (bootstrap) يتواصل مع Lambda Runtime API.
الطريقة الأكثر شيوعًا هي إطار العمل Bref. يأتي مع طبقة جاهزة (Layer) تحتوي على PHP 8.x و Composer ومجموعة من الإضافات القياسية.
// هيكل المشروع لـ Brefproject/├── index.php // نقطة الدخول├── composer.json├── serverless.yml // تكوين النشر└── vendor/ثلاث طرق للنشر
- Bref (موصى به) – الأسهل. يستخدم serverless.yml وطبقات جاهزة.
- التجميع اليدوي – تقوم بتجميع PHP تحت Amazon Linux 2 وتعبئته في ملف ZIP.
- صورة Docker – تستخدم Lambda Container Image (مدعوم منذ 2020).
سننظر في الخيار الأول – وهو مناسب لـ 90% من المهام.
2. الإعداد خطوة بخطوة: من التثبيت إلى أول طلب
الخطوة 1. تحضير البيئة
تأكد من تثبيت ما يلي:
- PHP 8.0+ (محليًا)
- Composer
- Node.js و npm (لـ Serverless Framework)
- أداة
aws-cliمع بيانات اعتماد (credentials) مهيأة
نقوم بتثبيت Serverless Framework عالميًا:
npm install -g serverlessالخطوة 2. إنشاء المشروع
composer create-project bref/bref my-php-lambdacd my-php-lambdaبعد التهيئة، سترى ملف serverless.yml. سنقوم بتعديله:
service: my-php-app
provider: name: aws region: eu-central-1 # اختر أقرب منطقة runtime: provided.al2 # Amazon Linux 2
plugins: - ./vendor/bref/bref
functions: hello: handler: index.php description: 'دالة PHP بسيطة' layers: - ${bref:layer.php-80} # طبقة PHP 8.0الخطوة 3. كتابة الدالة نفسها
افتح index.php:
<?php
require __DIR__ . '/vendor/autoload.php';
/** * معالج دالة Lambda * @param array $event بيانات الإدخال من AWS (API Gateway، SQS، إلخ.) * @return array الرد بتنسيق JSON */function handler(array $event): array{ // تسجيل في CloudWatch error_log('تم استلام الطلب: ' . json_encode($event));
$name = $event['queryStringParameters']['name'] ?? 'ضيف';
return [ 'statusCode' => 200, 'headers' => [ 'Content-Type' => 'application/json', ], 'body' => json_encode([ 'message' => "مرحبًا، {$name}!", 'timestamp' => time(), ]), ];}