分类目录归档:优化

opcache PHP新的字节码缓存扩展

字节码缓存组件 Zend Optimizer+ 现在更改名字为 Zend opcache了。且在php 5.5版本后,会集成到php的官方组件中,也就没有必要安装其他的APC,eAccelerator等了。。

APC与Opcache都是字节码缓存也就是,PHP在被编译的时候,首先会把php代码转换为字节码,字节码然后被执行。

php文件第二次执行时,同样还是会重新转换为字节码,但是很多时候,文件内容几乎是一样的,比如静态HTML文件,生成后内容许久都不会改变,用户访问请求直接由服务器读取响应给客户端浏览器。都不用经过PHP进行解析构建了。

内存中的字节码数据,可以直接缓存进行二次编译。这样程序就会快一些,cpu的消耗也少了。

详细介绍看这两篇

新一代 PHP 加速插件 Zend Opcache

php的 zend opcache VS apc 性能比较

我主要是用来测试了一下phpcmsV9.5.4 的默认index.php主页,没有数据内容,但有sql查询操作

测试是Apache2.2.6 32Bit 服务器,PHP 5.4.26 ts,mysql 5.6.16 64Bit

ab 版本 This is ApacheBench, Version 2.3 <$Revision: 655654 $>

请求数:1000

并发数:10

没有加载opcache测试

第一次测试

p

吞吐率 38.46 rps,耗时26.001 s,每个请求耗时260.015 ms

第二次测试

p2

吞吐率有所提高 40.73 rps,耗时 24.554 s,每个请求耗时245.544 ms

加载opcache进行测试

opcache版本 php_opcache-7.0.3-5.4-ts-vc9-x86

opcache配置信息


opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

第一次配置opcache好后 cache 状态

cstat

 

cache hits 命中数 1

cache misses 未命中数 1

使用内存225.2Kb

opcache第一次测试

p_c1

吞吐率提升到49.11rps,总耗时20.361 s,每个请求耗时下降到203.612 ms

在phpinfo中可查看opcache的命中数量情况

cstat_c

命中数量已达到43957,内存使用2.31Mb。

opcache第二次测试

p_c2

吞吐率提升到47.87rps,总耗时20.888 s,每个请求耗时下降到208.882 ms

opcache之后的两次压测数据变化不大,每个请求耗时在1ms差距内,吞吐率也在1~2 rps

但与之前未启用opcache时,总耗时少了4 ~ 6 s,每个请求耗时少了40 ~ 60 ms。吞吐率也提升了 8%。

这都是在一行代码未改的情况下有效性能提升。

 

php文件被编译为字节码进行内存缓存,如果在生成环境中,代码和内容变量都是比较固定的

缓存起来的内容就可以高速的返回,用户会得到较快的响应。

但是在本地开发是,建议不要开启opcache,否则就得不到最新的值

例如:


<?php
 header('Content-type:text/html; charset=utf-8');
 
 $str = 'abc';
 echo $str; // 输出abc
?>

赋予$str 一个新的值



<?php
 header('Content-type:text/html; charset=utf-8');
 
 $str = 'new abc';
 echo $str; // 输出的还是 abc
?>

这是因为$str 已经被编译为字节码了,再次访问时,内存里面还是可以找到对应的缓存,就没有进行重新编译,返回的值也就还是之前的值 abc

不过,opcache有一个参数可以用来设置缓存时间长度

[bash]

opcache.force_restart_timeout (default "180")

[/bash]

默认时间为180秒,还是建议本地不用开启opcache

 

注意:官方给了一个Note,如果opcache要与xdebug同时加载,那么opcache需要在xdebug之前进行加载。

但是我本地测试了一下,xdebug先加载,再加载opcache,也正常启动了,xdebug,opcache都加载成功,opcache缓存也正常。

不过还是按照官方的建议来安装加载,否则可能会出现奇怪的错误吧。

 

官方Github https://github.com/zendtech/ZendOptimizerPlus

 

PHP opcache pecl http://pecl.php.net/package/ZendOpcache

Window opcache dll扩展 http://windows.php.net/downloads/pecl/releases/opcache/7.0.3/

戴尔N4010笔记本风扇清灰

女朋友已经跟我说过很多次了,要帮她把笔记本清清灰尘。我一直懒得动工,且跟她强调清灰不能解决电脑根本慢的问题啊(好吧本质就是太懒了)。她的电脑是10年买的戴尔N4010,买回来也很久没有重装了,于是重装了一下系统,又给电脑加了一根三星4G DDR3的内存条,整体内存升级到6G了。感觉没有那么慢了。最近夏天来了,她用着电脑觉得一会儿就又烫又卡了。所以再次强烈要求(下命令)我帮她的机器清理灰尘。

这下挡不住了,只好开始动工。动手能力一般般,找了一篇拆机文章,http://wenku.baidu.com/view/7eb16fa9d1f34693daef3e67.html?re=view

上面的这篇教程说明的是拆机,不过我们是清理灰尘,主要看拆主板那一块就可以了。至于其他的屏幕拆解,主板拆卸等,感兴趣的可以自己去研究。

 

对于拆机或清灰我觉得有几点需要注意的

1、机器上面的螺丝要分类存放,不要丢失了

2、注意外接设备与主板连接的排线,比如键盘,屏幕等

3、擦拭灰尘时千万别把主板上面的电容给抹坏了,否则就麻烦了

还有一点那就是,记得步骤,不要忘记拧螺丝或者忘记插排线了。

好了,我这次的清灰比较简单,目标就是出风口风扇那里清理干净就好。至于主板的扇热铜管,还有cpu的硅脂替换等,没有处理。

 

在拆机前要搞清楚笔记本的常说的ABCD壳(面)

abcd图上面就一目了然了。

戴尔的这款笔记本主要是把D壳的螺丝全部卸掉,然后在撬开键盘打开C壳。就能看到主板了。

(图片比较烂,勉强看看吧)

第一步卸掉D壳的所有螺丝,包括电池仓那里。

在卸掉内存后盖的螺丝后,取下内存,后盖有一颗螺丝卸掉后就可以拿出光驱了,这里都比较简单。

22

 

需要注意的是,D壳上面的螺丝不要忘记了光驱那里的4颗螺丝!

第二步开始取下键盘

要注意键盘的4个角落下面的卡槽

20140609_220207

左上角的那个就在ESC键上面,小心一点撬以免划伤键盘和C壳。

在慢慢撬起键盘后,小心低下的排线,不要扯掉了。

第三步拆排线

主要有三个地方

2

 

排线拆掉后,拿下这个黑黑的一层隔板,就能看到主板了。

第四步

可以看到风扇了

33

卸掉风扇的螺丝,拿下风扇,清理出风口和风扇。出风口那里全是黑色海绵状的东西,图片忘记拍了,出风口完全被堵住了。可以看到主板上面也是一层的灰,我是用吹风机吹了一遍,没有用刷子刷。如果有机油的话可以给风扇的轴上点油。

至此我的目标就算达成了,开始一步步的安装回去。

4

 

拆解到风扇的全部螺丝。

安装回去的过程中,不要漏掉排线和螺丝。我就忘记了光驱的螺丝直接把光驱装上了。

在上D壳螺丝时,不要一下子全部拧上了,我是拧上4个角上的螺丝。启动一下电脑试试,如果正常启动了,测试一下键盘,看看风扇的运转情况,再关机,把余下的螺丝都拧紧。如果不能正常启动,检查一下内存条是否安装正确,或者检查一下主板上的线是否脱落了。

 

 

 

 

 

 

mpf项目的svn日志信息

1——1153版本,断断续续开发了很久,这个项目的学到的就是创建一个产品所有的全部流程以及开发协作方面的知识。虽然是discuzx二次开发的站http://allstartv.pptv.com/。

svn提交日志,开始时候都没怎么重视,编写很不成熟,后来才逐渐重视日志详细信息描述。

现在贴出来做个记录。

 

r1153
* 全局search,左上角回到首页下拉菜单css bug修复
———————
r1152
* 首页图片焦点图样式修改 * 去除paypal的功能代码 * 抢票专题的vip购买弹出层的js修改
———————
r1151
* 给充值vip弹出层中添加目前用户vip状态的标识icon
———————
r1150
* 登陆注册弹出层的css修改 * 支付弹出层,退出后的登陆提示js修改 * source/module/portal/portal_topicdo.php 加入括号 * orderpay加入“支付”submit,如果余额大于商品价格,则会显示余额的submit按钮;源代码没有修改,只是js做显示层;ps:如果需要加入paypal,则该文件副本需要把这段代码加入后上传 * 给充值vip弹出层中添加目前用户vip状态的标识icon
———————
r1149
* 关于问题专题vip通道弹出层的问题修复,页面js 的修改 * 专题vip图片的css样式修改 * source/class/class_core.php 时区的设置为 Etc/GMT-8
———————
r1148
* 修复“粉丝团个人当月财富排序不正确的bug”
———————
r1147
* 后台文案修改。
———————
r1146
* 重大bug修复!!!之前出现的过了系统设置的15分钟在线有效期后,用户就自动掉线了。原因找到用户pwd与id信息encode 的auth信息存储的cookie过期了。setloginstatus($result[‘member’], $_G[‘gp_cookietime’] ? 2592000 : $_G[‘setting’][‘onlinehold’]); 就是这样   直接改为setloginstatus($result[‘member’], $_G[‘gp_cook…
———————
r1145
* album bug修复 * portal_weekly.php xml结构修改。
———————
r1144
* 问题修改完成,魔炫开始线上测试查看;可能会有一些问题进行三三两两的修改提交。 * 视频缩略图、封面添加,删除的js portal_upload.js 部分修改 * paypal回跳商品购买的bug修复。事后证明是个例ie崩溃所导致的。 * ui,js等的修改;对css、图片等的显示优化。
———————
r1143
* 抽奖专题解决是参与后还是显示未参与状态的bug,干掉memcache对参与状态的缓存 * 专题弹出层登陆框的状态修改。 * 支付、充值新页面平台跳转的焦点又回到提交from表达的页面bug修改,把弹出层的input改为a标签则可。吴方法。input会自动吸引焦点;而a则不会;原理还需了解 * paypal平台支付的bug修改,paypal返回后功能完善与实现。
———————
r1142
* 功能bug持续修改主要包括   1.支付平台server return page页面数据返回时对用户状态的判断,以免商品订单数据混乱。   2.收藏、分享的代码修改。   3.模板css的修改。mpf_portal_topic virtualnum字段类型由tinyint修改为int   4.用户充值订单的总金额统计与订单数据csv导出bug功能修改。 * “测试问题汇总1206.docx”测试文档bug修改完成
———————
r1141
* “测试问题汇总1130.docx” bug修复完成,   主要包括   1.推荐粉丝团数据更改,缓存更新问题   2.首页,栏目页的页面排版修复   3.视频封面图片功能显示与后台设置   4.粉丝团数据错误问题排查 * — mpf_portal_video_title视频表中加入封面字段
———————
r1140
* “测试问题汇总1129.docx” 测试bug文档一半内容已修复完成。还余一个vip购买记录中出现空数据的问题。操作动作未知暂无法判断,决定在观察两天再次修改。 * mpf_portal_topic加入虚假参与抽奖人数字段 抽奖专题专属 virtualnum
———————
r1139
* mpf必须的模板,从default里面copy来
———————
r1138
* “测试问题汇总1129.docx” bug内容修复。主要内容包括   1.视频发布不能对描述内容添加图片   2.点播、直播视频的封面显示bug修改。   3.明星相册的图片大小显示修改。   4.一些css ui的修改   5.专题ajax数据请求加入清除缓存的数据参数(是否能够规避“内部错误”还不知道)   6.新加入字段,表更新到mpf服务器。
———————
r1137
* “20121116网站问题汇总—修改方案.docx” 新的bug文档内容修复完成。开始内部测试。
———————
r1136
* 粉缘bbs 财富排行榜完成修复。新加入月份财富统计记录表mpf_forum_groupmonthcredits * 搜索相关css 修复。一些常规的ui样式bug修复
———————
r1135
* 2012.11.1部署到mpf.1stcore.net线上时出现的bug内容修改。
———————
r1133
* 增加uc_server/data
———————
r1132
* 保存全部的充值订单记录,构建一个订单查询记录功能。即copy了一份mpf_forum_order数据的内容表,这个表是mpf_forum_orderbak,数据结构一致;同时后台“电子商务”板块内构建了“充值订单记录备份表”的查看功能。 * fouction_core.php新增backuporderlog()函数,用来处理forum_order表中订单提交日期距今大于60天的数据进行备份后,在删除。调用执行还是在各充值平台完成后的会跳notify.php页面中,完整订单…
———————
r1131
* 9.26 bug内容修改。专题“赶快抢票”购买成功后跳转到直播预告页bug,加入vip后,再次点击“vip通道”,提示信息修改,根据用户状态来显示对应的提示信息。
———————
r1130
* 9.19最终版的一些bug内容修复。
———————
r1129
* 添加spacecp_credit_rechargego.php “充值平台页面跳转功能”的实现 * 上线后测试的bug内容修复。
———————
r1128
* 专题购买视频弹出层ie,购买按钮体验的bug修改
———————
r1127
* 主要内容还是bug内容修复。 * 支付、充值支付新窗口提交,修复window.open遭浏览器拦截的问题; * 专题购买视频的页面跳转bug修复。抽奖专题的视频购买,不论是否直播正在进行始终跳回抽奖页面,不跳转至直播播放页 * 线下大屏幕抽奖,根据不同的奖项加载不同的短信模板进行发布 * css,用户点击购买按钮后提示改为“加载中或提交中”
———————
r1126
* 消除ie8下,获取不到cookie充值订单号的问题;原因是用户名中文时写入cookie编码格式的问题;解决方案$_G[username]改为$_G[uid]绑定,规避用户名中文写入cookie编码混乱问题。 * 充值,支付页面的银行选择js修改。
———————
r1125
* “专题视频购买相关bug文档20120904.docx”相关问题的bug修复。主要包括充值后不能进行商品购买;参与抽奖跳出支付后,不能自动参与抽奖成功。 * vip购买bug问题修复 * 添加spacecp_ordergoods.php 处理商品购买并跳转。 * 页面css、js修改,充值支付页面js问题修改。
———————
r1124
* 抽奖专题功能bug修复(不能进行抽奖的问题)
———————
r1123
* 8.21——9.3功能修改 * 重构订单支付的商品购物体系,目前包括视频、vip。道具部分内容暂未构建。 * 添加购物订单支付 * 支付购买跳转loading提示 * 用户购买商品,弹出层登陆(使用专题弹出层) * 抢票专题参与与参与抢票当前页面完成购买,星币不足跳出充值支付;支付完成得到对应商品。 * 删除不必要的页面topicphone.htm payhone.htm need_option.htm spacecp_order_pay.htm * 去除“paypal”…
———————
r1122
* 样式修改。
———————
r1121
* 前端页面根据yslow优化法则进行了优化。 × 页面结构css/javascript位置进行了调整。
———————
r1120
* 后端业务逻辑的优化,除去支付/订单结构的修改部分。 * bug修复,部分函数的修改。
———————
r1119
* 专题页面,视频播放页面的性能优化。加入memory缓存机制。 * 模板以及部分css内容进行了修改。
———————
r1118
* 增加导出中奖用户功能 * 修改抽奖逻辑 * 修改充值需要使用的默认显示的充值金额 * 短信中奖模板增加分类控制的功能
———————
r1117
* 整站样式全部合并为一个主要的allstartv.css文件。目前仅保留4个有效css文件;对应的source源码以及mpf目录模板文件都进行了修改。 * js以及对应的一些图片进行了修改。 * 忽略install系列目录文件。
———————
r1116
* 使用smush.it 压缩后的css图片,节省大约700kb
———————
r1115
* “修改0806.docx”文档bug内容修改,主要包括1、抽奖名额数据的显示。2、模块数据的显示。3、列表、专题图片尺寸的修改。4、相册封面更新显示bug修复
———————
r1114
* “修改0806.docx”文档bug内容修改,主要包括1、抽奖名额数据的显示。2、模块数据的显示。3、列表、专题图片尺寸的修改。4、相册封面更新显示bug修复
———————
r1113
* “修改0806.docx”文档bug内容修改,主要包括1、抽奖名额数据的显示。2、模块数据的显示。3、列表、专题图片尺寸的修改。4、相册封面更新显示bug修复
———————
r1112
* “在专题直播结束后,购买vip时,出现直播已结束的提示”的bug修复完成。
———————
r1111
* 修改现下大屏奖品页面分页BUG
———————
r1110
* 添加a(‘#slides’)是否存在的检测。以免其他页面不存在时,js错误。
———————
r1109
* 展现奖品、以及添加奖品的bug内容修改 * 专题添加时验证,是否以及存在相同视频id以及相同模板类型的专题了
———————
r1108
* 修复专题页面注册登录按钮默认样式
———————
r1107
* 图片编辑操作消息提示修改
———————
r1106
* 文章、视频收藏favorite,share动作前的登录验证提示。
———————
r1105
* 修改魔炫反馈的专题页bug(project 问题429中)
———————
r1104
* 首页旋转动画home.js内容修改。
———————
r1103
* 后台大屏幕数据管理的相关修改 * 大屏幕抽奖防止再次中奖,在5.10就已完成。目前不必再次修改。
———————
r1102
* 修复销售查询,激活码对话按用户名查找错误的问题 * 修复后台线下大屏中奖用户分页问题 * 修改直播结束不能购买的提示语 * 修复魔幻现场合作伙伴显示不正确的CSS错误
———————
r1101
* 压缩出现的bug,重新加上slides效果
———————
r1100
* 修复在未登录状态下绑定手机和成为VIP提示用户空间不存在的问题
———————
r1099
* 如果在购买视频时进行的充值,则将视频的购买价作为默认的充值金额
———————
r1098
* 尝试性修复ajax弹窗提示内部错误的问题
———————
r1097
* 后台激活码搜索添加兑换方式筛选功能
———————
r1096
* 销售查询增加按照VIP和打折信息搜索功能
———————
r1095
* 修改查看VIP购买记录分页不正确的问题
———————
r1094
* videoplay.css 没有文件引用,删除之 * 压缩后的css样式文件,比没压缩之前节省32kb
———————
r1093
* 加入swf/get_flash_player.gif图片文件
———————
r1092
* 合并以及压缩后的js文件。
———————
r1091
* 去除js中的注释减少空间 * 删除及合并bbs.js bbsteam.js introduct/jsScrollbar.js superlive.js videoplay.js 多个js文件,减少http请求。
———————
r1090
* 恢复jquery.roundabout-2.4.js文件
———————
r1089
* 删除jquery.roundabout-2.4.js文件。 * js文件更新
———————
r1088
* 修改新闻列表页图片失真问题
———————
r1087
* 解决播放页图片白边
———————
r1086
* 订单提交修改,添加支付paytype类型。
———————
r1085
* 最新数据库导出
———————
r1084
* paypal支付前端页面修改。
———————
r1083
* paypal支付的后台设置,管理。
———————
r1082
* paypal支付功能开发代码。
———————
r1081
* 修复如果视频没有添加现下大屏数据时查看视频有报错
———————
r1080
* 修复在专题页点击播放无法跳转到视频直播页的问题
———————
r1079
* 隐藏个人中心日志和主题功能
———————
r1078
* 修改注册无法提交的问题 * 添加全部删除搜索到的激活码功能 * 打乱生成的假激活码的排序 * 添加生成假激活码时,英文和中文混合字段
———————
r1077
* 尝试修复IE下,播放页点击切换图片时,视频停止播放的问题
———————
r1076
* 修改后台销售查询时,版权商登录不显示导出信息 * 修复激活码兑换点播视频成功后,用户仍未获得观看权限的问题 * 视频详情页和视频列表页显示的付费方式不一致的问题
———————
r1075
* 抽奖活动专题电话号码显示bug修改。
———————
r1074
* 专题星币余额不足只提示一次的bug问题修改。
———————
r1073
* 充值成功跳转
———————
r1072
* 视频播放页,使用道具后去掉ajax请求返回的 使用道具的用户列表以及分页信息。请求返回页面修改。
———————
r1071
* 视频播放页,使用道具后去掉ajax请求返回的 使用道具的用户列表以及分页信息。
———————
r1070
* 新浪微博api信息获取修改,显示缩略图
———————
r1069
* 注册ie8 js bug 修改。
———————
r1067
* 修改销售查询和VIP购买记录查询分页
———————
r1066
* vip通道提示信息修改。
———————
r1065
* vip通道提示信息修改。
———————
r1064
* 专题图片链接修改。 * 订单确认js修改。 * 专题后台管理修改
———————
r1063
* 订单确认bug修改 * 专题抽奖部分功能修改
———————
r1062
* 修复视频购买逻辑,优化网络故障时的错误处理
———————
r1060
* 订单验证功能修改
———————
r1058
* 浏览器兼容js修改。 * 弹出框的html页面修改
———————
r1057
* 抢票专题的视频弹出逻辑修改。 * 个人充值,修改为必须要登陆。 * 浏览器兼容js修改。
———————
r1056
* 修改支付问题
———————
r1054
* 专题ie8调整bug修改。 * 用户支付,弹出提示消息,确认订单充值完成功能开发。
———————
r1053
* 专题ie8调整bug修改。 * 用户支付,弹出提示消息,确认订单充值完成功能开发。
———————
r1051
* css样式文件修改
———————
r1050
* 专题页面html、css js内容修改
———————
r1049
* 抢票专题相关的修改。
———————
r1048
* 修改充值新页面跳转
———————
r1047
* 将数据库更新记录加入版本库
———————
r1045
* bug调试的页面修改。
———————
r1044
* bug修改。调试。 * 支付正常运行。
———————
r1043
* 解决冲突问题。
———————
r1041
* 页面提示信息修改
———————
r1040
* 逻辑bug修复
———————
r1039
* 抢票bug功能修改 * 视频图片修改
———————
r1038
* 视频预告页面图片信息修改 * 抢票专题提示js修改 * 银行卡充值页面修改
———————
r1037
* 添加网上银行支付 * 将支付页面从个人中心提出来
———————
r1036
* 添加专题验证码页面
———————
r1035
* 增加topicdo的弹窗、提示ajax操作。
———————
r1034
* 抢票专题增加siders 效果
———————
r1033
* 新抢票专题页面相关的css、图片
———————
r1032
* 增加 topic_show.htm 专题的提示、弹窗信息页面 * 抢票专题页面的修改。 * 后台专题管理的修改。 * 其他相关页面的修改。
———————
r1031
* 新增的一个ajax服务器处理页面,主要就是专题相关的提示、弹窗。
———————
r1030
* 抢票专题的修改。功能实现,页面修改。 * 抢票前台显示的php文件修改 * 合作伙伴相关的js修改。
———————
r1029
* 修复个人信息不能完整导出的问题
———————
r1025
* 创建开发分支
———————
r1024
* 修改只检查生成未使用激活码时的有效时间 * 修复一次只能生产500张已使用激活码的问题 * 取消版权商根据激活码分类查询条件 * 取消版权商查看激活码有效期的条件
———————
r1023
* 修复superstar页面的SQL注入漏洞
———————
r1022
* 用户管理组判断bug修改,/function/function_myfunction.php mpf_checkperm()函数
———————
r1021
* 大屏幕抽奖的业务逻辑修改。
———————
r1020
* 后台添加VIP群组功能
———————
r1019
* 视频介绍页面分页bug处理
———————
r1018
* 线下大屏幕后台参与用户的管理 * 线下大屏幕操作流程规范 * 视频介绍页面分页bug处理
———————
r1017
* 去掉销售查询版权商导出激活码功能
———————
r1016
* 修改巨星天地热门相册显示不正确的问题
———————
r1015
* 星币订单添加人工补单统计
———————
r1014
* 修复合作伙伴js循环bug
———————
r1013
* 修复合作伙伴js循环bug
———————
r1012
* 修复编辑视频时删除非图片附件无效的问题 * 修复相册名乱码 * 隐藏星周刊 * 修改成为VIP连接
———————
r1011
* 视频页,播放页面css修改 * 首页幻灯js修改
———————
r1010
* 功能bug问题修改 * 视频介绍页分页改为ajax实现 * 实现发送评论同时显示用户的vip信息功能 * 后台管理用户个人信息资料导出,只能导出400-500条记录;这个问题还未解决
———————
r1009
* 视频介绍页评论分页使用ajax实现的html修改 * 搜索input加入google 语言搜索属性
———————
r1008
* 修复激活码后天管理不显示兑换者用户名
———————
r1007
* 调整激活码兑换逻辑
———————
r1006
* 订阅星周刊邮箱修改,更好邮件列表js api
———————
r1005
* 星周刊getpic()函数定义重复,修改函数名 * admincp_sale.php 删除输出的sql语句
———————
r1004
* 修复视频编辑时无法删除非图片附件的BUG
———————
r1003
* 兼容样式修改
———————
r1002
* 提示信息说明修改
———————
r1001
* 修改后太后中奖用户分页BUG
———————
r1000
* 抢票“敬请期待”链接修改,大bug大bug
———————
r999
* 后台添加自动生成已兑换激活码功能 * 修改视频介绍页,评论分页影响视频内容的BUG
———————
r998
* 修改激活码导出功能
———————
r997
* 错位样式修改
———————
r996
* 激活码合并至销售查询栏目下,让版权商能够查看已使用的激活码 * 增加已使用激活码的csv导出
———————
r995
* 修改相同ip
———————
r994
* 更改道具排行榜的显示数量,目前为20
———————
r993
* 修改相同ip
———————
r992
* 播放页地区在线人数ajax请求,功能更改 * 线下大屏幕中奖名单添加分页 * 抽奖专题参与人数显示修改 * lang用户数据信息内容修改
———————
r991
* 线下大屏幕、直播页面、道具页面的css修改
———————
r990
* 线下大屏幕页面修改 * 直播播放页面js内容修改
———————
r989
* 修复道具排行榜中文名换行问题 * 修复视频销售查询和vip购买记录总金额问题 * 修复UC_API定义错误的问题
———————
r988
* 界面样式bug修改
———————
r987
* 修复用户购买VIP时星币值刚好与VIP价相同时无法购买的问题
———————
r986
* 去除地区在线重复
———————
r984
* 卡密字符替换为激活码
———————
r983
* 播放时间 抢票专题直播时间修改
———————
r982
* 修改用户在线数据错误
———————
r981
* 修复线下大屏抽奖失败的问题
———————
r980
* 直播介绍页 上面的时间改为直播时间
———————
r979
* 添加奖项推送到前台时给中奖用户发送短信和邮件 * 修改若直播还未开始,不显示已观看人数
———————
r978
* 修改密码完成,退出后不能登录bug修改
———————
r977
* 修改密码完成,退出后不能登录bug修改
———————
r976
* 修改地区排行榜逻辑
———————
r975
* 添加站长统计 * 修改地区排行榜逻辑
———————
r974
* 在线数据信息统计页面更改
———————
r973
* 修改线下大盘的导航
———————
r972
* 隐藏线下大屏,抽奖和微博页
———————
r971
* 修复添加大屏报错的问题
———————
r970
* 修改购买直播时提示直播开始问题 * 修复专题活动也手机号码格式化不对的问题
———————
r969
* 修改用户线下大盘权限问题
———————
r968
* 专题、首页js、css修改
———————
r966
* 专题添加功能修改
———————
r965
* 专题信息提示修改
———————
r964
* 完成后台抽奖推送到前台
———————
r963
* 抢票专题页面信息修改 * 样式修改
———————
r961
* 新的线下大屏新的页面,css,js
———————
r960
* 新的线下大屏修改完成
———————
r959
* 新的线下大屏修改完成
———————
r958
* 专题活动抽奖,需填写个人信息 * 邮件服务接口提供调试模式
———————
r957
* 线下大屏抽奖放到后台
———————
r956
* 修复抢票活动出错的bug
———————
r955
* 修复抢票活动出错的bug
———————
r954
* 后台添加清空用户在线状态功能
———————
r953
* 修复兑换直播视频的提示语
———————
r952
* 线下大屏手机提示信息修改 * 线下大屏页面高度根据图片高度确定修改
———————
r951
* 线下大屏手机提示信息修改 * 线下大屏页面高度根据图片高度确定修改
———————
r950
* 修复编辑视频图片无权限问题
———————
r949
* 修改大屏获奖人数自动滚动问题 * 修复后台查看中奖用户,未做筛选的bug * 大屏操作页添加大屏列表
———————
r948
* 首页、superlive的图片幻灯自动播放js修改
———————
r947
* 首页、superlive的图片幻灯自动播放js修改
———————
r945
* 修复线下大屏微博在线人数不显示的问题
———————
r944
* 线下大屏js修改
———————
r943
* 修改线下大盘导航显示逻辑(不符合抽奖逻辑不显示) * 添加后台微博在线人数设置
———————
r942
* 线下大屏js/css内容修改
———————
r941
* 线下大屏页面内容修改
———————
r940
* 线下大屏幕后台控制管理全部集中到“全局->线下大屏设置” * “运营->抽奖设置”只保留全局数据(中奖人数上限,一二三等级中奖用户,中奖人数)的设置
———————
r937
* 线下大屏幕道具使用量显示8位
———————
r936
* 增加jquery.cookie.js
———————
r935
* 线下大屏幕的修改功能完成,js、css文件修改
———————
r934
* 线下大屏幕的修改功能完成,页面内容修改
———————
r933
* 线下大屏幕的修改功能完成 * 专题的加入唯一性检测
———————
r932
* 添加视频购买提示信息
———————
r930
* 调整直播时间显示 * 开启邮件服务
———————
r927
* BUG修复
———————
r922
* 视频介绍页 演出时间是即为直播介绍页面的直播时间
———————
r918
* 抢票页面内容修改 * 视频介绍页未到直播时间,按钮状态为敬请期待  * mpf_footer.htm底部增加notice提示
———————
r917
* 修改抢票时间期限bug
———————
r912
* 日期时间24小时制显示
———————
r911
* 修改后台门户专题提交报错
———————
r910
* 合作伙伴 js 运行方向调整
———————
r909
* 修改showmessage 在IE下不解析的问题
———————
r908
* 调整VIP抽奖逻辑
———————
r907
* 样式修改
———————
r906
* VIP套餐添加按年显示 * 调整VIP抽奖活动逻辑 * 调整VIP视频显示逻辑
———————
r905
* 抢票添加宣传视频,vip专属活动推广页面功能修改。后台文件。
———————
r904
* 抢票添加宣传视频,vip专属活动推广页面功能修改
———————
r902
* BUG修复
———————
r900
* 专题页面 抢购 改为 促销 * 视频直播、点播介绍页面js修改 * 加入vip页面js修改
———————
r898
* 兼容ie6 css样式修改
———————
r894
* 添加清理vip用户的计划任务页面
———————
r893
* 隐藏paypal设置 * 后台购买VIP记录导出
———————
r892
* 卡密 改为 激活码 * “成为vip” 检验功能代码更新 * 专题功能代码修改
———————
r891
* 订阅星周刊页面修改 * 卡密 改为 激活码
———————
r890
* 验证码页面修改 * vip开通页面修改
———————
r889
* 用户没有refer连接时,登录后直接跳转至home.php?mod=space
———————
r888
* vip标志的页面内容修改
———————
r885
* 隐藏个人中心卡密充值 * 调整充值、兑换、商城新链接打开
———————
r884
* 头部添加卡密入口
———————
r882
* vip标志样式修改
———————
r880
* vip标志链接修改 * vip参与活动页面修改
———————
r879
* vip专题活动参与功能修改
———————
r878
* 调整激活码兑换页面样式
———————
r877
* vip标志添加的页面结构修改
———————
r876
* vip标志添加的功能修改
———————
r875
* vip标志添加的样式修改
———————
r874
* vip标志图片
———————
r872
* 完成激活码前台兑换功能
———————
r871
* exchange(激活码兑换页面)完成 * exchange(激活码确认兑换页面)完成
———————
r870
* 更改充值卡密生成、导出、兑换功能,相应调整视频购买功能 * 个人中心页增加兑换记录页面
———————
r868
* 个人中心vip尊享新增htm页面
———————
r867
* 个人中心vip尊享新增php页面
———————
r866
* 个人中心vip尊享的页面代码修改提交
———————
r864
* 个人中心vip尊享功能实现
———————
r862
* 后台模板文字更改
———————
r861
* 星币充值统计功能实现
———————
r860
* 调整视频播放页地区排行榜显示样式 * 新增道具页面 * VIP包月改为VIP专属 * 视频添加VIP价 * 充值新页面跳转
———————
r859
* 修复后台修改权限时的错误提示问题
———————
r858
* 在线支付新页面打开支付。
———————
r857
* 修复普通管理员没有群组删除和编辑资料权限问题 * 添加用户自动登录功能,时间为后台设置的在线时间
———————
r856
* 调整视频播放页JS错误
———————
r855
* 修复当合作伙伴为空时JS报错影响界面显示的问题
———————
r854
* 线下大屏添加后台设置参与抽奖人数 * 修复线下大屏特别奖得主头像无法显示问题
———————
r852
* 抢票专题有效时间验证
———————
r851
* 专题js内容修改
———————
r850
* 调整视频购买弹出层样式 * 点播视频购买后24小时内观看 * 发送短信加快响应 * 取消道具商城的热门道具
———————
r849
* 专题topic的前台页面修改
———————
r848
* 专题topic后台页面修改
———————
r844
* 修改注册时用户名验证条件和验证失败时显示错位问题 * 调整短信发送时的提示信息
———————
r843
* 调整短信发送机制,单条采用单发接口,多条采用群发接口
———————
r842
* 修改手机发送为单发账户,加快发送速度
———————
r841
* 线下大屏操作与设置权限分开 * 修改线下大屏地区在线随机逻辑
———————
r836
* 调整线下大屏程序逻辑 * 巨星天地首页添加最新专题活动
———————
r835
* 修改专题添加或更新的问题
———————
r830
* 修改道具购买成功后提示信息的位置 * 分享功能添加用户UID方便统计
———————
r826
* 修改活动参与人数显示
———————
r823
* 删除抢票专题,删除对应的参加人员列表
———————
r822
* 专题抢票页面
———————
r821
* 专题抢票页面
———————
r820
* 专题抢票功能开发
———————
r819
* 抢票专题css
———————
r818
* 线下大屏添加查看和删除中奖用户功能 * 线下大屏显示如果没有设置奖品信息将不显示中奖相关信息
———————
r816
* 完善大屏背景定制功能
———————
r815
* 线下大屏添加更换背景图片功能
———————
r813
* 删除图片所产生的缩略图
———————
r812
* 专题页面
———————
r811
* 专题功能添加
———————
r810
* sepcial专题的js与css 图片
———————
r804
* 修复点播列表也有直播标识的问题
———————
r803
* 添加线下大屏后台设定功能
———————
r801
* 专题道具css图片
———————
r800
* 专题道具页面完成
———————
r798
* 列表图片清晰生成
———————
r796
* 修改图片缩略方式
———————
r795
* 图片展示页面js修改
———————
r793
* “连接”改为”链接”
———————
r789
* search结果显示页面内容修改。
———————
r787
* 搜索的底部导航修改
———————
r780
* 20120302新增修改
———————
r779
* 个人中心星币记录调整
———————
r778
* 如果用户邮箱未验证,登录后提示验证 * 修改个人中心留言板留言条数 * 评论和留言不超过500字,且提示 * 修改最大在线人数为100万
———————
r776
* 用户星币奖惩修改
———————
r772
* 首页图片推荐样式修改,图片遮住视频问题
———————
r769
* 修改邮箱正则认证,改为严谨型
———————
r767
* 修改积分、星币奖惩分开具体权限
———————
r766
* 修改2.24的内容问题
———————
r764
* 20120224bug修复部分
———————
r759
* 2.27新bug修改内容
———————
r758
* 2.27开始的bug修改内容
———————
r754
* 聚星天地明星搜索页面修改
———————
r749
* 弹出层登陆样式修改
———————
r746
* 取消登录验证 * 添加粉丝团缩略图
———————
r743
* 粉丝团所属明星修改
———————
r742
* 排行榜缩略图生成函数添加
———————
r741
* 多余js的请求删除
———————
r735
* 收藏分享修改。
———————
r734
* 文章、图片收藏bug修改
———————
r730
* 道具图片显示样式修改
———————
r729
* 道具图片修改
———————
r728
* 线上版本2 — 修改中奖信息弹出气泡IE下动画错误 * 线上版本2 — 调整中奖信息气泡为只显示一次
———————
r724
* bbsphotos.css 明星相册样式修改
———————
r723
* 把页面中所有的首页改为 $_G[setting][bbname]
———————
r720
* 明星个人档案,明星视频修改
———————
r719
* 线上版本2 — 取消巨星天地搜索关闭群组时的提示信息
———————
r718
* 线下大屏2 –修改播放页幻灯片小图片上传无法显示的问题 * 线下大屏2 –添加视频播放页和相册浏览页锚点 * 线下大屏2 –个人中心添加我的评论列表页 * 线下大屏2 –视频区分上架时间和演出时间 * 线下大屏2 –关闭专题活动
———————
r714
* 直播、点播列表显示$navtitle
———————
r713
* 样式修改
———————
r711
* “明星视频”location地址修改
———————
r710
* 聚星天地栏目“明星视频”当前地址location修改
———————
r709
* 修改明星介绍页的图片缩略图
———————
r705
* 修复自动缩略图尖括号BUG
———————
r704
* 增加自动缩略图 * 修改分页BUG
———————
r703
* videolist.html getpic()函数加入 * starinfo.htm 文件结构、样式修改。
———————
r702
* rewrite自动生成图片缩略图 * function_core.php 加入getpic()函数
———————
r701
* 图片自动url 重写定向到image.php生成缩略图。
———————
r700
* 线上版本 — 调整点播介绍页标题换行显示问题 * 线上版本 — 视频block添加视频所属明星项
———————
r699
* 线上版本 –明星图片缩略图模糊的问题
———————
r698
* 视频列表 “版权”改“制作”
———————
r697
* 线上版本 –修改明星视频版权为制作
———————
r696
* ie7下视频播放道具重复出现的问题修复
———————
r695
* 线上大屏图片预加载内容修改
———————
r694
* 线上版本 –修复明星相册无法删除
———————
r693
* 修复网站后台“群组设置  开启群组”功能bug
———————
r692
* 线上   –调整标题后台不可以修改问题
———————
r689
* 样式调整
———————
r688
* 样式调整
———————
r687
* 分页bug功能调整
———————
r686
* 分页bug功能调整
———————
r681
* 我的收藏 导航显示问题
———————
r672
* 禁止邮箱未验证用户登录 * 隐藏积分
———————
r663
* 魔炫反馈文档修改
———————
r660
* 计划修改内容
———————
r658
* 修改计划样式调整
———————
r657
* 取消文章评论页分页
———————
r637
* 修改弹出层加好友和接触好友Ajax加载显示错误
———————
r626
* bug 内容修复
———————
r620
* 帮助中心、关于我们页面结构样式调整
———————
r617
* 订阅星周刊注释说明
———————
r615
* 提示ie6过时图片问题,帮助中心样式
———————
r611
* 友情链接、帮助、关于魔炫,法律声明等页面制作
———————
r609
* 帮助中心页面样式
———————
r606
* css样式,快捷链接添加等
———————
r604
* 明星的搜索结果呈现修改
———————
r603
* 修改当道具不足时点击直接弹出购买 * 调整个人中心显示样式
———————
r600
* 样式修改
———————
r598
* 功能结构修改
———————
r590
* 增加动态数据ajax加载功能,区域轮换效果
———————
r589
*
———————
r587
* 线下大屏js部分完善
———————
r584
* 线下大屏中奖代码修改完成。
———————
r582
* 线下大屏ajax请求功能开发
———————
r570
* 线下大屏所有html页面完成
———————
r569
* 线下大屏所以的html页面编写完成
———————
r567
* 弹出气泡内容提示
———————
r566
* 弹出气泡的效果
———————
r562
* 提示用户绑定手机号码
———————
r560
* 提示用户绑定手机号码
———————
r559
* 提示用户绑定手机号码
———————
r557
* 更改scrolltop样式内容
———————
r551
* 通过邮件以及手机短信找回密码
———————
r550
* 通过邮件以及手机短信找回密码
———————
r547
* 增加手机绑定
———————
r545
* 播放页视频道具排行榜,地区排行榜
———————
r540
* 统计在线人数ajax+setinterval * 分享链接源码
———————
r537
* 替换logo图片 * 增加png.js 兼容ie6 png图片 * 统计在线人数ajax+setinterval
———————
r536
* 在线人数统计,ajax+setinterval
———————
r535
* 替换logo图片 * 添加png.js兼容ie6 png图片
———————
r534
* 互动道具图片、css文件
———————
r529
* 互动道具js、图片修改部分。
———————
r528
* 互动道具使用功能
———————
r524
* 添加更新用户的手机号码action
———————
r523
* 后台增加奖品展示 * 发短信与邮件
———————
r521
* 用手机号码登陆功能
———————
r520
* 手机号码登录功能,这样手机号码在录入的过程中需要判断绝对的唯一性。 * 主要需要更新的表有ucenter_members;common_member_profile
———————
r502
* 完成聚星天地、粉丝团首页的图片自动切换
———————
r500
* 添加定时滚动
———————
r496
* 首页动画
———————
r495
* 文章列表也样式
———————
r468
* 显示BUG修复
———————
r429
* 个人中心设置的分享连接设置功能 * 各应用的api库(暂除qzone没有)
———————
r428
* Q版头像
———————
r427
* 分享链接页面信息 * 提示信息页面修改
———————
r416
* 星周刊后台管理功能页面 * 星周刊后台管理模块 * 星周刊前台处理页面
———————
r413
*星周刊后台管理、提示信息等新功能的标识说明文字 *星周刊后台管理及前台的相关页面
———————
r412
* 生成rss xml内容的控制器页面
———————
r411
*门户管理页面样式修改 *星周刊订阅内容后台管理页面,前台页面
———————
r392
* 动画优化
———————
r381
*聚星天地所有页面(除专题列表页)都已完成。 *魔炫二期静态页面切图编码完成。
———————
r379
* 动画优化
———————
r377
聚星天地首页
———————
r376
* 动画延迟
———————
r375
* 导航动画继续修正
———————
r374
* 修复导航动画ie兼容性
———————
r372
* 导航的动画
———————
r371
* 动画
———————
r369
* PPTV接口
———————
r92
自适应结构样式调整。 背景图片替换。 直播、点播介绍页面文字滚动条效果添加。 样式调整。
———————
r90
粉丝团相册三个页面。 目前为止,第一期页面切图全部完成。
———————
r89
粉丝团明星简介 粉丝团留言页面
———————
r84
头部列表样式 明星列表、更多明星列表。
———————
r83
* 粉缘团幻灯js
———————
r81
粉丝团成员列表页(与在线成员属同一页面) 粉丝团最近访问用户页 粉丝团活跃度排行页 粉丝团用户等级说明页
———————
r80
创建粉丝团页面 我的粉丝团列表页面
———————
r77
粉丝团公共页面提交。头部样式修改。兼容ie6/7 粉丝团首页页面提交。 粉缘首页相关内容替换
———————
r73
粉缘首页提交。 个人中心——订阅星周刊样式修改。
———————
r71
personal.css 样式更新。
———————
r70
superlive 图片切换 bug修复
———————
r66
粉丝团榜单列表、巨星天地榜单。 导航文字居中问题已修改。
———————
r61
* 注册表单
———————
r60
直播、点播介绍页面 评论样式结构更改。
———————
r59
* demo冻结
———————
r58
新添加页面: 注册、登录页面 魔炫现场榜单、巨星天地-视频榜单
———————
r45
* 连接分享的js
———————
r42
* 评论js
———————
r33
* js文件合并
———————
r32
* 图片滚动按钮样式
———————
r30
* js动画调整
———————
r18
* 首页动画
———————
r8
* 导航栏JS
———————

solr 4.3的一些错误解决方法

在去年时候学习使用了solr4.0,现在solr版本最新已经到了4.3了,前两天因为工作需要在一台服务器上面新安装solr,但是生产环境是4.0,不过想到是内部测试用的,且主要功能就是写入,删除,搜索,与程序上面没有太多的深入开发,于是还是安装了最新的4.3版本

解压安装启动后,就可以了;这时需要添加collection,添加的collection配置需要与生产环境保持一致,于是复制默认的collection1 的配置信息作为新的collection

复制完成,新的collection events 也添加完成;但是加载时总是报错不能正确加载solrconfig.xml信息,也知道schema.xml等数据肯定是要修改的,schema.xml配置信息修改完成后还是有这样的问题,在往solr写入数据时又再次报错

undefined filed message,但是message字段确实已经配置好了;检查之后再次重启solr,查看刚才的events 直接显示 “There exists no core with name “events””

这时去查看日志,显示信息

[javascript]

Caused by: org.apache.solr.common.SolrException: Error initializing QueryElevationComponent.
at org.apache.solr.handler.component.QueryElevationComponent.inform(QueryElevationComponent.java:218)
at org.apache.solr.core.SolrResourceLoader.inform(SolrResourceLoader.java:616)
at org.apache.solr.core.SolrCore.<init>(SolrCore.java:816)
… 34 more
Caused by: java.lang.NumberFormatException: For input string: "MA147LL/A"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
… 36 more
ERROR – 2013-05-22 16:07:06.752; org.apache.solr.common.SolrException; org.apache.solr.common.SolrException: Error CREATEing SolrCore ‘events’: Unable to create core: events
at org.apache.solr.handler.admin.CoreAdminHandler.handleCreateAction(CoreAdminHandler.java:524)

[/javascript]

 

[javascript]
ERROR – 2013-05-22 16:48:46.272; org.apache.solr.common.SolrException; org.apache.solr.common.SolrException: ERROR: [doc=100946] unknown field ‘message’
at org.apache.solr.update.DocumentBuilder.toDocument(DocumentBuilder.java:313)
at org.apache.solr.update.AddUpdateCommand.getLuceneDocument(AddUpdateCommand.java:73)
[/javascript]

正在排查中是,同事Y看到了,直接把solr 默认的collection1 改名为 events ,再次刷新直接挂了

There are no SolrCores running. Using the Solr Admin UI currently requires at least one SolrCore.

再次去查找这个问题,很快找到

http://stackoverflow.com/questions/13295208/i-unloaded-the-default-solr-collection-by-mistake-from-the-solr-admin-ui

编辑example/solr/solr.xml配置文件

可以看到已经变为

<core name="events" instanceDir="events" />

改为

<core name="collection1" instanceDir="collection1" />

保存,重启solr即可;

分析为什么出现这个问题,events collection的配置是错误的,solr初始化所有collection时跳过了events,而默认的collection1又改为了events则使用的是events目录下的配置信息了,

而这个配置信息又是错误的,所以solr admin 默认为没有 cores 的;修复过程中需要手动去修改配置文件,同事Y打呼用户体验太不友好了,不过我说Solr Admin用户体验很好啊,很早就不支持IE6了

现在又回到了上面的那个错误,org.apache.solr.common.SolrException: Error initializing QueryElevationComponent.

不能初始化,也不能添加events collection core,继续google,终于找到一篇提示的文章

https://coderwall.com/p/kwvxhq

Note that if you have enabled the QueryElevationComponent in solrconfig.xml it requires the schema to have a uniqueKey of typeStrField. It cannot be, for example, an int field.

Otherwise, you will get exception like:

java.lang.NumberFormatException: For input string: "MA147LL/A"

大意就是如果你开启了 QueryElevationComponent 功能,但是schema 的uniqueKey类型又不是 string,则报如下错误

java.lang.NumberFormatException: For input string: "MA147LL/A" 这个不就是我的日志里面的那个错误信息么, 于是编辑example/solr/events/conf/solrconfig.xml配置文件

搜索QueryElevationComponent关键字,可以看到如下,果然有这个信息

[javascript]
<!– Query Elevation Component

http://wiki.apache.org/solr/QueryElevationComponent

a search component that enables you to configure the top
results for a given query regardless of the normal lucene
scoring.
–>
<searchComponent name="elevator" >
<!– pick a fieldType to analyze queries –>
<str name="queryFieldType">string</str>
<str name="config-file">elevate.xml</str>
</searchComponent>
[/javascript]

http://wiki.apache.org/solr/QueryElevationComponent 查看一下,类似于关键字搜索后,一些项的配置置顶显示 比如百度搜索某个关键字时,搜索框下面的推广,广告相关信息总是被置顶显示

要配置启用这项组件,需要配置elevate.xml,同样是位于example/solr/events/conf/目录下

Elevated query results are configured in an external .xml file determined by the config-file argument. An elevate.xml file may look like this:

<elevate>

 <query text="AAA">
  <doc id="A" />
  <doc id="B" />
 </query>

 <query text="ipod">
  <doc id="A" />

  <!-- you can optionally exclude documents from a query result -->
  <doc id="B" exclude="true" />
 </query>

</elevate>

For the above configuration, the query “AAA” would first return documents A and B, then whatever normally appears for the same query. For the query “ipod”, it would first return A, and would make sure that B is not in the result set.

Note: The uniqueKey field must currently be of type string for the QueryElevationComponent to operate properly. 这就是答案了,uniquekey必须是string类型;目前我们项目中没有用到这项功能,所以可以选择注释不启用

[javascript]
<!–
<searchComponent name="elevator" >
<!– pick a fieldType to analyze queries –>
<str name="queryFieldType">string</str>
<str name="config-file">elevate.xml</str>
</searchComponent>
–>
[/javascript]

重启之后,没有初始化失败的错误了,再次往solr加入数据又有一个错误信息 undefined field text

[javascript]

ERROR – 2013-05-22 17:59:51.107; org.apache.solr.common.SolrException; org.apache.solr.common.SolrException: undefined field text
at org.apache.solr.schema.IndexSchema.getDynamicFieldType(IndexSchema.java:1211)
at org.apache.solr.schema.IndexSchema$SolrQueryAnalyzer.getWrappedAnalyzer(IndexSchema.java:425)
at org.apache.lucene.analysis.AnalyzerWrapper.initReader(AnalyzerWrapper.java:81)
at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:132)

[/javascript]

google 得到结果,就是默认字段需要替换的问题,编辑 example/solr/events/conf/solrconfig.xml 检索到text内容

 <lst name="defaults">
 <str name="echoParams">explicit</str>
 <int name="rows">10</int>
 <str name="df">text</str>
 </lst>

因为solrconfig.xml等配置文件时从collection1复制过来的,默认的default字段匹配是text,所以目前改为我们项目所用到的字段值message 保存文件,重启solr,写入数据没有问题了,search也正常的有数据内容返回了

版本的不同,配置文件内容也会做一些变动与修改;所以可能需要修改的配置不仅仅只是与项目search有关的内容,还有版本与版本之间,新版本默认启用的模块所需的配置有关;还有一点,多看日志,多用Google!

题为“缓存的应用与设计模式”的技术分享活动准备文档

在公司举行的技术分享活动上, 这周轮到我进行一个主题的讲解了;在上周六开始在定下了“缓存” 为主题的内容,主要是有感于之前缓存在项目中的应用。主要思路就是在用户从浏览器发送请求,然后得到服务器的响应内容这样一个流程中,有哪些地方能够实现缓存的最大化利用,提高用户的体验以及服务器的响应速度。文档的主要构成是一些从网上找到的具体配置信息,概念性的内容;还有自己程序上的一些应用技巧,加上自己的理解;也借鉴了一些其他大牛的博客内容、理念等。

文稿如下:

在web应用的一个请求中,用户从浏览器发送请求,服务器接收到请求后进行数据的收集,根据参数信息调用对应的service或model,model从DB中查询检索到数据信息返回给服务器,服务器将得到的数据内容进行处理封装,响应发送给用户的浏览器。那在这个请求的流程中,缓存在不更改代码或少改代码情况下可以很好的提高服务器的响应处理速度,比如在服务器的缓存,内存层面的高速缓存,浏览器的本地缓存,程序应用上的缓存等。而有关php脚本优化以及源码编译后的opcode动态缓存的加速器如zend optimizer,eAccelerator等不在这次讨论范畴内。

服务器级缓存

Apache

mod_cache  mod_disk_cache  mod_mem_cache  mod_file_cache module的缓存实现

Apache 的缓存方式有两种,一种是基于硬盘文件的缓存,由mod_disk_cache实现,另一种是使用内存缓存,由mod_mem_cache实现,不过它们都是依赖mod_cache模块的,mod_cache模块提供了一些缓存配置的指令供它们使用,而mod_file_cache模块是搭配mod_mem_cache模块使用的

Mod_disk_cache以磁盘文件形式进行缓存

<IfModulecache_module>

CacheDefaultExpire  3600

CacheMaxExpire  86400

CacheLastModifiedFactor  0.1

<IfModuledisk_cache_module>

CacheEnable disk /

CacheRoot”D:\Program Files\Wamp\Apache2.2\cache”

CacheDirLevels 5

CacheDirLength 5

CacheMaxFileSize 1048576

CacheMinFileSize 10

</IfModule>

</IfModule>

使用缓存需要注意如下事项:

要使用缓存,必须使用指令CacheEnable启用它,目前可用的缓存类型为 disk 或mem,禁止缓存可以使用CacheDisable,如CacheDisable /private

待缓存的 URL 返回的状态值必须为: 200、203、300、301 或 410

URL 的请求方式必须是 GET 方式

发送请求时,头部中包含“Authorization: ”的字符串时,返回的内容将不会被缓存

URL 包含查询字符串,如问号?后的那些东西,除非返回的内容包含“Expires:”,否则不会被缓存

如果返回的状态值是 200,则返回的头部信息必须包含以下的一种才会被缓存:Etag、Last-Modified、Expires,除非设置了指令CacheIgnoreNoLastMod On

如果返回内容的头部信息“Cache-Control:”中包含“private”,除非设置了指令CacheStorePrivate On,否则不会被缓存

如果返回内容的头部信息“Cache-Control:”中包含“no-sotre”,除非设置了指令CacheStoreNoStore On,否则不会被缓存

如果返回内容的头部信息“Vary:”中包含了“*”,不会被缓存

配置完成后,重启apache后即可,测试一个脚本

<?php

Header(‘Last-Modified: ’. gmdate(‘D, d M Y H:i:s’, time()) . ’ GMT’);

Var_dump($_SERVER);

?>

在服务器指定的cachedir目录下面可以看到后缀为.data 与.header的文件;.data是当前请求页面的所有文档内容,而.header则是当前请求头信息。CacheDefaultExpire可以设定这些文件的过期时间。

Mod_file_cache缓存模块配合mod_mem_cache模块来使用

如果你的网站有几个文件的访问非常频繁而又不经常变动,则可以在 Apache 启动的时候就把它们的内容缓存到内存中(当然要启用内存缓存系统),使用的是mod_file_cache模块,具体如下:

有多个文件可以用空格格开

MMapFile  var/wwwml/index.html var/wwwml/articles/index.html

上面是缓存文件的内容到内存中,除此之外,还可以只缓存文件的打开句柄到内存中,当有请求进来的时候,Apache 直接从内存中获取文件的句柄,返回内容,和MMapFile指令很像,具体如下:

CacheFile var/wwwml/index.html var/wwwml/articles/index.html

上面两个指令所缓存的文件如果有修改的话,必须重启 Apache 或使用 graceful 之类的方式强制使 Apache 更新缓存数据,否则当用户访问的时候获取的不是最新的数据。

有时候需要根据某些特殊的头部信息来决定是否进行缓存,则可以使用如下指令:

当头部信息中包含 Set-Cookie 时则跳过不进行缓存操作

CacheIgnoreHeaders Set-Cookie

有时候需要缓存的时候跳过 URL 中的查询字符串?使用如下指令:

CacheIgnoreQueryString On

Apache 还有一个模块mod_expires,这个模块控制header中的cache-control参数的max-age指令

ExpiresActive On

#ExpiresDefault A600

ExpiresByType image/x-icon A2592000

ExpiresByType application/javascript A2592000

ExpiresByType text/css A604800

ExpiresByType image/gif A2592000

ExpiresByType image/png A2592000

ExpiresByType image/jpeg A2592000

ExpiresByType text/plain A86400

ExpiresByType application/x-shockwave-flash A2592000

ExpiresByType video/x-flv A2592000

ExpiresByType application/pdf A2592000

#ExpiresByType text/html A600

可以看到js文件

Cache-Control     max-age=2592000

Connection Keep-Alive

Date  Thu, 21 Mar 2013 07:21:31 GMT

Expires       Sat, 20 Apr 2013 07:21:31 GMT

Keep-Alive timeout=5, max=100

Server        Apache/2.2.19 (Win32) PHP/5.3.6

Vary  Accept-Encoding

X-Pad         avoid browser bug

自动加上了Expires过期时间了

扩展:

压缩模块

除了缓存服务器轻松配置一下mod_deflate gzip就能返回压缩后的数据,压缩率可以达到60%-75%之间。

扩展:

Nginx也有对应的fastcgi-cache /HttpHeadersModule /gzipmodule

内存级缓存

Memcache

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

Memcache现在的版本是v1.4.15,使用memcache的网站一般流量较大;为了缓解数据库的压力,让memcache作为前端数据的一个缓存区域,将部分信息保存到内存中,让内存作为硬盘的高速缓存。因为单台服务器的memcache缓存容量是有限的,不过memcache是支持分布式的,所以我们可以根据实际情况进行数据的分布存储,比如社交类的网站以user为主,可以考虑把userid 为1开头的存放到编号为1的memcache服务器上,userid为2的放到编号为2的memcache服务器上。只是这样的话在程序业务上面就需要对userid进行判断了。

Memcache服务器端是直接通过客户端连接后操作的,没有进行任何的验证过程;在平时开发环境中可以这样,但是生产环境中就不能这样了。Memcache不能直接暴露在互联网上,否则很容易被人查看,或者服务器被入侵。所以我们可以以

1、   内网访问memcache服务器,服务器一般有两个网卡,一内一外;我们就让web服务器通过机房内网来访memcache。 Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。

# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid

Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接

2、   设置防火墙也是简单有效的方式,如果memcache需要通过外网ip来进行访问,那么我们可以设置服务器的iptables

# iptables -F

# iptables -P INPUT DROP

# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT

# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT

这里的意思就是指定只允许来自192.168.0.2的服务器进行访问。

Redis

Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。目前最新版本2.6.11

Redis是一个NOSQL数据库系统,支持各种数据存储类型,普通字符串,list,set,order sets;

那么redis与memcache都是内存级别的数据缓存,他们之间有什么区别呢?应该怎么选择呢。

1、memcache是一个高性能分布式的缓存系统,而redis是高性能分布式NOSQL数据库系统。

2、memcache数据常驻内存,memcached挂掉后数据消失;而redis数据内容也是常驻内存,且还可以定期的保存到磁盘中

3、memcache数据不可恢复,而redis数据丢失后可以通过aof恢复

4、redis有着更丰富的数据结构选择,在redis有着更丰富的操作;在memcache中只能拿到客户端中进行类似的操作在set进去,加大网络的IO次数

等等

Memcache与redis各有各的优势,memcache内存利用率高,数据存储维持简单搞笑的键值对模式,可以单纯的作为一个cache层,对于前后台的数据传输有着一个中转站的作用,而且有着成熟的分布式方案,同事各个语言都有着优秀的客户端。Redis是面向对象的键值对高性能分布式的数据库系统,适用于高并发,持久存储的场景,有着完善的数据存储类型且数据操作都是支持incr原子操作的,redis客户端也覆盖了各种语言,能很方便的使用。

对于数据同步以及持久化有很高要求的可以使用redis,对于仅仅是作为一个数据缓存层且不想维持复杂的数据类型结构那么可以选择memcache。

浏览器本地缓存

HTTP网页缓存

Cache-Control     max-age=2592000

Connection Keep-Alive

Date  Mon, 25 Mar 2013 07:31:50 GMT

Expires       Wed, 24 Apr 2013 07:31:50 GMT

一般一个http响应的header信息,包括如Etag  Last-modified Cache-control Expires 等这些信息,那么浏览器根据这些信息一并与网页内容进行本地缓存。

If-None-Match   “427fe7b6442f2096dff4f921548565486”

If-Modified-Since   Fri, 27 Jul 2012 01:35:39 GMT

浏览器再本地的缓存中发现last-modified信息,那么就以If-Modified-Since加入到header信息中发送至服务器,询问下服务器上面最后的一次访问更新是什么时候呢,那么apache服务器就会核对一下这个文件的最后更新时间,如果大于这个时间那么就会返回一个200的响应,重新下载这个文件。如果文件还是没有更新那么服务器就返回一个304 Not Modified,浏览器还是继续用本地缓存。

http的缓存,不仅可以节省服务器处理资源;还减少了网页的下载次数,节约网络带宽。但有时候我们经常是动态编程,比较少会整体缓存整个网页,不过对于网页所需要的附属内容如css、js、图片等内容,网站结构所需的图片js等内容我们可以缓存时间长点如30day,而用户图片数据内容可以进行5day的有效缓存。

如google这样的智能搜索引擎可以识别资源的状态信息,使用http cache之后,只有在文本内容真正变化后才会被爬取,那么我们可以直接对爬虫返回304 not modified,这样不但降低服务器负载与爬虫造成的网络带宽消耗,实际上也提高了google爬虫的效率。

历史帖子,一段时间后就很少人访问了;但是爬虫还是会每天记录访问造成服务器的高消耗,使用http cache后,爬虫爬过一次后,以后无论多少次爬取都可直接返回304了。

HTML5 DOM Storage本地存储API

在web storage api出现之前,服务器端需要存储客户端与浏览器之间交换的数据信息,如ajax请求的数据信息。而现在浏览器可以将需要重复请求的数据内容存储到web storage上,同时在关闭浏览器之后还可以恢复数据。

那同样是进行浏览器数据存储的cookie与web storage有什么区别?我们知道cookie是服务器端与浏览器进行文本传输的内置机制,我们可以用cookie来存储服务器生成当前连接的会话标识,可以用来实现购物网站的购物车,可以用来存储数据供接下来的页面使用。Cookie对于web开发程序确实有很大的用处,但是cookie也是有一些缺点的

1、   Cookie大小受限制,4KB数据

2、   只要有请求浏览器就会自动将cookie进行传输,cookie数据在网络上是可见的,存在安全风险;同时无论加载哪个url,cookie的数据都会消耗网络带宽。

而web storage目前可以存储高达5MB的数据内容,主流浏览器都支持。Web storage 有两种主要实现sessionstorage与localstorage,sessionstorage主要是用于会话的数据存储,关闭浏览器之后自动失效;而localstorage是永久存储在浏览器中的。

通过调用对象的setItem()与getItem()方法进行设置与获取的实现

window.sessionStorage.setItem(‘k’, ‘v’);

window.sessionStorage.getItem(‘k’);

window.sessionStorage.removeItem(‘k’);

也可以通过对象属性方式进行设置获取

window.sessionStorage.firstKey = ‘val’;

alert(window.sessionStorage.firstKey);

那么这样与普通的javascript数据对象有什么区别呢。最大的一个区别就是在于“作用域”普通的js对象在当前页面刷新后丢失已经不奇怪了,但是对于sessionstorage只要不关闭标签或浏览器,一个页面设置的sessionstorage值,只要是同源的网页中,其他页面可以依据Key获取到值。但是因为sessionstorage不能持久保存所以对于不是很重要的数据,但是短时间内存在的流程(比如对话框、向导),多个页面需要该数据的情况下可以存储在其中,而在以前这些数据需要用form或cookie进行来回传递的。

Localstorage代码使用上没有区别,但是要注意的是localstorage是持久化存储,除非用户删除是永远不会删除的。

扩展

IndexedDB

大容量索引型的数据结构存储可以看看IndexedDB,以K/V键值对形式进行数据存储。

程序应用层缓存

在应用开发过程中,需要了解缓存可以有效的提高程序的响应能力与处理能力。

那哪些数据写入缓存?

大量非实时更新的数据内容,如文章,站点信息,tag分类,rss list信息

Mpf魔炫网上面一个专题里面有着视频信息、专题信息、相关文章信息、微博信息等内容。

在项目上线运营之初没有考虑到具体的情况,后来分析发现在视频详细页与专题页是有着最高的访问量的,最高是达到了1万人同时在线访问,那段时间导致后台压力巨大,用户打开页面缓慢;之后做出调整,在视频、专题信息填写完成之后很少进行改动,所以我们决定把一些如视频信息,专题信息,相关文章信息等内容加入到缓存区,用户在进行访问是可以说服务器几乎不用查询mysql了。能够很大的提高用户的访问量,服务器数据能快速的返回。

ORM对象,大量的sql的查询主要作用于服务器磁盘的IO,在一定程度上mysql的反应速度体现在磁盘IO的速度上。那么在实现ORM对象缓存是,需要考虑的是

我们是以减少服务器磁盘IO为目的,不是为了减少发送到数据库的sql条数;使用ORM会增减sql语句条数。

既然决定采用ORM模式作为主要的数据读写操作,那么在数据库表结构的设计上尽量越细越好,经常查询访问的大数据量单独列表。

同时在构建sql语句是尽量避免多表关联查询,拆成多表的主键查询。(某个location附近的event)

保存缓存的数据同步

加入缓存后,就存在这样的问题;要保存缓存与数据库数据的一致性!否则数据不一致会加大程序排除问题的难度。那么数据一致性通常是在insert,update,delete时。可以以回调的方式实现缓存的同步。

Insert数据到数据库时,在insert成功后,将得到的最新last_insertid作为key,当前的数据内容作为value存入到缓存。数据在被调用时,直接就是获取缓存了。

Update 对于缓存的数据更新可以有两种方式。

1、   主动更新

2、   被动更新

主动更新就是update记录成功后,直接回调update缓存机制。

$cache->Delete($id);

$cache->set($id, $data);

先删除,后写入保持数据的最新。

被动更新则是,在用户访问这个页面时程序调用发现没有缓存,第一次去数据库读取内容返回,且写入缓存;用户第二次访问这个页面时则返回的是缓存数据内容了。

那么我个人推荐的是第一种,即在更新数据时直接同时回调将缓存数据内容也更新,这样避免在用户第一次访问时可能会得到一个较慢的响应。

案例:

某个网站的文章缓存是以文章id+文章的updatetime来作为key进行数据缓存的,在文章更新时updatetime改变,用户访问程序进行缓存查询时没有找到,进而查询数据库返回并且写入到cache中,注意这时原先的缓存并没有删除且也可能没有过期,那么就是一直存在其中缓存系统之中,直到缓存系统自动的垃圾回收。

1、   这样需要用户访问,被动式更新

2、   加重缓存系统的压力,需要管理更多的实际上对程序来说已经过期了的数据内容。

缓存的过期数据处理

缓存的过期数据处理的实现主要是两个方面的

1、数据库记录在删除时,同时回调删除缓存中的数据内容。

2、缓存对象系统的自动清除

建议是在数据库记录delete成功后回调清除cache中的记录信息,保持缓存系统中数据的清洁度。

Kohana中的缓存实现

Kohana内核框架只有一个简单的file cache方式,core.php里面的kohana:cache($key, $data, $lifetime = NULL)方法。实现方式就是当前时间与文件内容修改时间比对。

If($data === NULL){

If( (time() – fimemtime( $file)) < $lifetime ){

Return unserialize(file_get_content($file));

}else{

// delete expires cache file

}

Return NULL;

}

file_put_contents($file, serialize($data)); //写入

在项目复杂的业务逻辑中,这样的缓存机制肯定是不够用的了。所以kohana采用cache module用来专门的做缓存实现。且缓存实现在框架内核中多次用到,所以内核框架是有几个必须依赖的module的,cache就是其中之一。

今cache module实现的缓存驱动有apc,file,memcache,sqlite,wincache这几种,而我们常用的就是file,memcache。

Kohana中的缓存应用主要体现在

1、   类实例对象的缓存

2、   配置信息的缓存应用

分享总结

昨天讲解完毕之后,反响不咋地;你自己理解不一定能完整清晰的表达出来,有些问题模糊不清,自己也没弄明白,确实没有讲好;整体内容很全面,但是没有具体到哪一点,好像什么都概括了,但是没有侧重某一点深入讲开。

而且演讲的技巧要加强啊,整个过程就是自己个人概述没有一个活跃的气氛,让人昏昏欲睡。

总结下来就是几点

1、  整体内容比较多,较平。介绍用户一个请求过程中哪些地方可加入缓存机制,没有侧重某一点。

2、  内容概念多,实质涉及代码较少;需要把概念与代码结合起来。

3、  有些地方的问题较模糊,讲述不够清楚。

4、  事前对于提出需求的人想了解的内容,没有深入进行讲解。事先沟通没有做好。

5、  缓存应用的程序深度应用需要加强,内容较为浅显;案例分析代码讲解较少。

“笔记”项目缓存应用

有感于Web应用的缓存设计模式这篇文章里面的缓存使用设计。

其实缓存方面确实可以大做文章,看看这位大牛的理念

  • 以减少数据库服务器磁盘IO为最终目的,而不是减少发送到数据库的SQL条数。实际上使用ORM,会显著增加SQL条数,有时候会成倍增加SQL。
  • 数据库schema设计的取向是尽量设计 细颗粒度 的表,表和表之间用外键关联,颗粒度越细,缓存对象的单位越小,缓存的应用场景越广泛
  • 尽量避免多表关联查询,尽量拆成多个表单独的主键查询,尽量多制造 n + 1 条查询,不要害怕“臭名昭著”的 n + 1 问题,实际上 n + 1 才能有效利用ORM缓存

拆分n+1条查询的方式,看起来似乎非常违反大家的直觉,但实际上这是真理,我实践经验证明:数据库服务器的瓶颈往往是磁盘IO,而不是SQL并发数量。因此 拆分n+1条查询本质上是以增加n条SQL语句为代价,简化复杂SQL,换取数据库服务器磁盘IO的降低 当然这样做以后,对于ORM来说,有额外的好处,就是可以高效的使用缓存了。

这里我看到了这样的一个新概念,就是“数据库的瓶颈往往是磁盘IO,而不是SQL的并发数量”;这个说法我也不知道是否正确的,没有经历过百万千万数据级别的研究与维护;不过可以学习一下。

确实如同该博主所说,对于一个没有太多访问量的网站有些过度设计,不过如果用户或数据量突然飙升情况下可以以较少的代码更改,实现更高的承载力;当然了,在网站最初设计时,这些因素也应当考虑进去;之前我做的mpf就是没有考虑这些问题,导致高峰时期(1w+ 并发)都访问一个专题页面内容,而次次几乎都会读取数据库服务器,差点导致宕机,后来对于专题内呈现的非动态数据内容都进行了memcached缓存,这样应该好多了。

从数据读取已经ORM有效性来说,最小化schema表设计确实很有效果

1、主键查询mysql表会buffer数据缓存。

2、ORM关系很透明明了

3、ORM model对象可以直接进行数据缓存(目前公司有一个项目就是如此)

如一个微博系统,微博一张表,微博附属信息一张表,微博插入的音乐,图像,视频,评论登录都是独立一张表,全部用id与微博主表关联起来。

按照column拆表实现细粒度对象缓存

数据库的瓶颈往往在磁盘IO上,所以应该尽量避免对大表的扫描。传统的拆表是按照row去拆分,保持表的体积不会过大,但是缺点是造成应用代码复杂度很高;使用ORM缓存的办法,则是按照column进行拆表,原则一般是:

  • 将大字段拆分出来,放在一个单独的表里面,表只有主键和大字段,外键放在主表当中
  • 将不参与where条件和统计查询的字段拆分出来,放在独立的表中,外键放在主表当中

按照column拆表本质上是一个去关系化的过程。主表只保留参与关系运算的字段,将非关系型的字段剥离到关联表当中,关联表仅允许主键查询,以Key-Value DB的方式来访问。因此这种缓存设计模式本质上是一种SQLDB和NoSQLDB的混合架构设计

数据库设计分表这个应该很常见了,常用字段一个表,非常用字段可以另一个表;同时大数据字段单独一表。

数据一致性问题

使用缓存,必须要考虑数据一致性问题。写入保持同步即可,在读取时需要首先检索cache里面有没有这样的数据,有着读取,无则读取数据并写入缓存;

主要麻烦的地方就是在于update与delete,在原数据信息更新时,缓存数据也必须更新了,否则数据会不一致。不论是内存缓存还是文件脚本缓存或是html页面缓存都是这样的。区别在于是程序主动更新还是用户访问的被动更新。

有些开源cms 采用的就是用户被动访问更新,有人访问;采取cache中去读取更新。不过我更喜欢程序主动更新。如上文博主采用的以文章update更新时间+id作为key来存储缓存信息,在文章原数据update之后,update更新时间一定会被修改,那么读取时cache中就没有了这样的文章内容了,但是原来的文章数据缓存还是存在的,只能等待cache服务器进行自动抛弃更新。这样的话cache中就可能会多很多冗余数据了,对于cache服务器检索查询一定有影响吧。

我的选择就是在文章数据更新时直接update cache或者是不update cache 但是一定把原文章 cache数据清除掉。

在用户删除文章时,先对cache里面的数据进行清除,然后进行数据库的原数据删除。

今天抽空把daynote.sinaapp.com 中的markdown转换后的数据那一层进行缓存,缓存时间是7200s,对于此类非公开的私密日记。用户访问查看后一般都会选择离开,不会时时刻刻进行刷新数据请求,7200s数据缓存搓搓有余了。

原先的xhzd.sinaapp.com也是使用大量的memcache缓存,其中列表都使用了;但是考虑到sae上面的memcache额度,字详细那一块没有缓存。目前几乎没什么访问量,也就没有进行缓存操作了。如果访问量大,那么可以把几乎整个字典都存入了缓存了。

SAE上面使用memcache的方法请看这里

windows7 IE的保护模式对于js form.submit()自动执行提交的影响

近期在完成一个项目充值支付业务逻辑时,需要完成用户在网站上提交充值订单,网站后端处理充值订单信息,发布“网站正在跳转,进入充值平台”的提示信息,跳转至充值平台进行充值的这样一个流程。

因为直接采用的是discuzX进行二次开发,在xp、2003等各浏览器下业务逻辑测试都没有问题。就是在交付客户测试中,发现客户的IE9浏览器不能正常的充值支付;发现是停顿在了跳转消息发布的那一步中了,也就是说后端返回自建的form表单,并没有正确的提交。


// 对discuzx的提交进行了更改,没有采用ajax提交;而是直接订单form表单新页面提交,后端直接echo数据。

echo '<form id="payform" action="'.$requesturl.'" method="post"></form><script type="text/javascript" reload="1">$(\'payform\').submit();</script>';
dexit();

确实是个问题了,刚开始以为是订单form新页面提交后,新产生的此页面渲染模式有关,从而建立完整的文档结构


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9">

...

但是效果还是没好转,只是在完成提示信息;自己form表单还是没有进行自提交。再次google查看

不过在查看的过程中发现了这样一个问题,就是在xp或2003的系统上是能够正常跳转使用的;但在win7 ie下则不可以了,但是其他浏览器则行,就算是IE内核,但非ie官方的浏览器也是正常的。

于是对比2003与win7下的IE8设置,发现了下图独特的地方。

多了一个“启动保护模式”选择框!
另一位同事尝试的取消这个勾选框后,重启IE 再次测试就能正常的跳转了。
至此问题明了了,不过这个选择框是windows7上系列浏览器的默认勾选状态;所以不可能要求windows7的用户去更改此项设置,且会招致用户的反感。
于是在想办法的过程中参考了其他网站的api支付跳转实现效果,发现用户充值订单表单提交后,在跳转信息的提示过程中,程序后端并没有直接跳转至支付平台,而是再次跳转至网站本地后端的一个页面,而这个跳转的过程是使用window.location.href来实现的,而目标页面则直接通过header location跳转到了目标支付平台,也就是充值表单数据最终是以get方式发布至支付平台。(安全性方面不知道是否降低了,待验证)
代码结构再次更改后,2003下测试正常;在windows7下测试也能执行正常的跳转了!为此,新添加一个php页面用来处理添加充值订单,header页面跳转。而原form接受页面只是进行数据的收集以及跳转信息的提示。
在业务逻辑构造的过程中,查看了discuzx2.5最新版本;支付充值这块地方的代码还是没有变化还是采用自建from表单提交的方式实现的。于是在discuz官网论坛上面去搜索“IE9 充值”果然有很多用户的帖子,
而官方团队对此的回复是“该问题我们已经发现,这问题与环境有关,且不好重现,之前装有安全软件的一些用户也出现空白现象,往后我们再排查下是否是产品本身的兼容性问题。 感谢您的反馈1”
不过已经有用户发现了这样的问题了,并且有了对应的解答
知识普及:
IE保护模式原理简述

IE保护模式(Protected Mode),以前也叫做IE低权利(Lowcenters)。IE保护模式可能是Windows Vista里最严厉的安全措施,比我们熟知的UAC(用户帐户控制)还要严厉。事实上,IE保护模式依赖于Windows Vista的以下三大特性:

(1)UAC(用户帐户控制)

相信大家已经很熟悉了,可以让管理员帐户自动获得一个标准用户的访问令牌,以减少WindowsVista系统的受攻击面。

(2)MIC(强制完整性控制)

这是WindowsVista安全架构中新增加的一种检测机制。大家知道,Windows2000/XP安全体系里,安全子系统把进程的访问令牌和 资源的访问控制列表进行匹配比较,以确认该进程是否具有访问该资源的权限。而在WindowsVista下,除了遵守传统的安全控制机制外,还必须检查进 程和资源对象的完整性级别,完整性级别低的进程,不能写入完整性级别高的资源对象。

(3)UIPI(用户界面特权隔离)

完整性级别低的进程,不能向完整性级别高的进程发送Window消息。

windows IE浏览器安全设置的注意事项:

在这里,我们必须了解以下三点注意事项:

1.只有IE浏览器才能享用保护模式带来的好处,第三方的浏览器、或者以IE为内核的一些外挂浏览器无法获得保护模式的功能。

2.只有确认安全的网站,才能添加到可信站点区域。错将问题站点添加到可信区域,将会导致系统安全的严重受损。

3.最好能够对旧版插件进行改进,以确保插件的兼容性,这样可以大大提高系统安全。

扩展阅读

Internet Explorer 保护模式有何功能?

IE8浏览器安全设置 更好的安全浏览

关闭“保护模式”后,IE9还有没有安全?

网站性能优化

最近在对一个项目进行优化,后端方面,因为程序主要逻辑已经定型,所以只能对目前的部分代码进行重构,不能进行大规模的重写。主要包括减少数据库的访问,使用memcached缓存ajax轮询请求数据;而也并不是每个页面或功能点都需要对数据进行memcached缓存的,根据用户访问量与产品业务逻辑的分析只需针对几个特定的页面,如专题页面,视频播放页面,直播视频简介页面。例如大规模的流量入口集中于专题页面,而该页面存在大量的数据库查询,很多操作都是通过ajax获取对应的视频信息,而这些信息在发布后一般是不会变动的,所以直接对视频数据缓存于memcached中。这样需要修改的代码较少且能很好的减轻数据库服务器的压力。不过这里主要谈下前端数据请求传递的优化。

前端方面优化的话则肯定要参考雅虎的yslow优化法则了。
在未优化前使用firefox的yslow附加组件给网站打分结果为“D” 或“C”,下面几项优化完成后,得分为“A”或“B”;可能普通用户在网速很好的时候体验上与之前没有什么不同,不过对于带宽有限的用户体验有了很大的改进。

Make fewer HTTP requests
This page has 8 external Javascript scripts. Try combining them into one.
This page has 3 external stylesheets. Try combining them into one.
This page has 21 external background images. Try combining them with CSS sprites.

1、js有公用的也有只有当前页面采用的,全部合并受困于cms独立的js文件,且自定义的js合并工作量大且需要再次调试完成,主要成员是当初这样制作时考虑的是对应页面加载对应javascript。其中有两个是网站分析相关的。
2、js文件工作量大且不利于调试,不过css就没有太多这方面的顾虑且便于修改调试。经过3天的努力把整站的34个css样式表全部合并为一个css文件了。还好当初做过css模块化重用的考虑,不过即使这样也还是删除了许多重复的代码。总大小160kb没要太大的变化,不过css样式表只有一个了。节约了很多连接请求啊。
3、这里当初构建前端页面的时候没有太考虑sprites,所以以至于有太多的琐碎css小图需要请求连接。只是现在css结构完全成形,修改起来会很麻烦,需要重新切图,修改css等等。这里暂时不做修改。

Grade F on Use a Content Delivery Network (CDN)
xxxx.net: 71 components, 5619.0K
s25.cnzz.com: 1 component, 6.6K
c.cnzz.com: 1 component, 0.5K
player.pplive.cn: 1 component, 276.5K
wwwimages.adobe.com: 1 component, 1.7K
icon.cnzz.com: 1 component, 0.4K

使用内容分发网络,不过对于非大型高并发的网站来说这点暂时还是能容忍的。

Grade F on Add Expires headers
对文件添加缓存过期时间,apache需要mod_expires.c模块的支持,对于网站上的静态内容可以设置为never expire,动态内容按图片/js/css的更新时间来设定缓存时间。用户第一次访问你的网站页面意味着需要很多次http请求,通过使用Expires文件头可以让内容具有缓存性。它避免接下来的页面访问中不必要的http请求,浏览器或代理使用缓存来减少http的请求次数与大小以加快页面的响应速度,而服务器在http响应中的Expires文件头信息则告诉客户端内容需要缓存多久。
ExpiresActive On
ExpiresDefault A600
ExpiresByType image/x-icon A2592000
ExpiresByType application/javascript A2592000
ExpiresByType text/css A604800
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType text/plain A86400
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType video/x-flv A2592000
ExpiresByType application/pdf A2592000
#ExpiresByType text/html A600
另外,当点击浏览器上的刷新,客户端发送的请求中均是max-age=0,表示validate操作,发送请求到服务器
要求检查cache,再更新cache,一般得到的是304 Not Modified,表示没变动。

Grade F on Compress components with gzip
gzip数据压缩传递,用户70%-80%的时间都是在等待数据从服务器上下载。gzip对数据的压缩率很高可以达到70%以上,可以很大程度的压缩数据,减少加载的时间。
且可传递的数据包括文档,css、js、图片、xml等数据都能通过gzip方式进行压缩传递。如上文的160kb的css文件通过apache deflate压缩传递回来只有32kb了。所以压缩数据进行传输对节省用户等待时间,提高用户的体验有很大的帮助。不过gzip需要浏览器与服务器同时支持,即服务器能够对数据进行压缩,浏览器能支持识别压缩的数据内容。好在现在主流的浏览器都是支持gzip与deflate压缩的,最常见的apache iis nginx等都是能够实现的。
Apache1.x 使用的是第三方的mod_gzip模块,Apache2.x则考虑到了传输数据压缩的问题,直接内置的mod_deflate模块,可以在httpd.conf中开启,重启服务器即可。
LoadModule deflate_module modules/mod_deflate.so
Nginx 开启Gzip

#nginx gzip
# ngx_http_gzip_module 模块支持
# output compression saves bandwidth
gzip              on;
gzip_proxied      any;
gzip_http_version 1.1;
gzip_min_length   1100;
gzip_comp_level   5;
gzip_buffers      8 16k;
gzip_types        text/plain text/xml text/css application/x-javascript application/xml application/xml+rss text/javascript application/atom+xml;
gzip_vary        on;
#gzip_disable     “MSIE [1-6]\.”;

Grade C on Put JavaScript at bottom
javascript主要是依赖cms原来的。所以对于这部分在页面构建是没有进行变动,不过现在javascript可以直接放到</body>上面了。

Grade E on Avoid CSS expressions
什么危害可以直接参考yahoo的解答
CSS表达式是一个强大的(危险)的方式动态设置CSS属性。他们支持在Internet Explorer版本5起,但与IE8开始被废弃。作为一个例子,可以设置的背景颜色交替每隔一小时,使用CSS表达式:

background-color: expression( (new Date()).getHours()%2 ? “#B8D4FF” : “#F08A00” );

在这里,表达方法接受一个JavaScript表达式。 CSS属性设置根据JavaScript表达式计算出来的结果。expression的表达方法在非ie浏览器没有效果,因此在跨浏览器设计中只针对Internet Explorer。

css表达式的问题是,他们比大多数人预期的更加频繁地计算。他们不仅在页面呈现和调整大小,滚动页面时,甚至当用户在页面上移动鼠标都会重新计算一次。给CSS表达式添加计数器能够跟踪表达式的计算频率。在页面上移动鼠标,可以很容易地产生超过10,000的计算量。

一个减少CSS表达式计算的方法之一是使用一次性的表达,他在第一个表达式求值时将结果赋值给指定的样式属性,用这个属性取代了CSS表达式。如果样式属性必须设置动态页面的整个生命周期,使用事件句柄来代替CSS表达式是一种方法。如果您必须使用CSS表达式,请记住,他们可能会评估了数千次,并可能会影响你的页面的性能。

Grade F on Configure entity tags (ETags)
配置ETags,简单点说ETags就是服务器与浏览器之间用于判断浏览器缓存与服务器端的数据是否匹配的机制。ETag实体是比last-modified-date更加灵活的机制。ETag是识别内容版本的唯一字符串,服务器通过还有ETag的响应头信息指定加载文件的ETag。
浏览器要验证一个文件,就用if-none-match文件头把ETag传回给服务器,如果ETag匹配,就会返回一个304状态码,这样就节省这个文件对应大小的字节数了。ETag格式限制就是字符串必须在双引号内,IIS的ETag格式是,Filetimestamp:ChangeNumber;Apache1.x和Apache2.x的ETag格式是Inode-size-timestamp。不过ETag存在的一个问题是,它是根据网站所在服务器的唯一属性来生成的,当浏览器请求的这文件即使目录,权限,大小,修改日期等一模一样但存在与另一台服务器上,ETag也不会匹配的。
如果你没有使用ETag验证,那么就去掉好了。而文件认证则是采用last-modified文件头了。Apache在.htaccess中加入 FileETag None 即可。有关IIS的ETag信息查看http://support.microsoft.com/?id=922733

此外还有
1、外域过多,dns查找时间过长。
页面中存在太多站外域名了,这样加大了dns查找的时间,其中完全可以规避掉的有adobe图片logo,另cnzz域名太多了,icon都独立为一个域名请求。可以考虑替换一个网站数据分析。google分析就很不错。

2、引用不存在的文件
如图片/css/js/ico等,特别是引用不存在的javascript文件,服务器会提示该文件不存在,而浏览器则还是会继续把它返回的数据当作javascript执行。加大浏览器的负担。

3、图片进行了缩放,如1000pxX500px的图片缩放为200pxX100px。img图片位显示的图片最好不要缩放。

4、html标签必须属性要添加上。如img的alt

5、还有如css/js 使用压缩工具进行文件压缩,推荐 yui compressor

上面的很多东西都是参考来自于yahoo 优化法则的,这里有份中文pdf,Yahoo-Web网站性能优化最佳实践

****文档参考****
http://www.cnblogs.com/yuyii/archive/2008/10/16/1312238.html
http://kangzj.net/how-to-enable-gzip-for-ur-website/
http://developer.yahoo.com/performance/rules.html
http://httpd.apache.org/docs/2.2/mod/mod_expires.html
http://wiki.nginx.org/NginxChsHttpGzipModule