輕量級微PHP框架:Framework X

輕量級微PHP框架:Framework X配圖

PHP 已經取得了長足的進步,並在新功能、語法和速度方面不斷改進。生態系統也在不斷擴大,許多開發人員建立了框架來簡化其他開發人員的生活。既有像 Laravel 和 Symfony 這樣流行的全功能框架,也有像 Framework X 這樣輕量級的微框架。

它是 PHP 的輕量級微框架,採用事件驅動、無阻塞架構,類似於 Node.js,非常適合聊天應用或實時通知等高併發和實時應用。

在本文中,我們將探討什麼是 Framework X 以及它與傳統 PHP 框架的區別。

準備工作

首先,確保在電腦上安裝了 PHP 和Composer。安裝完成後,您可以使用此命令將 Framework X 新增到您的專案中:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
composer require clue/framework-x
composer require clue/framework-x
composer require clue/framework-x

Framework X 不需要複雜的設定。您只需要一個 public/index.php 檔案。下面是一個在主頁上顯示 “Hello World!”

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
$app = new FrameworkX\App();
$app->get('/', fn () => \React\Http\Message\Response::plaintext("Hello world!\n"));
$app->run();
<?php require dirname(__DIR__) . '/vendor/autoload.php'; $app = new FrameworkX\App(); $app->get('/', fn () => \React\Http\Message\Response::plaintext("Hello world!\n")); $app->run();
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
$app = new FrameworkX\App();
$app->get('/', fn () => \React\Http\Message\Response::plaintext("Hello world!\n"));
$app->run();

要執行應用程式,請鍵入:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php public/index.php
php public/index.php
php public/index.php

該命令使用 ReactPHP Socket 元件支援的 PHP 內建伺服器啟動本地伺服器。無需 Nginx 或 Apache。伺服器將在http://127.0.0.1:8080 上執行,並顯示 “Hello World!”。

Localhost server setup

除了純文字,您還可以返回 JSON 資料。例如:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
$users = [['name' => 'Jon Doe'], ['name' => 'Jane Doe']];
$app = new FrameworkX\App();
$app->get('/', fn () => \React\Http\Message\Response::json($users));
$app->run();
<?php require dirname(__DIR__) . '/vendor/autoload.php'; $users = [['name' => 'Jon Doe'], ['name' => 'Jane Doe']]; $app = new FrameworkX\App(); $app->get('/', fn () => \React\Http\Message\Response::json($users)); $app->run();
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
$users = [['name' => 'Jon Doe'], ['name' => 'Jane Doe']];
$app = new FrameworkX\App();
$app->get('/', fn () => \React\Http\Message\Response::json($users));
$app->run();

非同步操作

PHP 操作通常是阻塞和同步的,這意味著每個任務必須在下一個任務開始之前完成。Framework X 基於 ReactPHP 庫構建。

ReactPHP 是一個提供 EventLoopStreamPromiseAsync 和 HTTP 等元件的庫,這些元件可實現非同步操作。因此,任務可以併發執行,無需等待其他任務完成。這非常適合同時處理多個連線、HTTP 請求或 I/O 操作。

在本例中,我們更新了 index.php,以獲取 API。我們不使用 curl_* 函式,而是使用 HTTP 元件 來進行非同步請求。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$app = new FrameworkX\App();
$app->get('/', function () {
echo "Start\n";
(new \React\Http\Browser())
->get('https://www.hongkiat.com/blog/wp-json/wp/v2/posts')
->then(function () {
echo "End (API)\n";
});
echo "End\n";
return \React\Http\Message\Response::plaintext("Hello world!\n");
});
$app->run();
$app = new FrameworkX\App(); $app->get('/', function () { echo "Start\n"; (new \React\Http\Browser()) ->get('https://www.hongkiat.com/blog/wp-json/wp/v2/posts') ->then(function () { echo "End (API)\n"; }); echo "End\n"; return \React\Http\Message\Response::plaintext("Hello world!\n"); }); $app->run();
$app = new FrameworkX\App();
$app->get('/', function () {
echo "Start\n";
(new \React\Http\Browser())
->get('https://www.hongkiat.com/blog/wp-json/wp/v2/posts')
->then(function () {
echo "End (API)\n";
});
echo "End\n";
return \React\Http\Message\Response::plaintext("Hello world!\n");
});
$app->run();

通常,外部 API 請求會阻止頁面渲染,直到請求完成。但是,由於 ReactPHP HTTP 元件處理的是非同步操作,頁面會立即載入,日誌就是證明。

Async operations log

與傳統 PHP 設定相比,Framework X 能夠處理更多併發請求,大大加快了頁面載入時間。但它到底有多快?

速度

我在一個基本的、廉價的 DigitalOcean droplet 上測試了 Framework X,它有 1 個 vCPU 和 1GB 記憶體。它可以毫不費力地處理每秒約 4000 個請求。

Concurrency Level:      50
Time taken for tests:   22.636 seconds
Complete requests:      100000
Failed requests:        0
Keep-Alive requests:    100000
Total transferred:      17400000 bytes
HTML transferred:       1300000 bytes
Requests per second:    4417.69 [#/sec] (mean)
Time per request:       11.318 [ms] (mean)
Time per request:       0.226 [ms] (mean, across all concurrent requests)
Transfer rate:          750.66 [Kbytes/sec] received

即使有額外的工作量,如磁碟讀取操作和從 JSON 檔案渲染 100 個列表,它每秒仍能處理約 2700 個請求。

Concurrency Level:      50
Time taken for tests:   36.381 seconds
Complete requests:      100000
Failed requests:        0
Keep-Alive requests:    100000
Total transferred:      296700000 bytes
HTML transferred:       280500000 bytes
Requests per second:    2748.72 [#/sec] (mean)
Time per request:       18.190 [ms] (mean)
Time per request:       0.364 [ms] (mean, across all concurrent requests)
Transfer rate:          7964.31 [Kbytes/sec] received

我敢肯定,如果伺服器規格更高,速度會更快。

小結

Framework X 是一款功能強大、輕量級的 PHP 微型框架。它以非同步方式執行,能夠高效處理多個任務,類似於 Node.js。無論是構建簡單的應用程式,還是複雜的高併發或實時應用程式,它都是一個完美的框架。

評論留言