PHP و Serverless: تحالف لم تتوقعه
\n\nعندما نسمع "Serverless" (أو "الحوسبة بدون خادم")، أول ما يتبادر إلى الذهن هو JavaScript أو Python أو Go. يبدو PHP في هذا السياق مثل "الديناصور" الذي علق في عصر الاستضافات المشتركة ومواقع WordPress المتجانسة. لكن دعونا نواجه الحقيقة: PHP حي، بصحة جيدة، وأكثر مرونة مما تعتقد.
\n\nاليوم سنشرح كيفية تشغيل كود PHP في AWS Lambda ونظائرها. ستتعرف على لماذا serverless PHP ليست سحرًا، بل أداة عمل لواجهات API، ومعالجات webhooks، والخدمات المصغرة. مفاجأة: لن تضطر للتخلي عن لغتك المفضلة.
\n\nما هو Serverless حقًا؟
\n\nدعنا نبدد الأسطورة فورًا. "Serverless" لا يعني "بدون خادم". هذا يعني أنك لا تفكر في الخادم. المنصة (AWS، Google Cloud، Vercel) تدير البنية التحتية بنفسها: توسع، تحدث، تصلح. أنت فقط تقوم بتحميل الكود وتدفع مقابل وقت تنفيذه.
\n\nبالنسبة لـ PHP، يبدو هذا كتحدي. فـ PHP تقليديًا يتطلب خادم ويب (Apache، Nginx) ووحدة PHP-FPM. لكن التكنولوجيا لا تقف مكتوفة الأيدي.
\n\nكيف يعمل PHP في بيئة بدون خادم؟
\n\nالمشكلة الرئيسية: دوال Lambda (ونظائرها) هي حاويات عديمة الحالة (stateless) تعيش لبضع ثوانٍ أو دقائق. لا "تحتفظ" بجلسة في الذاكرة، ولا تدير Apache. لذلك، يجب تكييف سكريبت PHP القياسي الذي ينتظر $_GET أو يكتب في $_SESSION.
جاء الحل في شكل بيئات تشغيل خاصة (runtimes). تقوم بتحويل حدث Lambda (مثل طلب HTTP من API Gateway) إلى سياق PHP مألوف. الأداة الأكثر شيوعًا لذلك هي Bref.
\n\nBref: محرك PHP لـ AWS Lambda
\n\nBref هو مشروع مفتوح المصدر يسمح بتشغيل PHP على AWS Lambda "خارج الصندوق". يأتي مع طبقات (layers) جاهزة تتضمن PHP 8.x والإضافات الشائعة (PDO، Redis، gd، mbstring).
\n\nالتثبيت والتشغيل الأول
\n\nللعمل ستحتاج إلى:
\n- \n
- حساب AWS \n
- تثبيت
composerوaws-cli\n - Node.js (لـ Serverless Framework) \n
لننشئ دالة بسيطة تعيد JSON مع الوقت الحالي:
\n\n// index.php\n<?php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Bref\\Context\\Context;\nuse Bref\\Event\\Http\\HttpHandler;\n\nclass TimeHandler extends HttpHandler\n{\n public function handleRequest($request, Context $context): array\n {\n return [\n 'statusCode' => 200,\n 'headers' => ['Content-Type' => 'application/json'],\n 'body' => json_encode([\n 'server_time' => date('Y-m-d H:i:s'),\n 'php_version' => PHP_VERSION,\n 'message' => 'Hello from Serverless PHP!'\n ]),\n ];\n }\n}\n\nreturn new TimeHandler();\n\nالآن لنقم بإعداد النشر. أنشئ ملف serverless.yml:
# serverless.yml\nservice: php-time-api\n\nprovider:\n name: aws\n region: eu-central-1\n runtime: provided.al2\n\nplugins:\n - ./vendor/bref/bref\n\nfunctions:\n api:\n handler: index.php\n timeout: 28\n layers:\n - ${bref:layer.php-81}\n events:\n - httpApi: 'GET /time'\n\nقم بتشغيل النشر:
\ncomposer require bref/bref\nserverless deploy\n\nبعد دقيقة ستحصل على رابط مثل: https://xxx.execute-api.eu-central-1.amazonaws.com/time. افتحه في المتصفح - سترى JSON. تهانينا، لقد قمت للتو بتشغيل دالة PHP بدون خادم على AWS Lambda!
بدائل AWS Lambda لـ PHP
\n\nلا تريد الارتباط بـ AWS؟ هناك بدائل تتوافق أيضًا مع PHP.
\n\nGoogle Cloud Functions (مع التكييف)
\n\nGoogle لا تدعم PHP بشكل أصلي، ولكن يمكنك اس