分类 yii2 下的文章

yii2优化 - 开启 Schema 缓存

开启 Schema 缓存

Schema 缓存是一个特殊的缓存功能,每当你使用活动记录时应该要开启这个缓存功能。如你所知, 活动记录能智能检测数据库对象的集合(例如列名、列类型、约束)而不需要手动地描述它们。活动记录是通过执行额外的 SQL 查询来获得该信息。 通过启用 Schema 缓存,检索到的数据库对象的集合将被保存在缓存中并在将来的请求中重用。

在开发环境下,数据库表结构可能会经常变化,使用缓存可能会导致数据结构不一致的问题,所以主要用于生成环境。

要开启 Schema 缓存,需要配置一个 cache 应用组件来储存 Schema 信息,并在配置中设置
yii\db\Connection::enableSchemaCache 为 true:

需要注意的是,如果修改数据结构,在更新完 SQL 语句之后需要先关闭 Schema 再开启,数据结构的修改才会生效。

return [
    // ...
    'components' => [
        // ...
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=mydatabase',
            'username' => 'root',
            'password' => '',
            'enableSchemaCache' => true,

            // Duration of schema cache.
            'schemaCacheDuration' => 3600,

            // Name of the cache component used to store schema information
            'schemaCache' => 'cache',
        ],
    ],
];

转自 yii2优化 - 开启 Schema 缓存 - 简书 JustFantasy

yii 配置 web 服务器

配置访问地址

配置文档根目录(单个项目,或者主站)或虚拟主机,
基础版:basic/web
高级版:backend/web,frontend/web

推荐使用的Apache配置

在 Apache 的 httpd.conf 文件或在一个虚拟主机配置文件中使用如下配置。 注意,你应该将 path/to/basic/web 替换为实际的 basic/web 目录。

# 设置文档根目录为 "basic/web"
DocumentRoot "path/to/basic/web"

<Directory "path/to/basic/web">
    # 开启 mod_rewrite 用于美化 URL 功能的支持(译注:对应 pretty URL 选项)
    RewriteEngine on
    # 如果请求的是真实存在的文件或目录,直接访问
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # 如果请求的不是真实文件或目录,分发请求至 index.php
    RewriteRule . index.php

    # if $showScriptName is false in UrlManager, do not allow accessing URLs with script name
    RewriteRule ^index.php/ - [L,R=404]
    
    # ...其它设置...
</Directory>

推荐使用的 Nginx 配置

为了使用 Nginx,你应该已经将 PHP 安装为 FPM SAPI 了。 你可以使用如下 Nginx 配置,将 path/to/basic/web 替换为实际的 basic/web 目录, mysite.local 替换为实际的主机名以提供服务。

server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name mysite.test;
    root        /path/to/basic/web;
    index       index.php;

    access_log  /path/to/basic/log/access.log;
    error_log   /path/to/basic/log/error.log;

    location / {
        # Redirect everything that isn't a real file to index.php
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # uncomment to avoid processing of calls to non-existing static files by Yii
    #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
    #    try_files $uri =404;
    #}
    #error_page 404 /404.html;

    # deny accessing php files for the /assets directory
    location ~ ^/assets/.*\.php$ {
        deny all;
    }
    
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        #fastcgi_pass unix:/var/run/php5-fpm.sock;
        try_files $uri =404;
    }

    location ~* /\. {
        deny all;
    }
}

tip:

  • 使用该配置时,你还应该在 php.ini 文件中设置 cgi.fix_pathinfo=0 , 能避免掉很多不必要的 stat() 系统调用。
  • 还要注意当运行一个 HTTPS 服务器时,需要添加 fastcgi_param HTTPS on; 一行, 这样 Yii 才能正确地判断连接是否安全。

yii2获取ip信息

假设我们当前页面的访问地址是:http://localhost/CMS/public/index.php?r=news&id=1
一、
1、获取当前域名:echo Yii::app()->request->hostInfo;

结果:http://localhost

2、获取(除域名外的)当前URL: echo Yii::app()->request->getUrl();
结果:/CMS/public/index.php?r=news&id=1

3、获取(除域名外的)首页地址: echo Yii::app()->user->returnUrl;
结果:/CMS/public/index.php

4、获取(除域名外的)根目录地址:echo Yii::app()->homeUrl;
结果:/CMS/public/index.php

5、echo Yii::app()->request->baseUrl;
结果:/CMS/public

6、获取网站根目录相对地址:echo Yii::app()->baseUrl;
结果:/CMS/public (注意:如果直接用这种方法指向网站根目录,请最好在其后面添加一个“/”,因为有时如果不添加“/”,有可能不能正确指向网站根目录。应用举例:<a href="<?php echo Yii::app()->baseUrl ;?>/">Home</a>

二、
7、YII获取 IP地址:Yii::app()->request->userHostAddress;
Yii::$app->request->userIp;

8、Yii判断提交方式:Yii::app()->request-isPostRequest;

9、proteced目录的物理路径:Yii::app()->basePath;

10、获取上一页的url以返回:Yii::app()->request->urlReferrer;

11、获取当前控制器ID:Yii::app()->getController()->getAction()->id;

12、项目路径:dirname(Yii::app()->BasePath);

13、Yii获取get,post过来的数据:Yii::app()->request->getParam('id');

备注:用$app替代app()