PHP بدون خادم: خرافة أم حقيقة؟
\n\nعندما تسمع عبارة "دوال Serverless"، فإن أول ارتباط يتبادر إلى الذهن عادةً هو Node.js أو Python. تبدو PHP وكأنها كتلة صلبة تعيش على Apache أو Nginx الأبدي. لكن الأوقات تتغير. اليوم، PHP في بنية serverless ليست أمرًا غريبًا، بل هي أداة عمل لآلاف المشاريع. يمكنك كتابة خدمات مصغرة، ومعالجة webhooks، وتغيير حجم الصور، وحتى تشغيل واجهات برمجة تطبيقات كاملة، دون التفكير في الخوادم، أو التوسع، أو دفع ثمن القدرات الخاملة.
\n\nفي هذه المقالة، سنشرح كيف يعمل PHP على AWS Lambda، وما هي البدائل المتاحة (Bref، OpenFaaS، Vercel)، والأهم من ذلك، سنكتب كودًا حقيقيًا يمكن تشغيله فورًا. إذا كنت مطور PHP وتريد الانتقال إلى التطوير الحديث السحابي الأصلي، فأنت في المكان الصحيح.
\n\nما هو Serverless ولماذا يحتاجه مطور PHP؟
\n\nServerless (أو FaaS — Functions as a Service) هو نموذج حيث تقوم بتحميل الكود الخاص بك، ويقرر المزود بنفسه متى وكيف يشغله. أنت تدفع فقط مقابل وقت التنفيذ الفعلي. لا أجهزة افتراضية، ولا "Apache" يستهلك الذاكرة 24/7. بالنسبة لـ PHP، التي طالما اعتُبرت "لغة للاستضافة عبر FTP"، فهذا نَفَس من الهواء النقي.
\n\nمزايا مشاريع PHP:
\n- \n
- توفير — لا حاجة لاستضافة خادم كامل من أجل سكريبت واحد. \n
- توسع تلقائي — Lambda تنشئ نسخًا من الدالة تلقائيًا عند زيادة الحمل. \n
- سهولة النشر — حمّل الكود، وسيعمل. \n
- نهج الخدمات المصغرة — يمكن تقسيم الكتلة الواحدة إلى دوال صغيرة. \n
المشكلة: PHP لا يدعم Serverless بشكل افتراضي
\n\nPHP التقليدية ليست خفيّة (daemon). يتم تشغيلها، وتنفيذ السكريبت، ثم تنتهي. بالنسبة لـ Lambda، هذه مشكلة: يجب أن تكون الدالة "باردة" وتبدأ في غضون أجزاء من الثانية. PHP العادية تبدأ ببطء (تحميل الإطار، التحميل التلقائي، الإعدادات). الحل هو Bref.
\n\nBref — الأداة الرئيسية لـ Serverless PHP
\n\nBref هي حزمة SDK ووقت تشغيل مفتوح المصدر يحول PHP إلى دالة Lambda أصلية. يقوم بتجميع PHP في ملف ثنائي ثابت (عبر bref/bref)، مما يعطي بداية باردة فورية. يدعم Bref Laravel و Symfony و Slim وأي كود مخصص.
كيف يعمل Bref؟
\nتكتب فئة PHP عادية، وتنفذ الواجهة Bref\\Context\\Context، ويتولى Bref معالجة HTTP. بالنسبة لواجهة API، تكفي دالة واحدة.
مثال: واجهة API Serverless على PHP لإنشاء رموز QR
\nلنفترض أننا بحاجة لاستقبال طلب POST بنص وإرجاع رمز QR بتنسيق PNG. نكتب الدالة:
\n\n<?php\n// handler.php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Bref\\Context\\Context;\nuse Bref\\Event\\Http\\HttpHandler;\nuse chillerlan\\QRCode\\QRCode;\nuse chillerlan\\QRCode\\QROptions;\n\nclass QrGenerator extends HttpHandler\n{\n public function handleRequest($request, Context $context): array\n {\n $body = json_decode($request->getBody()->getContents(), true);\n $text = $body['text'] ?? 'Hello, Serverless!';\n \n $options = new QROptions([\n 'outputType' => QRCode::OUTPUT_IMAGE_PNG,\n 'imageBase64' => false,\n ]);\n \n $qrcode = new QRCode($options);\n $imageData = $qrcode->render($text);\n \n return [\n 'headers' => ['Content-Type' => 'image/png'],\n 'statusCode' => 200,\n 'body' => base64_encode($imageData),\n 'isBase64Encoded' => true,\n ];\n }\n}\n\nreturn new QrGenerator();\n\nالنشر على AWS Lambda عبر Bref
\nقم بتثبيت واجهة سطر الأوامر Bref ونفّذ:
\ncomposer require bref/bref\n./vendor/bin/bref init\n./vendor/bin/bref deploy\nكل شيء. بعد دقيقة، سيكون لديك نقطة نهاية HTTPS،