Phalcon

技术栈
后端框架
phpc-extensionhigh-performancemvclow-overhead

概览

Phalcon\n\nPhalcon 是一款独特的 PHP 全栈框架——以 C 语言扩展形式加载,编译后驻留内存,提供极致的执行速度和极低的资源消耗。它不依赖 Composer,是 PHP 框架中的性能冠军。\n\n### 核心特性\n\n- C 扩展架构:编译后加载,无需解释 PHP 框架代码\n- 极致性能:基准测试中远超传统 PHP 框架\n- 低开销:极少的文件和类加载,请求延迟极低\n- 全栈 MVC:完整的 ORM、模板、路由、缓存\n- Phalcon 5:支持 PHP 8.1+,全新架构\n- Volt 模板引擎:类 Twig 的高性能模板\n- 依赖注入:内建 DI 容器\n- 安全:CSRF/XSS 防护、加密组件

安装

1. 环境准备

  • OS:Linux / macOS
  • PHP:>= 8.0(Phalcon 5)
  • PHP 开发工具php-dev / php-devel 包(编译扩展)
  • 编译器:GCC / Clang + make
  • 数据库:MySQL 5.7+ / PostgreSQL / SQLite
  • 注意:Phalcon 以 PHP 扩展形式安装,不是 Composer 包

2. 安装命令

安装 Phalcon 扩展

Ubuntu/Debian

sudo apt install php8.2-dev gcc make libpcre3-dev
git clone https://github.com/phalcon/cphalcon.git
cd cphalcon/build
sudo ./install
# 或通过 PECL
sudo pecl install phalcon

macOS (Homebrew)

brew install phalcon

PECL(通用)

sudo pecl install phalcon

启用扩展

添加 extension=phalcon.sophp.ini

echo "extension=phalcon.so" | sudo tee /etc/php/8.2/mods-available/phalcon.ini
sudo phpenmod phalcon
php -m | grep phalcon  # 验证

创建项目

composer create-project phalcon/app my-app
cd my-app

开发工具

# Phalcon DevTools(CLI 代码生成器)
composer require --dev phalcon/devtools

启动服务器

php -S localhost:8080 -t public/ .htrouter.php

3. 常见安装问题

编译失败

确保 PHP 开发包版本与运行时一致:

php -v          # 如 8.2.15
phpize -v       # 确保版本匹配

PECL 安装失败

# 手动编译
git clone --single-branch --branch=v5.x https://github.com/phalcon/cphalcon.git
cd cphalcon/build
sudo ./install

共享主机不支持

Phalcon 需要服务器安装 C 扩展。共享主机通常不支持,需 VPS 或云服务器。

Windows 用户

下载预编译 DLL:https://github.com/phalcon/cphalcon/releases

示例

Hello World:Phalcon 5 MVC 控制器

目标

创建 Phalcon 5 控制器,展示 MVC 路由和 JSON API 端点。

完整代码

1. 路由配置 public/index.php

<?php

use Phalcon\Autoload\Loader;
use Phalcon\Mvc\Application;
use Phalcon\Di\Di;
use Phalcon\Mvc\Router;

// 自动加载
$loader = new Loader();
$loader->setDirectories(['../app/controllers/']);
$loader->register();

// DI 容器
$di = new Di();

$di->set('router', function () {
    $router = new Router();
    $router->add('/hello', ['controller' => 'hello', 'action' => 'index']);
    $router->add('/hello/{name}', ['controller' => 'hello', 'action' => 'greet']);
    return $router;
});

$di->set('response', function () {
    return new \Phalcon\Http\Response();
});

$app = new Application($di);
$app->handle($_SERVER['REQUEST_URI'])->send();

2. 控制器 app/controllers/HelloController.php

<?php

use Phalcon\Http\Response;
use Phalcon\Mvc\Controller;

class HelloController extends Controller
{
    /**
     * GET /hello — JSON API 端点
     */
    public function indexAction(): Response
    {
        return $this->response
            ->setContentType('application/json')
            ->setJsonContent([
                'message' => 'Hello, Vibe!',
                'framework' => 'Phalcon',
                'php_version' => PHP_VERSION,
                'timestamp' => date('c'),
            ]);
    }

    /**
     * GET /hello/{name} — 带参数端点
     */
    public function greetAction(string $name): Response
    {
        return $this->response
            ->setContentType('application/json')
            ->setJsonContent([
                'message' => "Hello, {$name}!",
                'powered_by' => 'Phalcon Framework',
            ]);
    }

    /**
     * 原生视图渲染
     */
    public function viewAction(): Response
    {
        $this->view->message = 'Hello from Phalcon View!';
        $this->view->framework = 'Phalcon';
        // 渲染 app/views/hello/view.phtml
        return $this->response;
    }
}

3. 视图 app/views/hello/view.phtml

<!DOCTYPE html>
<html>
<head><title>Phalcon Hello</title></head>
<body>
    <h1><?= $message ?></h1>
    <p>Powered by <strong><?= $framework ?></strong></p>
    <p>PHP <?= PHP_VERSION ?></p>
</body>
</html>

运行步骤

php -S localhost:8080 -t public/ .htrouter.php

预期输出

curl http://localhost:8080/hello
# {"message":"Hello, Vibe!","framework":"Phalcon","php_version":"8.2.15","timestamp":"..."}

curl http://localhost:8080/hello/Vibe
# {"message":"Hello, Vibe!","powered_by":"Phalcon Framework"}

# 浏览器访问 http://localhost:8080/hello/view
# 渲染 HTML 视图

注意:Phalcon 路由匹配不同于传统框架,需在 .htrouter.php 中处理重写规则。`

教程

Phalcon 入门教程:RESTful API 实战

1. 背景

Phalcon 以 C 扩展形式提供极致性能。本教程带你构建 RESTful Product API,掌握 Phalcon 的 MVC 模式、模型和验证。

2. 前置概念

概念 说明
DI 容器 Phalcon 依赖注入是框架的核心
Loader Phalcon 的 PSR-4 自动加载器
Model ORM 模型,连接数据库
Validation 内置验证器链

3. 分步操作

步骤一:项目结构

my-api/
├── public/
│   └── index.php
├── app/
│   ├── controllers/
│   │   └── ProductController.php
│   ├── models/
│   │   └── Product.php
│   ├── config/
│   │   └── config.php
│   └── migrations/
└── .htrouter.php

步骤二:入口文件 public/index.php

<?php

use Phalcon\Autoload\Loader;
use Phalcon\Di\Di;
use Phalcon\Mvc\Application;
use Phalcon\Mvc\Router;
use Phalcon\Db\Adapter\Pdo\Mysql;
use Phalcon\Mvc\Model\Manager as ModelsManager;

$loader = new Loader();
$loader->setDirectories(['../app/controllers/', '../app/models/']);
$loader->register();

$di = new Di();

// 数据库
$di->set('db', function () {
    return new Mysql([
        'host' => 'localhost',
        'username' => 'root',
        'password' => '',
        'dbname' => 'phalcon_api',
    ]);
});

// 路由
$di->set('router', function () {
    $router = new Router();
    $router->add('/api/products', [
        'controller' => 'product',
        'action' => 'list',
    ])->via(['GET']);
    $router->add('/api/products', [
        'controller' => 'product',
        'action' => 'create',
    ])->via(['POST']);
    $router->add('/api/products/{id}', [
        'controller' => 'product',
        'action' => 'show',
    ])->via(['GET']);
    $router->add('/api/products/{id}', [
        'controller' => 'product',
        'action' => 'update',
    ])->via(['PUT']);
    $router->add('/api/products/{id}', [
        'controller' => 'product',
        'action' => 'delete',
    ])->via(['DELETE']);
    return $router;
});

$di->set('modelsManager', new ModelsManager());

$app = new Application($di);
$app->handle($_SERVER['REQUEST_URI'])->send();

步骤三:Model app/models/Product.php

<?php

use Phalcon\Mvc\Model;

class Product extends Model
{
    public int $id;
    public string $name;
    public float $price;
    public string $category;
    public int $stock;

    public function initialize()
    {
        $this->setSource('products');
    }
}

步骤四:Controller app/controllers/ProductController.php

<?php

use Phalcon\Http\Response;
use Phalcon\Mvc\Controller;

class ProductController extends Controller
{
    public function listAction(): Response
    {
        $products = Product::find();
        return $this->response
            ->setContentType('application/json')
            ->setJsonContent($products->toArray());
    }

    public function createAction(): Response
    {
        $data = $this->request->getJsonRawBody(true);

        $product = new Product();
        $product->name = $data['name'];
        $product->price = $data['price'];
        $product->category = $data['category'] ?? '';
        $product->stock = $data['stock'] ?? 0;

        if ($product->save()) {
            return $this->response
                ->setContentType('application/json')
                ->setStatusCode(201)
                ->setJsonContent(['message' => 'Product created', 'id' => $product->id]);
        }

        return $this->response
            ->setContentType('application/json')
            ->setStatusCode(422)
            ->setJsonContent(['errors' => $product->getMessages()]);
    }

    public function showAction(int $id): Response
    {
        $product = Product::findFirst($id);
        if (!$product) {
            return $this->response->setStatusCode(404)->setJsonContent(['error' => 'Not found']);
        }
        return $this->response->setContentType('application/json')->setJsonContent($product->toArray());
    }

    public function updateAction(int $id): Response
    {
        $product = Product::findFirst($id);
        if (!$product) {
            return $this->response->setStatusCode(404)->setJsonContent(['error' => 'Not found']);
        }

        $data = $this->request->getJsonRawBody(true);
        $product->assign($data, ['name', 'price', 'category', 'stock']);
        $product->save();

        return $this->response->setContentType('application/json')->setJsonContent($product->toArray());
    }

    public function deleteAction(int $id): Response
    {
        $product = Product::findFirst($id);
        if ($product) {
            $product->delete();
            return $this->response->setStatusCode(204);
        }
        return $this->response->setStatusCode(404)->setJsonContent(['error' => 'Not found']);
    }
}

步骤五:数据库

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(128) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    category VARCHAR(64),
    stock INT DEFAULT 0
);

4. 验证

php -S localhost:8080 -t public/ .htrouter.php

curl -X POST http://localhost:8080/api/products \
  -H "Content-Type: application/json" \
  -d '{"name":"Phalcon Book","price":29.99,"category":"Books","stock":100}'

curl http://localhost:8080/api/products

5. 思考题

  1. Phalcon 的 ORM 和独立 Eloquent 有什么区别?
  2. 如何利用 Phalcon 的 C 扩展特性实现缓存优化?
  3. 如何在 Phalcon 中实现 JWT 认证中间件?