落叶之前在CHINAZ发布了一系列关于PHPCMS、织梦及帝国这三款CMS对比分析文章,在对比分析中出现过对PHPCMS部分功能和架构设计方式明显的偏好,一些站长朋友们在评论中多提到落叶在为PHPCMS捉刀的质疑。本文中落叶详细分析下PHPCMS2008中一直存在的并且在sp4最终版中仍然存在的严重甚至低级的问题及一些使用中遇见的“见鬼”的问题。
A、低级问题/BUG:
1.删除栏目时所有子栏目和子栏目下所有文章不作任何提示,直接删除。
一般的思路时,如果栏目下有子栏目,或者栏目下已经有多篇文章,删除时应该提示该栏目不允许删除,或者至少应该给出危险警告,结果PHPCMS中是一不小心,点删除栏目,然后弹出的JS中“是否要删除栏目”点了确定后,就一下子所有子栏目全部干掉了,这也意味着这些所有栏目下的文章也没办法显示了。虽然可以根据PHPCMS中DATA目录下的栏目缓存中手动在数据库中找回这些栏目,但这个引起的麻烦自不待言了。
很多新技术员进来时,使用PHPCMS套站时,我都很明确的说明,PHPCMS后台不允许做任何删除操作,然而还是常有因为误点击而导致几十个子栏目及栏目因为这样的误点击全部消失的情况。不过,落叶在新站规划时,一般都会修改PHPCMS栏目删除对应方法,删除前先查询栏目是否有子栏目,然后子栏目是否有文章,如果有需先删除文章,再删除子栏目,才能删除父栏目。
2.移动栏目后栏目关系字段没能正确更新,删除原栏目的父栏目,已经移走的子栏目会跟着被全部干掉
落叶不止一次发生过这样的杯具,原来B栏目是A栏目的子栏目,后来想到B栏目独立出来做一级栏目更好,于是把B栏目修改为一级栏目,然后更新栏目缓存,修复栏目数据,心想这下应该没问题了,然后删掉A栏目,结果大杯具发生了,整个A栏目及B栏目以及B栏目以下的所有栏目跟着被删除了。
问题出现的原因:PHPCMS无限级分类每个分类中以arrchildid字段记录了所有子栏目的ID,当把B栏目称出后,PHPCMS程序中没能对B栏目的原父栏目的相关字段正常更新,结果删除A栏目时,遍历arrchildid中的所有子栏目,括B栏目,一起全部干掉了。
3.添加栏目时缓存重复更新,栏目多后修改栏目保存时慢到不可理解的问题。
PHPCMS在编辑栏目后保存时,会自动调用修复栏目的repair()方法和更新所有栏目缓存的cache()方法,并且repair()方法中本身调用了一次cache()方法,结果导致的问题是每次编辑,栏目缓存都会全部更新两次,当栏目比较多时,每次都重新生成一次缓存,效率自然会降低,但一般这还不至于导致很明显的慢。更杯具的是,PHPCMS黄页模块的产品分类均存储在栏目表中,黄页意味着有大量的多级产品分类,这样一来,每次在编辑内容模型的某个栏目时,整个栏目表都会跟随着更新两次缓存,几百个栏目的缓存重新更新,并且写入方式是file_put_contents,结果的杯具是,编辑栏目后保存时一直卡在那里无论怎么点就是更新不动,关掉重新开,发现编辑的内容又是保存成功的。
落叶一直的解决办法是,修改PHPCMS编辑栏目后调用的缓存更新方法,只让他更新所涉及到的栏目的缓存。这样的好处是临时比较慢,不会花无用的时间去更新大量不需要更新的栏目的缓存。缺点是会导致相关联的栏目缓存没有及时更新。不过,这个不是问题,等栏目全部修改完成后,再在后台点一次更新所有缓存,这下慢就慢吧,点了不管,他自会更新完。
4.删除文章,静态页没有跟着删除。
一般的设计按理应该是删除文章的同时,对应删除的静态文件,但不知道为什么PHPCMS中没有这样,结果是很多文章已经删除了,但静态页还是被收录了,并且都是老的一些无用的测试页面或者模板列换前的页面。这时候想将这些的页面去删除只有人工去找了。
5.内容页模板无法批量更换的问题。
很多时候,程序上站设置好栏目等,设计美工处理模板界面,然后编辑同时发文章,然而因为模板还没有做出来,默认栏目设置中内容页模板都是选择的默认show.html模板,发的文章的Template字段中记录的也是show.html模板,然后设计那边模板做出来后,如果不用默认的show.html文件名,而是show_new.html模板时,本来应该可以直接栏目修改时,选择新模板,然后勾选“将这些修改全部应用到子栏目及内容页”,实现内容页模板更换的。相信PHPCMS官方的本意也是如此的,可结果勾了也白勾,内容页模板原来是啥还是啥,这时候不得不手动一篇文章一篇去修改,或者到数据库中替换。
6.列表页GET标签调用文章列表,分页链接跳到后台的问题。
这个问题出现的大概原因是GET标签中的分页page参数,与列表页内置获取的分页参数产生冲突,生成静态时参数冲突,分页出错。而使用默认TAG标签时不会有错。
B、经常遇到的“见鬼”的问题:
1.无论怎么改模板,生成页面,始终不变的问题
这个是用户自己的问题,也是PHPCMS的问题。之所以说是用户自己的问题,那是因为他反复刷新的页面并不是真这的最新生成的改变后的静态页面。之所以说是PHPCMS的问题,那是因为在某些情况下,修改栏目后,栏目URL规则自动在不知情的情况下(修改栏目时,URL规则选项是以TAB选项卡的方式展示,修改其它选项卡下信息时,会难注意URL规则所在的选项卡中的变化而直接保存),变会到默认的URL规则,然后用户生成页面后,新页面生成在默认URL规则对应的栏目下,而用户并没有全站生成,点击栏目导航访问时还是旧页面,所以无论怎么刷新也不变的见鬼的问题。
这个问题当有意去编辑栏目进行测试时,难以复现,但是落叶之前一天多时,经常遇到,最近一些新的技术在处理PHPCMS是经常抓狂的仍然是这个问题。上传模板,生成静态,刷新刷新再刷新,就是不变。
另外,还有很多更新后发现不变化的情况均因PHPCMS的缓存所至,无论是编辑系统设置还是修必栏目后都需更新修复栏目数据,更新缓存才能生效,但不知道为什么,很多时候需要重新编辑好几遍,更新好几次后才能生效。
再就是URL更新了,更换URL规则后,数据库中记录的URL路径没有变,需要先更新URL后再生成静态才有效,但很多由于忘掉而无论怎么生成也没用的。
2.模板可视化情况下碎片无法点击添加或修改的问题
这个是程序员或者美工自己的问题,碎片变为可点击状态需要页面调用JQUERY框架,用户制作的模板如果没有加截这个框架或者相关页面没有加载这个框架,那就出现这个问题。
3.文章提交总是出现phpcms_search' is marked as crashed and should be repaired的问题。
这个问题就是phpcms_search数据表损坏了,落叶此前也是经常碰到了,现在编辑基本每隔一两天都会碰到这个表损坏而无法添加数据的问题。
这个表是为PHPCMS中实现全文搜索和全文索引而设计的,每添加一篇文章,文章全文内容都会经分词处理后,存储到这个表中,写入操作比较频繁,但是我不太清楚,为什么这个表会这么容易损坏,频繁出奇的高。当然见怪不怪时也就淡定了,因为PHPCMS后台自带的数据表修复功能还是很强大的。现在编辑在添加文章时发现数据表损坏,已经不找程序员了,直接自己在后台系统工具里点数据库修复搞定。
作者相关文章:
PHPCMS、帝国CMS及织梦对比(七)之自定义表单功能分析
PHPCMS 、织梦及帝国对比(八)之SEO辅助功能及个性化调用分析
作者:落叶(t.qq.com/guohui) 网站:http://www.pmume.com
落叶原创首发CHINAZ,尊重版权,转载请保留作者信息及链接。