优化ecmall2-速度(2)--缓存模板--更新(缓存首页)

2016-07-07 16:49 来源:www.chinab4c.com 作者:ecshop专家

缓存模板--总感觉ecmall2有时慢的进

本来是打算全站静态的,但是考虑到商城的特殊原因,并不需要把某一篇文件放在那里很久。所以转而缓存模板文件,以达到加快ecmall2速度的目的。
这篇比上一篇更加实用,因为如果是缓存模板文件的话,那就算不使用内存来缓存从数据库读取的数据也没关系,因为最后会把模板文件连同数据一起缓存进一个文件,那后面读取时就只读取这个文件而不用再去缓存数据库,但与静态化有点不同,这个文件里面还有一点php信息,并不能用来直接输出,模板引擎会在去掉这点php信息后输出。
我在使用ecmall2时也觉得有时反应不过来,相比来讲ecshop还快,经过观察,其实ecshop在display时是加了一个id的,就是用来缓存这次输出的。而我们现在要做的就是在ecmall2里面实现缓存模板输出,通俗点讲就是在$this->display()时给一个id这个id要唯一。
其实所有的东西ecmall2已经准备好了,只是不知道为什么没有使用,详细的原理不再介绍修改完后就可以使你的商城在运行方面的速度上一层楼,但是网络方面可不包哦。

我们以商品详细页为例
1、修改app/goods.app.php的index方法的最后一行成这样{$this->display('goods.index.html','goods_detail_'.$id);}(不包括大括号,以下不再提示)。
2、app/frontend.base.php文件里面的class StorebaseApp extends FrontendApp类的function _config_view()方法里的最后添加如下代码{$this->_view->cache_dir= ROOT_PATH . "/temp/html_cache/store/{$template_name}";}这里设置缓存的目录。
3、再找到app/frontend.base.php的class FrontendApp extends ECBaseApp类的function display($tpl)方法的方法名改成这样{function display($tpl,$cache_id="")}接着把方法里面的parent::display($tpl);改成{parent::display($tpl,$cache_id);}。
4、找到includes/ecapp.base.php里的function display($f)方法的方法名改成{function display($f,$cache_id="")},以及里面的parent::display($f);改成{parent::display($f,$cache_id);}。
5、eccore/controller/app.base.php里面的function display($n)方法改成{function display($n,$cache_id='')},以及里面的$this->_view->display($n);改{$this->_view->display($n,$cache_id);}。

再修改eccore/view/template.php的function fetch($filename, $cache_id = '')方法如下。
  1. function fetch($filename, $cache_id = '')
  2. {
  3. if (!$this->_seterror)
  4. {
  5. error_reporting(E_ALL ^ E_NOTICE);
  6. }
  7. $this->_seterror++;

  8. if (strncmp($filename,'str:', 4) == 0)
  9. {
  10. $out = $this->_eval($this->fetch_str(substr($filename, 4)));
  11. }
  12. else
  13. {
  14. if ($this->_checkfile)
  15. {
  16. if (!is_file($filename))
  17. {
  18. $filename = $this->template_dir . '/' . $filename;
  19. }
  20. }
  21. else
  22. {
  23. $filename = $this->template_dir . '/' . $filename;
  24. }

  25. if ($this->direct_output)
  26. {
  27. $this->_current_file = $filename;
  28. $out = $this->_eval($this->fetch_str(file_get_contents($filename)));
  29. }
  30. else
  31. {

  32. if ($this->is_cached($filename,$cache_id)&&$cache_id && $this->caching)
  33. {
  34. $out = $this->template_out;
  35. }
  36. else
  37. {
  38. if (!in_array($filename, $this->template))
  39. {
  40. $this->template[] = $filename;
  41. }

  42. $out = $this->make_compiled($filename);

  43. if ($cache_id)
  44. {
  45. if ($this->appoint_cache_id)
  46. {
  47. $cachename = $cache_id;
  48. }
  49. else
  50. {
  51. $cachename = basename($filename, strrchr($filename, '.')) . '_' . $cache_id;
  52. }
  53. $data = serialize(array('template' => $this->template, 'expires' => $this->_nowtime + $this->cache_lifetime, 'maketime' => $this->_nowtime));
  54. $out = str_replace("\r", '', $out);

  55. while (strpos($out, "\n\n") !== false)
  56. {
  57. $out = str_replace("\n\n", "\n", $out);
  58. }

  59. if (!file_exists($this->cache_dir))
  60. {
  61. ecm_mkdir($this->cache_dir);
  62. }

  63. if (file_put_contents($this->cache_dir . '/' . $cachename . '.php', '<?php exit;?>' . $data . $out, LOCK_EX) === false)
  64. {
  65. trigger_error('can\'t write:' . $this->cache_dir . '/' . $cachename . '.php');
  66. }
  67. $this->template = array();
  68. }
  69. }
  70. }
  71. }

  72. $this->_seterror--;
  73. if (!$this->_seterror)
  74. {
  75. error_reporting($this->_errorlevel);
  76. }

  77. return $out; // 返回html数据
  78. }
复制代码
怎么样确定成功没有呢?你打开一个商品详细页面,多刷新几次,如果下面的执行时间不变就表示成功。

其实用这个方法,你甚至可以给商城的商品分类、店铺的商品分类都缓存起来,条件是你要给$this->display()方法一个能确定唯一的id。

现在的问题:
这些修改后好像是不会在固定时间后自动更新的缓存的,你可以去temp/html_cache/下面删除所有的东西,就会重新生成缓存了。

另外,我会继续研究,会有一个比较完善的生成静态的方案,但是应该是收费的(如果有资源的朋友可以过来互换啊,或者能成为核心交流人员的可以免费提供),但基本都是基于这些代码了。

下一个目标,还没有发现,如果你发现了需要优化的地方,请告诉我,前提是这个改进对大家都有用的。
欢迎传播,愿结交更多朋友。


回答:
顶~~支持!!

找时间在看~

顶你没商量!!!

朋友的朋友说首页加载有点慢,也确实,首页是最常被访问的,应该缓存这个页面,如果你按照上面的做了,现在只要改两处就可以了。
重复上面第二步但有点不同。
app/frontend.base.php文件里面的class MallbaseApp extends FrontendApp类的function _config_view()方法里的最后添加如下代码{$this->_view->cache_dir= ROOT_PATH . "/temp/html_cache/mall/{$template_name}";}这里设置缓存的目录。

然后就是打开app/default.app.php,修改$this->display('index.html','mall_default_page');成这样即可缓存,因为首页并不接受参数,所以这个id就是唯一的。
ok,完工。


顶起呀,火火的...

强烈支持~~~太感谢了~

不错,等LZ的好消息
管方也要关注一下,不然都要跑到shopcn去了