تمثل البرمجة التي تعتمد على الحدث تحديًا فريدًا لمطوري PHP الذين اعتادوا على الترميز الإجرائي. في الطبيعة الإجرائية لـ PHP ، غالبًا ما تتجول الأحداث في مكالمات الوظائف البسيطة ، مع عدم وجود سلوك غير متزامن متأصل. لا يزال تنفيذ جميع الكود يمنع.
ومع ذلك ، فإن لغات مثل JavaScript توضح إمكانات حلقات الأحداث كمكون مركزي. دفعت هذه البصيرة المطورين إلى دمج حلقات الأحداث والقدرات غير المتزامنة في خوادم PHP HTTP. توضح هذه المقالة إنشاء خادم HTTP عالي الأداء PHP يستفيد من مكتبة Icicle ، ودمجها مع Apache لخدمة الملف الثابت المحسّن. يتوفر رمز المثال على https://github.com/sitepoint-editors/icicle-http-server .
مزايا المفتاح
تكوين Apache للحصول على ملف ثابت محسّن
لتجنب معالجة PHP غير الضرورية للملفات الثابتة ، قم بتكوين Apache لخدمتها مباشرة:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) http://%{SERVER_NAME}:9001%{REQUEST_URI} [P]
هذا mod_rewrite يوجه التكوين Apache إلى إعادة توجيه الطلبات للملفات غير الموجودة إلى منفذ مختلف (على سبيل المثال ، 9001) ، حيث سيتعامل خادم Icicle PHP.
خادم HTTP الأساسي
ابدأ بتثبيت Icicle:
composer require icicleio/http
مثال على خادم iCicle HTTP بسيط:
// server.php
require __DIR__ . "/vendor/autoload.php";
use Icicle\Http\Message\RequestInterface;
use Icicle\Http\Message\Response;
use Icicle\Http\Server\Server;
use Icicle\Loop;
use Icicle\Socket\Client\ClientInterface;
$server = new Server(function (RequestInterface $request, ClientInterface $client) {
$response = (new Response(200))->withHeader("Content-Type", "text/plain");
yield $response->getBody()->end("hello world");
yield $response;
});
$server->listen(9001);
Loop\run();
توجيه متقدم مع الدوري \ Route
لتوجيه أكثر قوة ، دمج الدوري \ الطريق:
composer require league/route
تحسين server.php مع التوجيه:
// server.php
// ... (previous imports) ...
use League\Route\Http\Exception\MethodNotAllowedException;
use League\Route\Http\Exception\NotFoundException;
use League\Route\RouteCollection;
use League\Route\Strategy\UriStrategy;
// ... (Server creation) ...
$router = new RouteCollection();
$router->setStrategy(new UriStrategy());
require __DIR__ . "/routes.php";
$dispatcher = $router->getDispatcher();
try {
$result = $dispatcher->dispatch($request->getMethod(), $request->getRequestTarget());
$status = 200;
$content = $result->getContent();
} catch (NotFoundException $e) {
$status = 404;
$content = "not found";
} catch (MethodNotAllowedException $e) {
$status = 405;
$content = "method not allowed";
}
// ... (Response creation and sending) ...
عينة routes.php :
$router->addRoute("GET", "/home", function () {
return "hello world";
});
عرض وجهات نظر معقدة مع League \ Plates
للحصول على وجهات نظر معقدة ، استخدم League \ Plates:
composer require league/plates
تنفيذ templating (مثال مقتطفات من قوالب/layout.php و
تم حذف القوالب/home.php ، وتحديثها
Routes.php
تتضمن المقالة الأصلية معايير الأداء التي توضح قدرة الخادم على التعامل مع عدد كبير من الطلبات المتزامنة. يجب النظر في هذه المعايير في سياق الأجهزة والظروف المحددة التي تم تشغيلها بموجبها. الوجبات الرئيسية هي إمكانية الحصول على أداء عالي مع نموذج غير متزامن للجليد. ويختتم المقال بتشجيع التجريب والمناقشة المجتمعية. يتم تضمين المعايير المحدثة التي يوفرها مؤلف الجليد. يوضح قسم الأسئلة الشائعة أيضًا جوانب مختلفة من استخدام Icicle لتطوير الخادم.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3