yaf框架

Yaf(Yet Another Framework) 框架。

YAF框架试用

YAF框架入门教程 - https://www.jianshu.com/p/1460d2296f19
下载地址 - http://pecl.php.net/package/yaf
Yaf - Manual - http://php.net/manual/en/book.yaf.php
Yaf(Yet Another Framework)用户手册 - http://www.laruence.com/manual/index.html
yaf程序模板生成工具 https://github.com/laruence/yaf/tree/master/tools/cg
PHP-Yaf执行流程-源码分析 - https://www.jianshu.com/p/130389235abc
数据库外扩 Medoo Guidebook - https://medoo.in/api/new
yaf-example | Larave - https://laravel-china.org/articles/4308/yaf-example
Medoo 1.6.1 API 手册(HTML单文件版本示例代码包内包含) - https://www.aiirobo.com/yaf/install/medoo_1.6.1.html
YAF手册CHM文件下载(示例代码包内含) - https://www.aiirobo.com/yaf/install/yaf_manual.chm

本文示例代码下载:
链接:https://pan.baidu.com/s/1i_PEwCxsWqxblmIqRASSlA
鸟哥博客
https://www.laruence.com/sitemap

Yaf 是一个用 C 语言编写的、专为 PHP 设计的高性能 MVC 框架。它由 鸟哥(Laruence) 开发和维护,是 PHP 领域内公认的性能最高的框架之一。

核心特点

  1. 极致的性能

    • 用 C 语言开发:作为一个 PHP 扩展(Extension)形式存在,而非普通的 PHP 代码库。这意味着它被编译到 PHP 运行时中,避免了每次请求解析和加载大量 PHP 文件的开销。
    • 框架本身开销极小:Yaf 只提供最核心的 MVC 功能,非常轻量。官方宣称其性能接近原生 PHP 开发,远高于其他基于 PHP 代码的框架(如 Laravel, ThinkPHP, Yii 等)。
  2. MVC 模式

    • 严格遵循模型-视图-控制器(MVC)设计模式,帮助开发者清晰地分离业务逻辑、数据和表现层。
  3. 低依赖和配置灵活

    • 框架核心功能对第三方库几乎没有依赖。
    • 配置简单,主要通过一个 .ini 配置文件管理。
  4. 强大的路由功能

    • 支持动态路由和静态路由(Rewrite)。
    • 支持强大的路由协议,可以轻松定义 RESTful 等风格的路由。
  5. 丰富的插件支持

    • 提供了丰富的钩子(Hooks),可以在请求生命周期的不同阶段插入自定义逻辑,非常灵活。

优缺点分析

优点:

  • :这是它最核心的优势,特别适合对性能要求极高的场景,如大型网站、API 服务等。
  • 轻量:核心简洁,只提供最必要的功能,没有过度设计。
  • 学习成本低:对于有 MVC 框架经验的开发者来说,上手非常快。
  • 由鸟哥背书:作为 PHP 核心开发成员,鸟哥的作品在稳定性和可靠性上有很高保障。

缺点:

  • 功能相对单一:不像 Laravel 那样提供“开箱即用”的全家桶功能(如强大的 ORM、队列、认证系统等)。需要这些功能时,需要自己集成第三方库(如集成 Doctrine 或 Medoo 作为 ORM)。
  • 依赖 PHP 扩展:需要单独安装 Yaf 扩展,在某些共享主机环境下可能无法使用。但随着 Docker 和云服务器的普及,这个问题已不那么突出。
  • 社区和资源相对较少:相比于 Laravel、ThinkPHP 等热门框架,其社区活跃度、教程和第三方包资源要少一些。

核心概念与工作流程

1. 安装

Yaf 是一个 PHP 扩展,需要通过 PECL 安装:

pecl install yaf

然后在 php.ini 中添加 extension=yaf.so(Linux)或 extension=php_yaf.dll(Windows),并重启 Web 服务器。

2. 目录结构

一个典型的 Yaf 应用目录结构如下(遵循官方约定):

application/
├── controllers/
│   ├── Index.php       # 默认控制器 (IndexController)
│   └── ...
├── views/
│   └── index/          # 与控制器的名称对应
│       └── index.phtml # 默认动作的视图模板 (indexAction)
├── modules/            # 多模块支持
├── library/            # 本地类库
├── models/             # 模型目录
├── plugins/            # 插件目录
└── Bootstrap.php       # 引导程序
public/
└── index.php           # 入口文件
conf/
└── application.ini     # 配置文件

3. 入口文件 (public/index.php)

所有请求都指向这个文件,它负责初始化 Yaf 应用。

<?php
define("APP_PATH",  realpath(dirname(__FILE__) . '/../')); // 应用程序路径
$app = new Yaf_Application(APP_PATH . "/conf/application.ini"); // 加载配置
$app->bootstrap()->run(); // 启动并运行应用
?>

4. 引导程序 (application/Bootstrap.php)

这是一个可选的类,用于在路由分发之前初始化自定义设置(如数据库连接、注册插件等)。类中的所有以 _init 开头的方法都会被自动调用。

<?php
class Bootstrap extends Yaf_Bootstrap_Abstract {
    public function _initConfig(Yaf_Dispatcher $dispatcher) {
        // 读取配置
        $config = Yaf_Application::app()->getConfig();
        Yaf_Registry::set('config', $config);
    }

    public function _initPlugin(Yaf_Dispatcher $dispatcher) {
        // 注册一个插件
        $dispatcher->registerPlugin(new MyPlugin());
    }

    public function _initRoute(Yaf_Dispatcher $dispatcher) {
        // 添加自定义路由
        $router = $dispatcher->getRouter();
        $route = new Yaf_Route_Rewrite(
            '/product/:id',
            array('controller' => 'product', 'action' => 'detail')
        );
        $router->addRoute('product_route', $route);
    }
}
?>

5. 控制器 (application/controllers/)

控制器负责处理业务逻辑。

<?php
class IndexController extends Yaf_Controller_Abstract {
    public function indexAction() {
        // 获取参数
        $id = $this->getRequest()->getParam('id');

        // 调用模型
        $model = new MyModel();
        $data = $model->getData($id);

        // 赋值给视图变量
        $this->getView()->assign('data', $data);

        // 默认会自动渲染 views/index/index.phtml
        // 如果不想自动渲染,可以 return FALSE;
    }

    public function jsonAction() {
        // 直接输出 JSON,不渲染视图
        $data = ['name' => 'Yaf', 'status' => 'awesome'];
        header('Content-Type: application/json');
        echo json_encode($data);
        return false; // 阻止 Yaf 自动渲染视图
    }
}
?>

6. 视图 (application/views/)

Yaf 默认使用简单的 PHP 模板(.phtml)作为视图。

<!-- application/views/index/index.phtml -->
<!DOCTYPE html>
<html>
<head>
    <title>Yaf Demo</title>
</head>
<body>
    <h1>Hello, <?php echo $data['name']; ?>!</h1>
</body>
</html>

7. 模型 (application/models/)

Yaf 本身不提供 ORM,模型只是一个普通的类,你可以在这里封装数据库操作。你可以使用任何你喜欢的数据库操作方式,如 PDO、Medoo、Doctrine 等。

<?php
class MyModel {
    public function getData($id) {
        // 这里只是示例,实际请使用 PDO 等并进行参数绑定防止 SQL 注入
        // $pdo = Yaf_Registry::get('pdo');
        // $stmt = $pdo->prepare('SELECT * FROM table WHERE id = ?');
        // $stmt->execute([$id]);
        // return $stmt->fetch();

        return ['name' => 'Test Data', 'id' => $id];
    }
}
?>

8. 路由

Yaf 的路由非常灵活。默认是基于 controlleraction 参数的路由:
http://yourdomain.com/controller/action/param1/value1/param2/value2

你也可以通过引导程序中的 _initRoute 方法定义更复杂的自定义路由。

总结

Yaf 是一个为追求极致性能而生的 PHP 框架。

  • 选择 Yaf 如果:你的项目对性能有严苛要求(如高并发 API),你愿意为了性能牺牲一些“开箱即用”的便利性,并且有能力自己集成所需的组件(如数据库抽象层、模板引擎等)。
  • 不选择 Yaf 如果:你需要快速开发,希望框架提供所有现代化功能(如强大的 ORM、队列、任务调度、脚手架等),或者你的部署环境无法安装 PHP 扩展。

它代表了 PHP 框架性能的一个极端,与 Laravel 代表的“功能丰富”极端形成了鲜明对比,是技术选型中一个非常重要的选项。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容