前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Yaf---写在前面

Yaf---写在前面

作者头像
Marco爱吃红烧肉
发布于 2021-07-23 07:26:33
发布于 2021-07-23 07:26:33
2K00
代码可运行
举报
文章被收录于专栏:无敌小笼包无敌小笼包
运行总次数:0
代码可运行

Yaf有着和Zend Framework相似的API, 相似的理念, 而同时又保持着对Bingo的兼容, 以此来提高开发效率, 规范开发习惯. 本着对性能的追求, Yaf把框架中不易变的部分抽象出来,采用PHP扩展实现(c语言),以此来保证性能.在作者自己做的简单测试中, Yaf和原生的PHP在同样功能下, 性能损失小于10%, 而和ZendFramework的对比中, Yaf的性能是Zend Framework的50-60倍.

天下武功无坚不破,唯快不破

  1. 用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销.
  2. 所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存.
  3. 更短的内存周转周期, 提高内存利用率, 降低内存占用率.
  4. 灵巧的自动加载. 支持全局和局部两种加载规则, 方便类库共享.
  5. 高性能的视图引擎.
  6. 高度灵活可扩展的框架, 支持自定义视图引擎, 支持插件, 支持自定义路由等等.
  7. 内建多种路由, 可以兼容目前常见的各种路由协议.
  8. 强大而又高度灵活的配置文件支持. 并支持缓存配置文件, 避免复杂的配置结构带来的性能损失.
  9. 在框架本身,对危险的操作习惯做了禁止.
  10. 更快的执行速度, 更少的内存占用

Yaf的安装 Windows

Yaf只支持PHP5.2及以上的版本 Yaf需要SPL的支持. SPL在PHP5中是默认启用的扩展模块 Yaf需要PCRE的支持. PCRE在PHP5中是默认启用的扩展模块 在 Windows 系统下安装 PHP 5.2+

  1. 打开yaf在php官网上的目录:http://pecl.php.net/package/yaf
  2. 目前yaf的最新版为3.0.0,仅支付php7,建议选择2.3.5版本
  3. 我这里选择2.3.5后面的win图标+DLL字样的链接,进入页面下载php_yaf.dll
  4. 在打开的页面根据自己的环境来选择对应的版本,我这里选择的是php5.6 Thread Safe (TS)x86(php5.6版本 安全线程 32位操作系统)
  5. 点击后自动下载了一个压缩包:php_yaf-2.3.5-5.6-ts-vc11-x86.zip
  6. 把压缩包中的php_yaf.dll复制出来,打到你的php目录,打开目录下的ext文件夹,粘贴进去
  7. 再打开您的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
代码运行次数:0
运行
AI代码解释
复制
├──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
代码运行次数:0
运行
AI代码解释
复制
<?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)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#.htaccess, 当然也可以写在httpd.conf
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php

Nginx的Rewrite (nginx.conf)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
$HTTP["host"] =~ "(www.)?domain.com$" {
  url.rewrite = (
     "^/(.+)/?$"  => "/index.php/$1",
  )
}

SAE的Rewrite (config.yaml)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
[product]
;支持直接写PHP中的已定义常量
application.directory=APP_PATH "/application/" 

控制器

在Yaf中, 默认的模块/控制器/动作, 都是以Index命名的, 当然,这是可通过配置文件修改的. 对于默认模块, 控制器的目录是在application目录下的controllers目录下, Action的命名规则是”名字+Action”

默认控制器application/controllers/Index.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
 <head>
   <title>Hello World</title>
 </head>
 <body>
  <?php echo $content;?>
 </body>
</html>

运行在浏览器输入

http://www.yourhostname.com/application/index.php

看到了Hello World输出吧?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
适合初学者对Yaf框架的学习(二)
前言 上一篇介绍了Yaf的安装,适合初学者对Yaf框架的学习(一)http://www.cnblogs.com/joshua317/articles/4622551.html,这篇来介绍一下Yaf的布局 一、Yaf的目录结构 1 YafWeb 2 index.php #入口文件 3 application #应用目录 4 Bootstrap.php 5 controllers #控制器目录 6 Index.php #默认In
joshua317
2018/04/16
1.1K0
适合初学者对Yaf框架的学习(二)
yaf源码阅读
yaf的入口是yaf_application类,我们可以做一些个性化的定制配置,然后调用run,进入主循环。
golangLeetcode
2022/08/02
4940
yaf源码阅读
Thinkphp
thinkphp:mvc模式 1,thinkphp的安装配置 条件 PHP>=5.4.0 PDO MbString CURL PHP Externsion Mysql Apache或Nginx 安装: composer composer config -g repo.packagist composer https://packagist.phpcomposer.com composer create-project --prefer-dist topthink/think think_co
Dean0731
2020/05/11
2.1K0
访问网站首页 index.php,跟着执行流程走一遍
访问网站首页 index.php,跟着执行流程走一遍,细节不深究,碰到不太明白的变量,直接var_dump()输出看看: 1. index.php——首页入口页面,版本判定、是否开启调试、引入 ThinkPHP框架 路径:‘./index.php‘ 判断PHP版本需是5.3.0以上:version_compare(PHP_VERSION,‘5.3.0‘,‘<‘); 系统调试设置:define(‘APP_DEBUG‘, true ); 应用目录设置:define ( ‘APP_PATH‘, ‘./Application/‘ ); 缓存目录设置:define ( ‘RUNTIME_PATH‘, ‘./Runtime/‘ ); 引入ThinkPHP:require ‘./ThinkPHP/ThinkPHP.php‘; 2. ThinkPHP.php——ThinkPHP框架的入口文件,定义各种常量、判断系统环境,初始化应用 路径:‘./ThinkPHP/ThinkPHP.php‘ 定义常量:版本号 THINK_VERSION、URL 模式定义(4 种模式)、类文件后缀 EXT、是否为SAE 环境、常用的系统路径常量(如Think类库目录、应用公共目录、缓存目录、配置目录等); 引入核心类Think.class.php:require CORE_PATH.‘Think‘.EXT; 应用初始化:Think\Think::start(); //命名空间\类名::方法(); //这里用到了命名空间 3. Think.class.php——框架的核心类,初始化应用程序,加载配置、类库,错误和异常处理,实例化对象 路径:‘./ThinkPHP/Library/Think/Think.class.php‘ 声明:Think\Think start()方法:加载需用的类、配置、语言包,是否需要缓存,运行应用 ①设定方法: spl_autoload_register(‘Think\Think::autoload‘); 自动加载类的方法,以及一些错误异常处理方法; ②分布式存储类初始化,用于读取、写入、删除文件;Storage::connect(STORAGE_TYPE); ③开发模式不缓存加载的核心类文件$runtimefile,用户模式将所有需引用的类并到同一个文件中缓存,加快后续访问速度。 ④加载应用的配置文件、需要的函数和类文件、行文扩展等文件路径的数组$mode;include ‘./ThinkPHP/Mode/common.php‘ ⑤循环加载处理$mode 数组中的各路径的文件; ⑥检查应用目录结构是否存在,不存在则会默认生成目录结构;(这个针对ThinkPHP新建一个应用,首次访问时使用) ⑦开始运行应用 App::run(); 即:‘./ThinkPHP/Library/Think/App.class.php‘ 4. App.class.php——加载公共文件配置、URL解析、调用对应的控制器方法 路径:‘./ThinkPHP/Library/Think/App.class.php‘ 声明:Think\App run()方法: ①App::init(); load_ext_file 加载应用的公共文件(./Application/Common/Common/)配置 (./Application/Common/Conf) Think\Dispatcher::dispatch(); URL解析,获取控制器 index、方法 index ②App::exec(); 执行应用程序,及新建控制器HomeConstroller 的实例,即对象; 创建控制器实例:$module = controller(CONTROLLER_NAME,CONTROLLER_PATH); 即=new IndexController(); 利用 php 反 射 机 制 获 取 action 方 法 对 象 , $method = new \ReflectionMethod($module, $action); 执行这个方法:$method->invoke($module); //无参数时执行,访问首页默认执行这个 $method->invokeArgs($module,$args); //有参数时执行; 以上即执行了控制器 ./Application/Hom
PM吃瓜
2019/08/13
3.9K0
Thinkphp入口文件和路由
index.php => define('BIND_MODULE', 'index');
PM吃瓜
2019/08/12
1.5K0
Thinkphp入口文件和路由
ThinkPHP 3.2.3 简单后台模块开发(一)常用配置
下载解压 ThinkPHP 3.2.3,在默认的应用 Application(./Application) 中,包含一个默认的模块 Home(./Application/Home)。
botkenni
2022/01/10
2.1K0
ThinkPHP 3.2.3 简单后台模块开发(一)常用配置
thinkphp创建应用的一般流程
下载完成后,解压,将文件里的ThinkPHP文件夹复制,我们在XAMPP/htdocs目录(服务器或者本地web目录)下新建一个文件bookstore文件夹,再将ThinkPHP文件夹拷贝到bookstore文件夹路径下
PM吃瓜
2019/08/13
1.5K0
[PHP] Yaf框架的简单安装使用
windows下载扩展:https://pecl.php.net/package/yaf/2.2.9/windows
唯一Chat
2019/09/10
5580
[PHP] Yaf框架的简单安装使用
搭建自己的PHP MVC框架详解
本文详细讲述了搭建自己的PHP MVC框架的方法。分享给大家供大家参考,具体如下: 前言 说到写PHP的MVC框架,大家想到的第一个词--“造轮子”,是的,一个还没有深厚功力的程序员,写出的PHP框架肯定不如那些出自大神们之手、经过时间和各种项目考验的框架。但我还是准备并且这么做了,主要是因为: 认为有关PHP的方方面面都了解了,但自己学习PHP的时间还短,基础并不扎实,很多常用函数的参数还偶尔要查手册,而且对于PHP的一些较新的特性如命名空间、反射等只是简单的看过,并没有能实际应用过。 PHP的知识多且杂,一个普通的项目往住是业务逻辑代码为主,而框架是一个能把这些知识点能融汇在一起的项目。 在自己写一个框架的时候,也会参考一些我使用过的框架如TP/CI/YII等的源码,在自己看源码时也能帮助自己理解框架,更容易接受以后要使用的框架。 所以说,这次造轮子的目的不是为了造轮子而是为了在造轮子的过程中熟悉其工艺,轮子特点,更好的使用轮子。 如果说写一个完整的PHP框架,那需要掌握的PHP知识点非常多,像设计模式、迭代器、事件与钩子等等,还有许多基础知识的灵活应用。我自认为这些还无法完全掌控,所以我的步骤是先自己搭建一个骨架,然后参考借鉴不同的PHP框架的特点,将其慢慢完善。因为工作原因,而且晚上还要补算法、网络等编程基础,PHP框架部分可能只有周末有时间更新,我会在进行框架功能更新之后,使用的知识点,更新博文。 首先放上框架的目前源码:GITHUB/zhenbianshu 或者点击此处本站下载。 框架整体 首先自己一下PHP的MVC框架的工作流程: 简单来说,它以一个入口文件来接受请求,选择路由,处理请求,返回结果。 当然,几句话完的东西实际上要做的工作很多,PHP框架会在每次接受请求时,定义常量,加载配置文件、基础类,根据访问的URL进行逻辑判断,选择对应的(模块)控制器和方法,并且自动加载对应类,处理完请求后,框架会选择并渲染对应的模板文件,以html页面的形式返回响应。在处理逻辑的时候,还要考虑到错误和异常的处理。 1、作为MVC框架,一定要有一个唯一的入口文件来统领全局,所有的访问请求都会首先进入这个入口文件,如我框架根目录的index.php,在里面,我定义了基本文件夹路径,当前环境,并根据当前环境定义错误报告的级别。 2、PHP中加载另外的文件,使用require和include,它们都是将目标文件内容加载到当前文件内,替换掉require或include语句,require是加载进来就执行,而include是加载进来在需要的时候执行,而它们的_once结构都是表示在写多次的时候只执行一次。 3、框架内的配置变量等使用专用的配置文件来保存,这里我仿照了TP里的数组返回法,用了一个compileConf()函数来解析数组,将数组的键定义为常量,值为数组的值。
用户2323866
2021/06/30
1.1K0
[php]yaf框架熟悉
使用conf中的配置文件application.ini(取目录/application) 调用/application/Bootstrap.php,把这个项目跑起来
杨肆月
2021/01/26
8160
[php]yaf框架熟悉
Yaf---加载规则插件使用
Yaf在自启动的时候, 会通过SPL注册一个自己的Autoloader, 出于性能的考虑, 对于框架相关的MVC类, Yaf Autoloader只以目录映射的方式尝试一次.
Marco爱吃红烧肉
2021/07/23
7280
Yaf---Session | 模板 | 模型 | Cli模式
Yaf_Session是Yaf对Session的包装, 实现了Iterator, ArrayAccess, Countable接口, 方便使用.关于Yaf_Session的文档介绍:http://www.laruence.com/manual/yaf.class.session.html
Marco爱吃红烧肉
2021/07/23
2K0
ThinkPHP 简易开发思路 && MVC和URL跳转
这段时间在看PHP代码审计相关知识,国内有不少CMS都是基于ThinkPHP开发的,因此了解ThinkPHP的开发思路更容易理解这类CMS的代码
安全小王子
2020/07/31
1.2K0
ThinkPHP 简易开发思路 && MVC和URL跳转
代码迁移之旅(二)- 渐进式迁移方案
枕边书
2018/01/04
1.8K0
代码迁移之旅(二)- 渐进式迁移方案
Class '\Yaf\Application' not found 的报错排查,已经解决【php】
2.php -i | grep yaf 已经开启,并没有打开yaf.use_namespace
sinnoo
2020/11/13
1.3K0
轻量级高性能PHP框架ycroute
框架由3层架构构成,Controller、Model、View 以及1个可选的Dao层,支持PHP7,优点如下:
猿哥
2019/03/13
1.6K0
Thinkphp框架的项目规划总结和踩坑经验
1、项目分为PC端、移动端、和PC管理端,分为对应目录为 /Application/Home,/Application/Mobile,/Application/Admin;
PM吃瓜
2019/08/12
2.5K0
Thinkphp框架的项目规划总结和踩坑经验
Yaf---异常和错误 | 路由和分发
Yaf实现了一套错误和异常捕获机制, 主要是对常见的错误处理和异常捕获方法做了一个简单抽象, 方便应用组织自己的错误统一处理逻辑。前题是需要配置过或是在程序中启用
Marco爱吃红烧肉
2021/07/23
9230
ThinkPHP框架运行流程
$GLOBALS['_beginTime'] = microtime(TRUE);
PM吃瓜
2019/08/13
1.2K0
详解ThinkPHP支持的URL模式有四种普通模式、PATHINFO、REWRITE和兼容模式
0 PATHINFO模式 1 REWRITE模式 2 兼容模式 3
全栈程序员站长
2022/07/07
1.7K0
相关推荐
适合初学者对Yaf框架的学习(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文