Yaf有着和Zend Framework相似的API, 相似的理念, 而同时又保持着对Bingo的兼容, 以此来提高开发效率, 规范开发习惯. 本着对性能的追求, Yaf把框架中不易变的部分抽象出来,采用PHP扩展实现(c语言),以此来保证性能.在作者自己做的简单测试中, Yaf和原生的PHP在同样功能下, 性能损失小于10%, 而和ZendFramework的对比中, Yaf的性能是Zend Framework的50-60倍.
天下武功无坚不破,唯快不破
用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销.所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存.更短的内存周转周期, 提高内存利用率, 降低内存占用率.灵巧的自动加载. 支持全局和局部两种加载规则, 方便类库共享.高性能的视图引擎.高度灵活可扩展的框架, 支持自定义视图引擎, 支持插件, 支持自定义路由等等.内建多种路由, 可以兼容目前常见的各种路由协议.强大而又高度灵活的配置文件支持. 并支持缓存配置文件, 避免复杂的配置结构带来的性能损失.在框架本身,对危险的操作习惯做了禁止.更快的执行速度, 更少的内存占用Yaf的安装 WindowsYaf只支持PHP5.2及以上的版本
Yaf需要SPL的支持. SPL在PHP5中是默认启用的扩展模块
Yaf需要PCRE的支持. PCRE在PHP5中是默认启用的扩展模块
在 Windows 系统下安装
PHP 5.2+
打开yaf在php官网上的目录:http://pecl.php.net/package/yaf目前yaf的最新版为3.0.0,仅支付php7,建议选择2.3.5版本我这里选择2.3.5后面的win图标+DLL字样的链接,进入页面下载php_yaf.dll在打开的页面根据自己的环境来选择对应的版本,我这里选择的是php5.6 Thread Safe (TS)x86(php5.6版本 安全线程 32位操作系统)点击后自动下载了一个压缩包:php_yaf-2.3.5-5.6-ts-vc11-x86.zip把压缩包中的php_yaf.dll复制出来,打到你的php目录,打开目录下的ext文件夹,粘贴进去再打开您的PHP配置文件php.ini,加入 ‘extension=php_yaf.dll’,重启web服务器,就OK了Yaf的安装 Linux下载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 的常量常量(启用命名空间后的常量名)
说明
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 的配置项选项名称
默认值
可修改范围
更新记录
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混乱的问题. 所以, 尽量不要使用相对路径.
快速开始代码语言:javascript复制├──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
代码语言:javascript复制
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)
代码语言:javascript复制#.htaccess, 当然也可以写在httpd.conf
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.phpNginx的Rewrite (nginx.conf)
代码语言:javascript复制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)
代码语言:javascript复制$HTTP["host"] =~ "(www.)?domain.com$" {
url.rewrite = (
"^/(.+)/?$" => "/index.php/$1",
)
}SAE的Rewrite (config.yaml)
代码语言:javascript复制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
代码语言:javascript复制[product]
;支持直接写PHP中的已定义常量
application.directory=APP_PATH "/application/" 控制器
在Yaf中, 默认的模块/控制器/动作, 都是以Index命名的, 当然,这是可通过配置文件修改的.
对于默认模块, 控制器的目录是在application目录下的controllers目录下, Action的命名规则是”名字+Action”
默认控制器application/controllers/Index.php
代码语言:javascript复制
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
代码语言:javascript复制
运行在浏览器输入
http://www.yourhostname.com/application/index.php
看到了Hello World输出吧?