业务经理

微信扫描以上二维码

028-61286886

技术咨询

在hooks里如何实现生成首页静态文件

迅睿框架 更新 2020-09-30 21:47:30 rewalax

请教一个代码实现:在hooks里如何实现生成首页静态文件。

思路:在“module_content_after”内容发布后挂钩点中执行生成首页静态代码。

问题:以下代码从“dayrui/Core/Controllers/Home.php”代码中复制过来的,虽然成功生成了index.html文件,但是里边的内容不对,检查了下发现主要是

\Phpcmf\Service::V()->display('index.html');方法并没有渲染出index模板内容,而是渲染了“/dayrui/Core/Views/share_list.html"的内容。

请问各路大神,应该如何修改才能实现内容发布后生成首页静态,谢谢。


附思路实现代码:

\Phpcmf\Hooks::on('module_content_after', function($data, $old) {
    // 内容发布或者修改之后
    
    ob_start();
    \Phpcmf\Service::V()->assign([
        'indexc' => 1,
        'fix_html_now_url' => defined('IS_MOBILE') && IS_MOBILE ? SITE_MURL : SITE_URL,
    ]);
    \Phpcmf\Service::V()->assign(\Phpcmf\Service::L('Seo')->index());
    \Phpcmf\Service::V()->display('index.html');
    $html = ob_get_clean();

    // 开启过首页静态时
    if (SITE_INDEX_HTML) {
        if (defined('IS_MOBILE') && IS_MOBILE) {
            // 移动端,当移动端独立域名情况下才生成静态
            if (SITE_MURL != SITE_URL) {
                file_put_contents(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', 'mobile/index.html'), $html);
            }
        } else {
            // pc
            file_put_contents(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', 'index.html'), $html);
        }
    }

});


方案

  • 靠悬赏赚钱买授权 #1 · 2020-09-03 20:31:49
    \Phpcmf\Hooks::on('module_content_after', function($data, $old) {
        // 内容发布或者修改之后
        
        dr_catcher_data(SITE_URL'index.php', 10);
    
    });
  • 周大侠 #2 · 2020-09-03 20:37:09
    楼主的代码完全错误的,一楼的代码理论上应该是对的
  • rewalax #3 · 2020-09-03 22:06:57
    靠悬赏(设置悬赏)赚钱买授权
    \Phpcmf\Hooks::on('module_content_after', function($data, $old) {
        // 内容发布或者修改之后
       
        $html = dr_catcher_data(SITE_URL.'index.php',30);
        
        // 开启过首页静态时
        if (SITE_INDEX_HTML) {
            if (defined('IS_MOBILE') && IS_MOBILE) {
                // 移动端,当移动端独立域名情况下才生成静态
                if (SITE_MURL != SITE_URL) {
                    file_put_contents(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', 'mobile/index.html'), $html);
                }
            } else {
                // pc
                file_put_contents(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', 'index.html'), $html);
            }
        }
    
    });
    并没有成功生成首页,生成一个0kb的index.html,请大侠明示。
  • 靠悬赏赚钱买授权 #4 · 2020-09-03 22:11:11
    哥,你代码太多了,改成我一楼梯写的代码啊,你为什么加一些无用的代码啊,你这样肯定是0kb啊
  • rewalax #5 · 2020-09-03 22:20:52
    靠悬赏(设置悬赏)赚钱买授权 还是不行啊,好像明白你意思了,相当于直接用这个函数访问一下首页,然后就会自动生成这个文件了,但实际并没有生成,你可以测试一下。另外你这个思路虽然可以解决需求,但相当于多了一次网络请求,不如官方的那种直接读取模板文件然后生成index.html内容效率高呀。还是非常感谢你的回复。
  • 百鬼夜行 #6 · 2020-09-03 22:23:19
    \Phpcmf\Hooks::on('module_content_after', function($data, $old) {
        // 内容发布或者修改之后
        
        dr_catcher_data(SITE_URL'index.php', 10); // pc
    
        dr_catcher_data(SITE_MURL'index.php', 20); // yd
    });
    pc和移动都有了,两句话就搞定,不用那么多,多了反而无用
  • rewalax #7 · 2020-09-04 06:53:57
    百鬼夜行 感谢回复,测试并不能成功生成。
  • 官方研发实习技术 #8 · 2020-09-04 08:23:04
    你要在hook里面二次开发,就不能使用控制器里面的代码,只能用一楼的代码,是最完美的了
  • rewalax #9 · 2020-09-04 08:26:59
    官方研发实习技术 谢谢官方技术,但是为什么实际使用中没有生成静态文件呢,直接访问首页是可以生成的。
  • 易学习 #10 · 2020-09-04 08:31:40
    满意答案
    \Phpcmf\Hooks::on('module_content_after', function($data, $old) {
        // 内容发布或者修改之后
        
        file_get_contents(SITE_URL'index.php');
    
    });
    这样写
  • rewalax #11 · 2020-09-04 08:36:40
    易学习 成功执行!有点奇怪官方dr_catcher_data函数是file_get_contents函数的加强版,不知道那个函数为什么没有成功生成静态首页
  • 易学习 #12 · 2020-09-04 08:38:54
    可能一楼的兄弟加了10参数吧,我习惯用php自带的函数,原理跟一楼一样
  • rewalax #13 · 2020-09-04 08:46:54
    易学习 去掉10参数也不行,找到官方dr_catcher_data的定义了,可能是官方用了curl。但是我的服务器也是支持curl的。可能是题外话了,但是强迫症还是想研究清楚,请大家不吝赐教。
    /**
     * 调用远程数据
     *
     * @param   string  $url
     * @param   intval  $timeout 超时时间,0不超时
     * @return  string
     */
    function dr_catcher_data($url, $timeout = 0) {
    
        // 获取本地文件
        if (strpos($url, 'file://')  === 0) {
            return file_get_contents($url);
        }
    
        // curl模式
        if (function_exists('curl_init')) {
            $ch = curl_init($url);
            if (substr($url, 0, 8) == "https://") {
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
            }
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            // 最大执行时间
            $timeout && curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
            $data = curl_exec($ch);
            $code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
            if (CI_DEBUG && curl_errno($ch)) {
                log_message('error', '获取远程数据失败['.$url.']:'.curl_error($ch));
            }
            curl_close($ch);
            if ($code == 200) {
                return $data;
            } else {
                return '';
            }
        }
    
        //设置超时参数
        if ($timeout && function_exists('stream_context_create')) {
            // 解析协议
            $opt = [
                'http' => [
                    'method'  => 'GET',
                    'timeout' => $timeout,
                ],
                'https' => [
                    'method'  => 'GET',
                    'timeout' => $timeout,
                ]
            ];
            $ptl = substr($url, 0, 8) == "https://" ? 'https' : 'http';
            $data = @file_get_contents($url, 0, stream_context_create([
                $ptl => $opt[$ptl]
            ]));
        } else {
            $data = @file_get_contents($url);
        }
    
        return $data;
    }
  • 易学习 #14 · 2020-09-04 08:57:13
    我不太懂程序,只是我经验比较多而已,能实现就行,我从来不去研究为什么
  • 帝云网络 #15 · 2020-09-04 09:35:59
    新版程序已支持自动生成首页了
  • perweb #16 · 2020-09-30 14:33:09
    最新版,首页自动生成静态,不起作用,是怎么回事?
  • rewalax #17 · 2020-09-30 21:47:30
    @易学习:感谢回复

迅睿系统漏洞

站群分站系统
站群分站系统(2026-10-15)
子站域名新增llms.txt访问
GEO系统
GEO系统(2026-10-14)
修复下载zip空白地址问题 修复流量复刻和任务队列错误
GeoSeo收录宝
GeoSeo收录宝(2026-10-14)
新增 站长工具箱 前端首页自动调用meta 数据
滑块验证码 Gocaptcha
滑块验证码 Gocaptcha(2026-10-13)
基于开源项目 go-captcha 的行为验证码插件,滑动拼图、区域...
GeoSeo工具箱
GeoSeo工具箱(2026-10-13)
优化巡检任务
GeoSeo排名助手
GeoSeo排名助手(2026-10-11)
加入大模型自定义
SEO聚合关键字
SEO聚合关键字(2026-10-11)
优化关键字列表页最多支持1万篇文章,过多会导致服务器扛不住;
CMS内容同步复制
CMS内容同步复制(2026-10-10)
增加时间是否更新的开关