PHP على خوادم بدون خادم: AWS Lambda لمطوري الويب

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

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

ابدأ الدورة

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.

\n\n

جاء الحل في شكل بيئات تشغيل خاصة (runtimes). تقوم بتحويل حدث Lambda (مثل طلب HTTP من API Gateway) إلى سياق PHP مألوف. الأداة الأكثر شيوعًا لذلك هي Bref.

\n\n

Bref: محرك PHP لـ AWS Lambda

\n\n

Bref هو مشروع مفتوح المصدر يسمح بتشغيل 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
\n\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:

\n\n
# 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

قم بتشغيل النشر:

\n
composer require bref/bref\nserverless deploy
\n\n

بعد دقيقة ستحصل على رابط مثل: https://xxx.execute-api.eu-central-1.amazonaws.com/time. افتحه في المتصفح - سترى JSON. تهانينا، لقد قمت للتو بتشغيل دالة PHP بدون خادم على AWS Lambda!

\n\n

بدائل AWS Lambda لـ PHP

\n\n

لا تريد الارتباط بـ AWS؟ هناك بدائل تتوافق أيضًا مع PHP.

\n\n

Google Cloud Functions (مع التكييف)

\n\n

Google لا تدعم PHP بشكل أصلي، ولكن يمكنك اس

المدونات

توصيات الكتب