مرحبا بالجميع. يوم الاثنين ، سيتم عقد الدرس الأول في المجموعة الجديدة من الدورة التدريبية
"Backend PHP Developer" . في هذا الصدد ، نواصل نشر مواد مفيدة حول هذا الموضوع. لنبدأ.

مثل
Simon Wordley ، أعتقد أن الحوسبة
الخالية من الخوادم تعد مجالًا مثيرًا للاهتمام للغاية ،
ويعزى ذلك في المقام الأول إلى نظام الدفع الحبيبي (الدفع فقط عند تنفيذ التعليمات البرمجية الخاصة بك) ، ولا داعي للقلق بشأن خدمة وإعداد الخوادم والحاويات. لدرجة أنني أعمل مع
PHP Runtime المفتوح لـ
Apache OpenWhisk ، وهو إصدار تجاري متاح كأحد ميزات
IBM Cloud .
هناك مزودون آخرون بدون خادم ، و
AWS Lambda هي شركة رائدة في السوق ، ولكن حتى وقت قريب ، كان دعم PHP مرهقًا ومتواضعًا للغاية. تغير هذا في نهاية عام 2018 مع
واجهة برمجة تطبيقات وقت التشغيل Lambda الجديدة
ودعم الطبقة .
دعونا نلقي نظرة على الجوانب العملية للخوادم بدون PHP على Lambda باستخدام
Serverless Framework .
TL ؛ د
الكود المصدري لـ Hello World بسيط في مستودع
lambda-php الخاص بي على جيثب. انتقل إلى قسم
الملاحظات ويمكننا المتابعة.
فب وقت التشغيل
تسمح لك واجهة برمجة تطبيقات وقت التشغيل باستخدام أي وقت تشغيل مع Lambda. بطريقة ما ، يشبه هذا OpenWhisk ، حيث يوجد واجهة برمجة تطبيقات HTTP بين النظام الأساسي بدون خادم ووقت التشغيل. هناك اختلاف كبير واحد هو أنه مع Lambda ، يرسل وقت التشغيل طلبًا إلى النظام الأساسي لتلقي بيانات الاتصال ، في حين يقوم OpenWhisk باستدعاء نقطة النهاية التي يجب أن يوفرها وقت التشغيل. لمزيد من المعلومات ، اطلع على
منشور AWS الخاص
بمدونة Michael Moussa الذي ألهمني للقيام بهذه المهمة.
للبدء ، نحتاج إلى وقت تشغيل PHP لـ Lambda. ستتكون من PHP قابل للتنفيذ ، كود PHP لاستدعاء وظيفة بدون خادم ، وملف
bootstrap
، كما هو مطلوب من قبل النظام الأساسي. من هذه الأشياء الثلاثة نجمع طبقة. يمكن إعادة استخدام الطبقات في حسابات مختلفة ، لذلك أنا مندهش لأن AWS لا توفر لنا حساب PHP. لا يصدق ، ولكن صحيح ، أنهم لا يستخدمون PHP 7.3 ، لذلك سيكون لدينا لبناء منطقتنا.
جميع الملفات التي وضعناها في دليل
layer/php
في مشروعنا.
بناء PHP قابل للتنفيذ
نحتاج إلى PHP قابل للتنفيذ والذي سيتم تشغيله داخل حاويات Lambda. أسهل طريقة للقيام بذلك هي تجميعها على نفس المنصة مثل Lambda ، لذلك سوف نستخدم EC2. يشرح مقال مايكل كيفية القيام بذلك ،
ولفت هذه الأوامر في البرنامج النصي
compile_php.sh ، ثم لنسخها إلى مثيل EC2 ، قم بتشغيل ونسخ الملف القابل للتنفيذ مرة أخرى إلى جهاز الكمبيوتر الخاص بي:
$ export AWS_IP=ec2-user@{ipaddress} $ export SSH_KEY_FILE=~/.ssh/aws-key.rsa $ scp -i $SSH_KEY_FILE compile_php.sh $AWS_IP:doc/compile_php.sh $ ssh -i $SSH_KEY_FILE -t $AWS_IP "chmod a+x compile_php.sh && ./compile_php.sh 7.3.0" $ scp -i $SSH_KEY_FILE $AWS_IP:php-7-bin/bin/php layer/php/php
هذا النهج سيجعله قابلاً للتكرار جيدًا ، ونأمل أن يتم الترقية إلى إصدارات جديدة من PHP.
إلباس الحذاء
بما أننا نستخدم واجهة برمجة تطبيقات وقت التشغيل ، نحتاج إلى ملف
bootstrap
. يتطلب Lambda نفسه مثل هذا الاسم لتحديد الملف ؛ فإنه يستجيب لاستدعاء وظيفة يطابق الصور عن طريق استدعاء API في حلقة.
بشكل أساسي ، يجب أن نكون في حلقة ونستدعي نقطة النهاية
/next
لفهم ما يجب الاتصال به بعد ذلك ، ثم نسميها ، ثم نرسل الإجابة إلى نقطة النهاية
/response
.
يقدم AWS مثالاً في BASH
باستخدام curl :
while true do HEADERS="$(mktemp)"
نريد أن نفعل الشيء نفسه في PHP ، وعلى الرغم من أنني أستطيع أن أكتبها بنفسي ، فإن Pariksit Agnihotri هو بالفعل أمامي في
PHP-Lambda-Runtime / runtime.php ، لذلك نحن فقط نسخ هذا إلى
layer/php/runtime.php
. في الإصدار الخاص بي ، قمت بإجراء العديد من التغييرات ، وأضفت json_encoding وحسّنت معالج الأخطاء.
layer/php/bootstrap
الملف
layer/php/bootstrap
بسيطة للغاية ، وكل ما هو مطلوب منها هو تشغيل PHP القابل للتنفيذ باستخدام هذا الملف:
هذا كل شيء. الآن لدينا ثلاثة ملفات في طبقة / php:
php
- php
الملف القابل للتنفيذ؛runtime.php
- ملف وقت تشغيل API ؛bootstrap
هو ملف Lambda المطلوب.
نتيجة لذلك ، سيصبح كل ذلك طبقة PHP (طبقة) في تطبيق Lambda الخاص بنا.
تكوين إطار Serverless
يوفر إطار عمل Serverless تكوينًا قابل للتكرار ونشر تطبيق بدون خادم. أنا معجب بهذا المفهوم وأريد استخدام المزيد من هذه الأدوات. سوف نستخدم إطار عمل Serverless الخاص بـ PHP Hello World.
نظرًا لعدم وجود قالب مناسب للتطبيقات في PHP في إطار Serverless ، فإننا ببساطة نقوم بإنشاء ملف
serverless.yml
في الدليل من خلال مشروعنا.
بالنسبة للمبتدئين ، والأكثر أساسية:
service: php-hello-world provider: name: aws runtime: provided region: eu-west-2 memorySize: 128
سوف نسمي تطبيقنا
php-hello-world
ونستخدم AWS كمزود. منذ أن كنت في المملكة المتحدة ، أنشأت
منطقة لندن . لا نحتاج إلى الكثير من الذاكرة ، لذلك ستكون سعة 128 ميجابايت كافية.
وقت التشغيل هو اللغة التي تريد تنفيذ وظيفتك بها. لاستخدام
runtime API
الذي سيتم تنفيذه ملف
bootstrap
لدينا ، قمت بتعيين هذا الحقل إلى
المقدمة .
وستحتاج إلى ملف
.gitignore
يحتوي على:
.serverless
منذ في
git
نحن لسنا بحاجة إلى هذا الدليل.
بعد ذلك ، دعونا نضيف
serverless.yml
إلى
serverless.yml
عن طريق إضافة:
layers: php: path: layer/php
سيؤدي ذلك إلى إنشاء طبقة AWS
PhpLambdaLayer
اسم
PhpLambdaLayer
، والذي يمكننا الرجوع إليه في
PhpLambdaLayer
.
Hello World
وظيفة
Hello World
الآن يمكننا كتابة وظيفة php serverless لدينا. يجب إدخال هذا في ملف
handler.php
:
<?php function hello($eventData) : array { return ["msg" => "hello from PHP " . PHP_VERSION]; }
تأخذ الوظيفة معلومات حول الحدث وتقوم بإرجاع صفيف اقتران.
لإخبار خادم بلا إطار عن نشر وظيفتنا ، تحتاج إلى إضافة ما يلي إلى ملف
serverless.yml
:
functions: hello: handler: handler.hello layers: - {Ref: PhpLambdaLayer}
إطار Serverless يدعم العديد من الوظائف لتطبيق واحد. لكل منهم اسم ، في هذه الحالة
hello
، وفي حالتنا ، معالج ، وهو اسم ملف بدون امتداد ، متبوعًا بنقطة ، ثم اسم الوظيفة في هذا الملف. وبالتالي ، فإن معالج
handler.hello
يعني أننا سوف نقوم بتشغيل وظيفة
hello()
في
handler.php
.
أخيرًا ، نقوم أيضًا بالإبلاغ عن الوظائف إلى طبقة PHP الخاصة بنا حتى تتمكن من تنفيذ كود PHP.
نشر في لامدا
لتوسيع وظيفتنا بطبقتها ، نقوم بتشغيل الأمر التالي:
$ sls deploy
إذا تم تنفيذ الأمر لأطول فترة ممكنة ، فسيتم الحصول على إخراج مماثل لهذا:

وفاء وظيفتنا
بعد النشر ، يمكننا استدعاء الوظيفة باستخدام الأمر:
$ sls invoke -f hello -l

وانتهيت!
لتلخيص
مع طبقات جديدة وواجهات برمجة التطبيقات لوقت التشغيل ، يمكنك الآن تشغيل وظائف PHP الخالية من الخادم بسهولة في Lambda. هذه أخبار جيدة لمطوري PHP المرتبطين بـ AWS.
في انتظار تعليقاتكم ، الأصدقاء!