因为emlog设计上的原因,当标签数量过多时会严重影响到程序的运行速度.一般情况下这种情况是不会出现了.除非像我们这样为了让一篇文章实现多个"分类"而"滥用"标签的话,结果就另当别论了.
在发布文章添加标签的时候,我们会看到这么一句话"文章标签,逗号或空格分隔,过多的标签会影响系统运行效率".实际情况就如这句话说的一样,真的会影响系统运行速度的.为什么会这样呢?让我们来看看emlog是怎样实现文章标签的功能的吧.
添加标签的函数在tag_model.php的标签功能模块中.实现的方法是先判断一个标签名称是否在标签表中存在,如果不存在则插入一行并添加该文章的id.否则就更新指定标签的内容,连接追加该文章的id.然后进行循环直到添加玩该文章的所有标签.更新标签也是一样的道理.
从这里可以看出,系统的标签数量会直接影响这个函数的执行速度.
当系统有100个标签时,文章中的每个标签都将会进行最少100次的查询判断.如果一篇文章像我一样添加10个标签,则这篇文章需要进行1000次数据表查询.
如果系统中有1000个标签的话,则需要进行1万次查询.虽然查询的次数很多,但因为只有一篇文章所以还是可以处理的来的.
问题出就出在缓存问题上面!当我们发表一篇文章是,系统会自动进行一些缓存更新操作,标签的多少和其他的缓存方法都没有什么影响,不过对文章标签缓存的影响就非常大了.查看缓存类的文章标签缓存方法,因为设计上的原因,获取一篇文章的标签都需要对标签表进行全表查询一次和读取标签名称和URL等,对于有10个标签的文章来说查询次数将会比只有1个标签速度慢10倍,而且emlog每次发表文章都会进行一次缓存更新,而且每次更新都会对所有文章更新一遍!(应该是所有文章都更新一次吧,如有错误欢迎留言).当文章数量达到几千时,配合上千的标签数量,将会直接导致系统严重变慢,无法正常使用.
以下是亲身经历,目前有文章2000左右,标签800+,每篇文章都有至少6条以上的标签数量.结果就是发表一篇文章的时间从1秒左右变为20秒左右,还要祈祷缓存更新不要失败.以这样的状态持续更新了几百篇文章之后,系统彻底的不能使用了,发表文章百分之95%以上会失去响应,页面会在save_log.php?=add(应该是这个)上失去反应,页面显示空白(这个时候文章有几率发表成功,也有记录失败),如果发表成功你返回页面再点击发表会造成文章重复发表.而且文章的标签缓存更新也失败了.表现为模板已经获取不到文章的标签了!
最终没有办法想出了一个不是办法的办法,打开lib文件夹中的cache.php文件,把文章标签缓存的方法给注释掉了.好吧,我实在是没有办法了.结果系统恢复正常.终于不用再等待每次发表一篇文章花费几十秒的时间还可能失败的风险了,唯一的问题是模板没办法获取文章的标签缓存了,解决的办法就是写个方法从数据库中读取,每次需要的时候调用这个方法了!至少还能用不是么= =