Yaf有着和Zend Framework相似的API, 相似的理念, 而同时又保持着对Bingo的兼容, 以此来提高开发效率, 规范开发习惯. 本着对性能的追求, Yaf把框架中不易变的部分抽象出来,采用PHP扩展实现(c语言),以此来保证性能.在作者自己做的简单测试中, Yaf和原生的PHP在同样功能下, 性能损失小于10%, 而和ZendFramework的对比中, Yaf的性能是Zend Framework的50-60倍.
天下武功无坚不破,唯快不破
Yaf只支持PHP5.2及以上的版本 Yaf需要SPL的支持. SPL在PHP5中是默认启用的扩展模块 Yaf需要PCRE的支持. PCRE在PHP5中是默认启用的扩展模块 在 Windows 系统下安装 PHP 5.2+
下载Yaf的最新版本, 解压缩以后, 进入Yaf的源码目录, 依次执行(其中PHP_BIN是PHP的bin目录):
cd /usr/local/src
#进入软件包存放目录tar zxvf yaf-2.3.5.tgz
#解压cd yaf-2.3.5
#进入安装目录/usr/local/php/bin/phpize
#用phpize生成configure配置文件./configure --with-php-config=/usr/local/php/bin/php-config
#配置make
make install
安装完成之后,出现下面的安装路径/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
配置php支持vim /usr/local/php/etc/php.ini
#编辑配置文件,在最后一行添加以下内容extension="yaf.so"
:wq!
#保存退出 重启服务sudo service nginx restart
sudo /etc/init.d/php-fpm restart
查看php -m
看到神秘的yaf 就说明安装成功了
Yaf_Request_Abstract的getPost, getQuery等方法, 并没有对应的setter方法. 并且这些方法是直接从PHP内部的POST,_GET等大变量的原身变量只读的查询值, 所以就有一个问题:通过在PHP脚本中对这些变量的修改, 并不能反映到 getPost/getQuery 等方法上
常量(启用命名空间后的常量名) | 说明 |
---|---|
YAF_VERSION(Yaf\VERSION) | Yaf框架的三位版本信息 |
YAF_ENVIRON(Yaf\ENVIRON) | Yaf的环境常量, 指明了要读取的配置的节, 默认的是product |
YAF_ERR_DISPATCH_FAILED(Yaf\ERR\DISPATCH_FAILED) | Yaf的错误代码常量, 表示分发失败, 值为514 |
YAF_ERR_NOTFOUND_MODULE(Yaf\ERR\NOTFOUD\MODULE) | Yaf的错误代码常量, 表示找不到指定的模块, 值为515 |
YAF_ERR_NOTFOUND_CONTROLLER(Yaf\ERR\NOTFOUD\CONTROLLER) | Yaf的错误代码常量, 表示找不到指定的Controller, 值为516 |
YAF_ERR_NOTFOUND_ACTION(Yaf\ERR\NOTFOUD\ACTION) | Yaf的错误代码常量, 表示找不到指定的Action, 值为517 |
YAF_ERR_NOTFOUND_VIEW(Yaf\ERR\NOTFOUD\VIEW) | Yaf的错误代码常量, 表示找不到指定的视图文件, 值为518 |
YAF_ERR_CALL_FAILED(Yaf\ERR\CALL_FAILED) | Yaf的错误代码常量, 表示调用失败, 值为519 |
YAF_ERR_AUTOLOAD_FAILED(Yaf\ERR\AUTOLOAD_FAILED) | Yaf的错误代码常量, 表示自动加载类失败, 值为520 |
YAF_ERR_TYPE_ERROR(Yaf\ERR\TYPE_ERROR) | Yaf的错误代码常量, 表示关键逻辑的参数错误, 值为521 |
选项名称 | 默认值 | 可修改范围 | 更新记录 |
---|---|---|---|
yaf.environ | product | PHP_INI_ALL | 环境名称, 当用INI作为Yaf的配置文件时, 这个指明了Yaf将要在INI配置中读取的节的名字 |
yaf.library | NULL | PHP_INI_ALL | 全局类库的目录路径 |
yaf.cache_config | 0 | PHP_INI_SYSTEM | 是否缓存配置文件(只针对INI配置文件生效), 打开此选项可在复杂配置的情况下提高性能 |
yaf.name_suffix | 1 | PHP_INI_ALL | 在处理Controller, Action, Plugin, Model的时候, 类名中关键信息是否是后缀式, 比如UserModel, 而在前缀模式下则是ModelUser |
yaf.name_separator | “” | PHP_INI_ALL | 在处理Controller, Action, Plugin, Model的时候, 前缀和名字之间的分隔符, 默认为空, 也就是UserPlugin, 加入设置为”_”, 则判断的依据就会变成:”User_Plugin”, 这个主要是为了兼容ST已有的命名规范 |
yaf.forward_limit | 5 | PHP_INI_ALL | forward最大嵌套深度 |
yaf.use_namespace | 0 | PHP_INI_SYSTEM | 开启的情况下, Yaf将会使用命名空间方式注册自己的类, 比如Yaf_Application将会变成Yaf\Application |
yaf.use_spl_autoload | 0 | PHP_INI_ALL | 开启的情况下, Yaf在加载不成功的情况下, 会继续让PHP的自动加载函数加载, 从性能考虑, 除非特殊情况, 否则保持这个选项关闭 |
在开启yaf.cache_config的情况下, Yaf会使用INI文件路径作为Key, 这就有一个陷阱, 就是如果在一台服务器上同时运行俩个应用, 那么它们必须不能使用同一个路径名下的INI配置文件, 否则就会出现Application Path混乱的问题. 所以, 尽量不要使用相对路径.
├──public
│ ├── index.php 入口文件
│ ├── .htaccess 重写规则
│ ├── css
│ ├── img
│ ├── js
├──conf
│ ├── application.ini 配置文件
├──application
│ ├── Controllers
│ ├── Index.php 默认控制器
│ ├── views
│ ├── Index 控制器名
│ ├── index.phtml 默认视图
├──modules 其他模块
├──library 本地类库
├──models model目录
├──plugins 插件目录
入口文件是所有请求的入口, 一般都借助于rewrite规则, 把所有的请求都重定向到这个入口文件.
一个经典的入口文件public/index.php
<?php
define("APP_PATH", realpath(dirname(__FILE__) . '/../')); /* 指向public的上一级 */
$app = new Yaf_Application(APP_PATH . "/conf/application.ini");
$app->run();
除非我们使用基于query string的路由协议(Yaf_Route_Simple, Yaf_Route_Supervar), 否则我们就需要使用WebServer提供的Rewrite规则, 把所有这个应用的请求, 都定向到上面提到的入口文件.
Apache的Rewrite (httpd.conf)
#.htaccess, 当然也可以写在httpd.conf
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php
Nginx的Rewrite (nginx.conf)
server {
listen ****;
server_name domain.com;
root document_root;
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^/(.*) /index.php/$1 last;
}
}
Lighttpd的Rewrite (lighttpd.conf)
$HTTP["host"] =~ "(www.)?domain.com$" {
url.rewrite = (
"^/(.+)/?$" => "/index.php/$1",
)
}
SAE的Rewrite (config.yaml)
name: your_app_name
version: 1
handle:
- rewrite: if(!is_dir() && !is_file() && path ~ "^(.*)$" ) goto "/index.php"
[注意] 注意每种Server要启用Rewrite都需要特别设置, 如果对此有疑问.. RTFM 配置文件
在Yaf中, 配置文件支持继承, 支持分节. 并对PHP的常量进行支持. 你不用担心配置文件太大造成解析性能问题, 因为Yaf会在第一个运行的时候载入配置文件, 把格式化后的内容保持在内存中. 直到配置文件有了修改, 才会再次载入.
一个简单的配置文件application/conf/application.ini
[product]
;支持直接写PHP中的已定义常量
application.directory=APP_PATH "/application/"
控制器
在Yaf中, 默认的模块/控制器/动作, 都是以Index命名的, 当然,这是可通过配置文件修改的. 对于默认模块, 控制器的目录是在application目录下的controllers目录下, Action的命名规则是”名字+Action”
默认控制器application/controllers/Index.php
<?php
class IndexController extends Yaf_Controller_Abstract {
public function indexAction() {//默认Action
$this->getView()->assign("content", "Hello World");
}
}
?>
视图文件
Yaf支持简单的视图引擎, 并且支持用户自定义自己的视图引擎, 比如Smarty.对于默认模块, 视图文件的路径是在application目录下的views目录中以小写的action名的目录中.
一个默认Action的视图application/views/index/index.phtml
<html>
<head>
<title>Hello World</title>
</head>
<body>
<?php echo $content;?>
</body>
</html>
运行在浏览器输入
http://www.yourhostname.com/application/index.php
看到了Hello World输出吧?
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有