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 领域内公认的性能最高的框架之一。
核心特点
-
极致的性能
- 用 C 语言开发:作为一个 PHP 扩展(Extension)形式存在,而非普通的 PHP 代码库。这意味着它被编译到 PHP 运行时中,避免了每次请求解析和加载大量 PHP 文件的开销。
- 框架本身开销极小:Yaf 只提供最核心的 MVC 功能,非常轻量。官方宣称其性能接近原生 PHP 开发,远高于其他基于 PHP 代码的框架(如 Laravel, ThinkPHP, Yii 等)。
-
MVC 模式
- 严格遵循模型-视图-控制器(MVC)设计模式,帮助开发者清晰地分离业务逻辑、数据和表现层。
-
低依赖和配置灵活
- 框架核心功能对第三方库几乎没有依赖。
- 配置简单,主要通过一个
.ini
配置文件管理。
-
强大的路由功能
- 支持动态路由和静态路由(Rewrite)。
- 支持强大的路由协议,可以轻松定义 RESTful 等风格的路由。
-
丰富的插件支持
- 提供了丰富的钩子(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 的路由非常灵活。默认是基于 controller
和 action
参数的路由:
http://yourdomain.com/controller/action/param1/value1/param2/value2
你也可以通过引导程序中的 _initRoute
方法定义更复杂的自定义路由。
总结
Yaf 是一个为追求极致性能而生的 PHP 框架。
- 选择 Yaf 如果:你的项目对性能有严苛要求(如高并发 API),你愿意为了性能牺牲一些“开箱即用”的便利性,并且有能力自己集成所需的组件(如数据库抽象层、模板引擎等)。
- 不选择 Yaf 如果:你需要快速开发,希望框架提供所有现代化功能(如强大的 ORM、队列、任务调度、脚手架等),或者你的部署环境无法安装 PHP 扩展。
它代表了 PHP 框架性能的一个极端,与 Laravel 代表的“功能丰富”极端形成了鲜明对比,是技术选型中一个非常重要的选项。