Yii2 生成纯静态html文件 [ 2.0 版本 ]
方法一. 重写yii\web\Controller::afterAction($action, $result)
方法:
<?php
namespace frontend\controllers;
use Yii;
use yii\helpers\FileHelper;
use yii\helpers\Url;
use yii\web\Controller;
class ArticleController extends Controller
{
public function afterAction($action, $result)
{
$route = $action->controller->actionParams;
array_unshift($route, $action->controller->id . '/' . $action->id);
$path = Url::to($route); // '/article/view/104.html'
if(substr($path, 0, 1) === '/'){
$path = substr($path, 1); // 'article/view/104.html'
}
FileHelper::createDirectory(dirname($path)); // 创建目录
file_put_contents($path, $result); // 写入文件
return parent::afterAction($action, $result); // TODO: Change the autogenerated stub
}
}
但是这个方法有一个弊端,就是必须访问了某个页面,才能生成静态html文件,如果没有访问,就无法生成了。
方法二. 在actionMothod()
中调用runAction($id, $params = [])
方法获取动作的执行结果:
<?php
namespace frontend\controllers;
use common\models\Article;
use Yii;
use yii\helpers\FileHelper;
use yii\helpers\Url;
use yii\web\Controller;
class ArticleController extends Controller
{
public function actionIndex()
{
$lists = Article::find()->where(['status'=>10])->column(); // id 列表
foreach($lists as $list){
$path = Url::to(['acticle/view', 'id'=>$list]); // '/acticle/view/104.html'
if(substr($path, 0, 1) === '/'){
$path = substr($path, 1); // 'article/view/104.html'
}
FileHelper::createDirectory(dirname($path)); // 创建目录
$result = self::runAction('view', ['id'=>$list]); // 获取执行结果
file_put_contents($path, $result); // 写入文件
}
}
}
方法三. 调用 Yii::$app->runAction($route, $params = []) 方法获取执行结果:
<?php
$path = Url::to(['article/view', 'id'=>104]); // '/acticle/view/104.html'
if(substr($path, 0, 1) === '/'){
$path = substr($path, 1); // 'article/view/104.html'
}
FileHelper::createDirectory(dirname($path)); // 创建目录
$result = Yii::$app->runAction('article/view', ['id'=>104]); // 获取执行结果
file_put_contents($path, $result); // 写入文件
但是这三种方法都不能跨应用调用,也就是不能在backend中生成frontend中的html文件,不知道哪位大神有更好的方法???
墨轩娣 无锡
注册时间:2015-03-25
最后登录:6小时前
在线时长:275小时1分
最后登录:6小时前
在线时长:275小时1分
- 粉丝38
- 金钱59785
- 威望150
- 积分64035
共 3 条评论
我按照第一种方法写,的确可以生成静态页,但是如果后台对数据进行了修改,前台访问的还是之前生成的静态页,数据并没有变化,该如何解决呢?另外能不能在后台对生成静态页做管理呢?
在后台调用生成静态页的前台控制器方法啊
@墨轩道人 是的,感谢!
可以考虑按照PHPCMS的设计思路,在数据库里保存URI,然后你就知道HTML放哪里了,更新的时候删除这个HTML文件即可。
补充一下,生成HTML你需要把HTML中跟用户状态相关的都用JS或者AJAX调用。
我觉得吧,企业站性能损耗小,直接写个伪静态+页面缓存就好了,大型站点根本又用不着静态页面,都是什么鬼CMS带起来的纯静态的风,实在是没必要折腾这些