# Yaf框架在windows(10)下的安装教程

**URL:** <https://www.shiqidu.com/t/topic/154>\
**Category:** 开发调优\
**Tags:** PHP\
**Created:** [2017 年3 月 7 日 02:46 UTC](https://www.shiqidu.com/t/topic/154 "2017-03-07T02:46:10Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![Eureka](https://www.shiqidu.com/user_avatar/www.shiqidu.com/eureka/32/5_2.png) [@Eureka](https://www.shiqidu.com/u/Eureka)\
发布日期： [2017 年3 月 7 日 02:46 UTC](https://www.shiqidu.com/t/topic/154/1 "2017-03-07T02:46:10Z")

</div>

早就听说圈内大大牛鸟哥的yaf性能多么厉害，因为框架底层是用c写的，以php扩展的形式存在的mvc框架。一直想研究下，一直又没有时间。

直到最近因为工作要求需要使用yaf，所以研究了一下怎么在windows下安装。

下面说下安装的流程。

### 1，下载

首先确定你本地的环境，我本地的环境如下

> windows版本：win10  
> 位数： 64位  
> PHP版本：7.0.4(TS)

确定你的php版本是TS还是NTS，好选择对应的yaf版本。

怎么看我们的php是ts还是nts呢，直接查看`phpinfo()`

![搜索[Thread Safety]看后面是enabled(ts)还是disabled(nts)](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be0f8b58d2c.png "搜索[Thread Safety]看后面是enabled(ts)还是disabled(nts)")

确定之后我们打开官网，yaf的官网地址:[http://pecl.php.net/package/yaf](http://pecl.php.net/package/yaf "http://pecl.php.net/package/yaf")

![我选的是最新版3.0.4](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be106daa3c8.png "我选的是最新版3.0.4")

因为是在windows安装，所以我们需要的是 **dll** 文件，点击后面的 **dll** 进入下载页面。

![](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be10cdb9cea.png)

选择合适的版本下载，我选的是 [7.0 Thread Safe (TS) x64](http://windows.php.net/downloads/pecl/releases/yaf/3.0.4/php_yaf-3.0.4-7.0-ts-vc14-x64.zip "7.0 Thread Safe (TS) x64") 版本。

下载完成后我们解压zip压缩包，会看到几个文件，我们需要的是其中的 **php\_yaf.dll**

![谁知道php_yaf.pdb是做什么用的](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be11c435a72.png "谁知道php\_yaf.pdb是做什么用的")

我们复制 **php\_yaf.dll** ，然后粘贴到你**本地php的扩展目录(ext)**

因为我使用的是wamppserver，所以我本地php的拓展目录是 `F:wamp64binphpphp7.0.4ext`

![直接把php_yaf.dll粘贴到这里](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be12a3bf5bd.png "直接把php\_yaf.dll粘贴到这里")

> 注意别放错了。以你的为准。

### 2，修改php.ini

上述步骤完成后，yaf的安装已经完成80%了，下面我们需要修改下 **php.ini** 文件。

![在下边加一句extension = php_yaf.dll](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be156250a75.png "在下边加一句extension = php\_yaf.dll")

加好之后，保存退出。然后重启apache。

然后再次查看`phpinfo()`

![Crtl+F搜索看有没有yaf](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be166f95b6b.png "Crtl+F搜索看有没有yaf")

如果看到上面的yaf模块，说明已经安装成功了。

### 3，输出Hello world

怎么输出hello,world呢？我们需要自动生成yaf项目目录的脚本。

```php
+ public
  |- index.php //入口文件
  |- .htaccess //重写规则
  |+ css
  |+ img
  |+ js
+ conf
  |- application.ini //配置文件
+ application
  |+ controllers
     |- Index.php //默认控制器
  |+ views
     |+ index //控制器
        |- index.phtml //默认视图
  |+ modules //其他模块
  |+ library //本地类库
  |+ models //model目录
  |+ plugins //插件目录
*/
define("APP_PATH", realpath(dirname( __FILE__ )) . DIRECTORY_SEPARATOR);
class app {

    // 创建项目目录结构
    public static function build_yaf_dir() {
        if(is_writeable(APP_PATH)) {
            $dirs = array(
                APP_PATH . 'public',
                APP_PATH . 'public' . DIRECTORY_SEPARATOR . 'css',
                APP_PATH . 'public' . DIRECTORY_SEPARATOR . 'img',
                APP_PATH . 'public' . DIRECTORY_SEPARATOR . 'js',
                APP_PATH . 'conf',
                APP_PATH . 'application',
                APP_PATH . 'application' . DIRECTORY_SEPARATOR . 'controllers',
                APP_PATH . 'application' . DIRECTORY_SEPARATOR . 'views',
                APP_PATH . 'application' . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . 'index',
                APP_PATH . 'application' . DIRECTORY_SEPARATOR . 'modules',
                APP_PATH . 'application' . DIRECTORY_SEPARATOR . 'library',
                APP_PATH . 'application' . DIRECTORY_SEPARATOR . 'models',
                APP_PATH . 'application' . DIRECTORY_SEPARATOR . 'plugins',
            );

            // 循环生成文件
            foreach ($dirs as $dir){
                if(!is_dir($dir)) mkdir($dir,0755,true);
            }

            // 写入入口文件public/index.php
            $content = <<<'EOT'
<?php  
define("APP_PATH", realpath(dirname( __FILE__ ) . '/../')); /* 指向public的上一级 */  
$app = new Yaf_Application(APP_PATH . "/conf/application.ini");  
$app->run();  
?>  
EOT;

            self::generateFile(APP_PATH . 'public' . DIRECTORY_SEPARATOR . 'index.php', $content);  
  
            // 写入重写规则  
            $content = <<<'EOT'
#.htaccess, 当然也可以写在httpd.conf  
RewriteEngine On  
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteRule .* index.php  
EOT;

            self::generateFile(APP_PATH . 'public' . DIRECTORY_SEPARATOR . '.htaccess', $content);  
  
            // 写入配置文件  
            self::generateFile(APP_PATH . 'conf' . DIRECTORY_SEPARATOR . 'application.ini', "[product]n;支持直接写PHP中的已定义常量napplication.directory=APP_PATH "/application/"n");  
  
            // 写入默认控制器  
            $content = <<<'EOT'
<?php  
class IndexController extends Yaf_Controller_Abstract {  
  
    // 默认Action  
    public function indexAction() {  
        $this->getView()->assign("content", "Hello World");  
    }  
}  
?>  
EOT;

            self::generateFile(APP_PATH . 'application' . DIRECTORY_SEPARATOR . 'controllers' . DIRECTORY_SEPARATOR . 'Index.php', $content);  
  
            // 写入默认Action的视图  
            $content = <<<'EOT'
<html>  
    <head>  
        <title>Hello World</title>  
    </head>  
    <body>  
        <?php echo $content;?>  
    </body>  
</html>  
EOT;

            self::generateFile(APP_PATH . 'application' . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . 'index' . DIRECTORY_SEPARATOR . 'index.phtml', $content);  
        }else{  
            header('Content-Type:text/html; charset=utf-8');  
            exit('项目目录不可写，目录无法自动生成！<BR>请使用项目生成器或者手动生成项目目录~');  
        }  
    }  
  
    // 生成文件  
    public static function generateFile($file, $content) {  
        if(!is_file($file)) {  
            file_put_contents($file, $content);  
        }  
    }  
  
}  
app::build_yaf_dir();

```

> 复制上面的代码，放到你项目的根目录下。 **注意删除定界符后多余的空格。**

然后我们在浏览器里运行这个脚本。成功后可以看到如下的目录。

![自动生成的项目目录](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be1832a1c5f.png "自动生成的项目目录")

然后我们把目录切换到 **public** 目录下，回车。

![yaf_sqd.com是我自己配置的虚拟域名](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be18c070f10.png "yaf\_sqd.com是我自己配置的虚拟域名")

至此yaf的安装基本完成啦，看到hello world是不是很激动呢^v^

### 4，IDE的自动补全

此时如果你用的是phpstorm，你会发现代码中一片黄色的警告，因为我们的ide没有找到相关的类和方法。

![](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be1a3ac2d88.png)

对于强迫症来说这简直是难以忍受的，而且没有自动补全的话，开发效率上也低很多。

这个时候就需要这个东西 [https://github.com/xudianyang/yaf.auto.complete](https://github.com/xudianyang/yaf.auto.complete "https://github.com/xudianyang/yaf.auto.complete"),网友写的一个yaf ide自动补全的插件。（其实就是一堆没有函数体的类）

然后我们需要把这个东西放到我们ide中，以phpstorm为例。（我的phpstorm版本是2016v3）

依次找到`File>Settings>Languages&Frameworks>PHP`

![](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be1ce4ed1ea.png)

点击右边的加号+选择刚才我们下载文件的路径，然后点Apply，确定退出。

![这时再看代码就没有可恶的屎黄色了](https://discourse.shiqidu.com/uploads_nj/article/2017-03-07/58be1e30a8553.png "这时再看代码就没有可恶的屎huang色了")

至此yaf在windows下的安装就结束了。
