Month: May 2015

PHP如何解决网站大流量与高并发

首先,确认服务器硬件是否足够支持当前的流量。 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻底解决性能问题。 其次,优化数据库访问。 前台实现完全的静态化当然最好,可以完全不用访问数据库,不过对于频繁更新的网站, 静态化往往不能满足某些功能。 缓存技术就是另一个解决方案,就是将动态数据存储到缓存文件中,动态网页直接调用这些文件,而不必再访问数据库,WordPress和Z-Blog都大量使用这种缓存技术。 如果确实无法避免对数据库的访问,那么可以尝试优化数据库的查询SQL.避免使用 Select * from这样的语句,每次查询只返回自己需要的结果,避免短时间内的大量SQL查询。 第三,禁止外部的盗链。 外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对于自身的图片或者文件盗链,好在目前可以简单地通过refer来控制盗 链,Apache自己就可以通过配置来禁止盗链,IIS也有一些第三方的ISAPI可以实现同样的功能。当然,伪造refer也可以通过代码来实现盗链, 不过目前蓄意伪造refer盗链的还不多,可以先不去考虑,或者使用非技术手段来解决,比如在图片上增加水印。 第四,控制大文件的下载。 大文件的下载会占用很大的流量,并且对于非SCSI硬盘来说,大量文件下载会消耗CPU,使得网站响应能力下降。因此,尽量不要提供超过2M的大文件下载,如果需要提供,建议将大文件放在另外一台服务器上。… Read More

如何防止网站关键数据被人恶意采集

昨天晚上花了几个小时用Jsoup写了一个网站采集器,帮一个高中同学采集了一个工业信息门户上的芯片待售信息。网站上显示的数据多达60w+条, 我写的程序跑了7个小时只采集了一半,算是可以交差了。 这已经是我第二次写这种采集器了。之前在做波菜网的时候,写过一个更复杂的。当时网站上线以后苦于没有原生态的内容,我就写了一个采集器从“百度身边”采集各大城市的餐馆和菜品信息,并通过google地图的接口获取餐馆的地理位置,然后转存到我们自己的网站上。 我必须承认,做这些事儿都是不光彩的,属于不劳而获,弄不好还得背上法律责任。但是在国内这个互联网的环境下,这种小规模的数据采集想上升到法律层面去禁止,还是不切实际的。那么从一个网站的开发或者运营的角度,如何来防范别人的恶意采集呢?如何做到在防范的同时又不影响搜索引擎的蜘蛛的采集工作呢? 从我个人的采集经验来看,我觉得这种防御可以从两个方面着手。 服务器端的配置。至少可以通过防火墙来屏蔽某些ip的高频率访问,或者在web服务器设置规则来禁止关键页面被某些ip高频请求。也可以先通过防火墙设置预警机制,一旦发现异常立即通知web服务器采取屏蔽措施。不管是专业的采集器还是像我的这种纯代码级别的采集,最基本的原理就是模拟用户浏览网站行为,发送http请求到网站的server,然后解析返回的结果。出于效率起见这种采集行为都有几个共同的特点。一是发出请求的ip地址比较固定,二是请求的频率比较稳定,三是访问的页面也比较固定。防火墙的设置可以基于前面两个特征,web服务器的过滤规则可以基于后面两个特征。当然这些措施只是从物理层面的防御,放不了真正的高手。我在我的采集器里面实现的多线程采集,就会把采集频率用随机时间来控制,也就是发送采集请求的频率是随机的,有可能是3秒钟一次,有可能是2秒钟一次。另外如果我是黑客,我可以发动多个ip的肉机来发送请求。总之一句话,服务器上的防御,防得了君子,防不了高级的小人,但是有总比没有好。 代码级别的防御。采集器可以模拟浏览器大部分的行为,但是肯定有模仿不到的地方。比如说带参数的ajax请求。从我的经验来看,你至少可以在通过以下三种方式来优化你的代码,以防止恶意采集。 1>  关键信息通过ajax请求来获取,最好是需要带有临时token作为参数的请求。网站在发布的时候需要做javascript代码压缩和混淆,这样程序人员就很难通过阅读代码或者捕获请求来建立模拟采集。这里说的关键信息,是指那种对业界同行来说比较重要的信息,比如说价格等。除了这些关键信息以为的信息就最好不要用ajax请求来显示了,那样不利于SEO优化,搜索引擎的蜘蛛也不能模拟如此复杂ajax请求。另外如果有分页,一定要用ajax请求来分页。具体例子可以看看花瓣网的首页。至于通过表单请求来获取数据,有些采集器已经能模拟带session或者cookie信息的表单请求了,至少Jsoup是可以做到的。 2>  关键信息通过图片来显示。这种是技术含量比较低的防御了,唯一的好处是有利于SEO优化,因为图片通过alt来携带更加丰富的信息。京东的商品价格就是用图片来显示的,采集器采集到的价格信息需要做OCR文字识别,如果在图片的格式做些手脚或者加入混淆信息,那别人采集过去的信息准确度就会大大降低。另外通过图片来显示的另外一个好处就是可以把图片服务器独立出来,然后通过防火墙设置来只允许来自已知域名的请求。 3>  网页代码结构化混淆。简单的说就是关键信息的显示不是规律性的。这种做法对网站开发人员要求比较高。毕竟html是一种结构化的语言,想要通过不规律的html标签勾勒出美观的结构化界面是比较难的,但不是不可能。比如说同一张页面的上商品价格列表,你可以随机用div,li,span等这些文字标签来封装,然后通过定制css来达到规范布局。不同的页面(分页)上价格列表,最顶层的div的id或者class不一样,而且跟其他页面的的id无规律可循。这样做可以让采集程序很难发掘到采集的规律,那么采集的难度就大大加大了,即使能采集,效率也会相当低下。这种做法基本上不影响SEO优化。 不过话说回来,不管你采取哪种防御措施,想防住真正的高手是不可能的,只要能防住98%的人就可以了。剩下的那2%,你如果发现你的数据被采集了,就采取法律措施吧。前段时间大众点评起诉“食神摇一摇”抄袭数据,就是一个很好的例子。 转自:http://www.wptree.com/?p=646 本文: 如何防止网站关键数据被人恶意采集… Read More

jQuery模拟原生态App上拉刷新下拉加载效果代码

以下任意均可: 1. jQuery模拟原生态App上拉刷新下拉加载效果代码,鼠标上拉时会显示loading字样,并且会模拟加载一条静态数据,支持触屏设备使用。 DEMO:http://sources.ikeepstudying.com/drop-more/ 下载:jQuery模拟原生态App上拉刷新下拉加载效果代码   2.  jquery iscroll上拉 下拉加载内容 DEMO:http://sources.ikeepstudying.com/cubiq-iscroll/ 下载:jquery-iscroll  | 简约版: cubiq-iscroll   3. 移动端下拉刷新、上拉加载更多… Read More

重新拎一遍js的正则表达式

前言 js的正则表达式是前端中比较重要的部分,加入你要去面试,正则的题目必不可少。我之前的这篇文章中提及过。具体可以看:http://www.haorooms.com/post/qianduan_mianshi 正则表达式规则 一、普通字符 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是”普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。 举例: 表达式 “o”,在匹配字符串 “haorooms” 时,匹配结果是:成功;匹配到的内容是:”o”;匹配到的位置是:开始于2,结束于3。[注:o匹配一般只匹配第一个,假如要匹配所有的,那么表达式要加”/g”,就可以找到全局所有的。] 二、简单的转义字符 一些不便书写的字符,采用在前面加 “/” 的方法。这些字符其实我们都已经熟知了。 表达式 可匹配 /r, /n… Read More

js网页顶部线性页面加载进度条,jquery头部线性进度条总结

前言 网页顶部加载进度条,近年来很流行,很多网站都采用了这种加载方式。网上也有这样类似的插件,今天我们总结一下网页顶部线性页面加载进度条。 头部LoadingBar线性进度条总结 上面的代码只是静态效果,没有和网页加载联系在一起,要和网页加载联系在一起,今天推荐几个插件。 插件一:LoadingBar LoadingBar.js的地址是:http://www.onextrapixel.com/2013/09/02/loadingbar-js-adding-a-youtube-like-loading-bar-to-your-website/ 用ajax方式读取页面内容,然后加载。 插件二:NProgress.js NProgress.js的地址是:http://ricostacruz.com/nprogress/ 由于我也没有实际应用过,在这里就不多多阐述了,具体的方法里面都有详细的描述。 静态效果的实现 下面我再来说一说文章一开始的那个加载效果的实现吧!虽然只是静态的,但是也有借鉴意义,代码也是来源于网络。 由于上面的topbar是用css3写的,所以兼容性不是很好,IE游览器有些效果不兼容。大体的写法如下: body{ margin:0; } #progress {… Read More

jquery判断页面滚动条(scroll)是上滚还是下滚,且是否滚动到头部或者底部

webtouch(webapp)页面,防苹果手机safari浏览器,网上滑动,底部导航消失,滑动到底部又出现。向下滑动,底部导航出现。 遇到问题 1、我一开始用swipeup和swipedown来做,发现因为有滚动条,不会触发。因此只能判断滚动条是上滚下滚等。关于手机手势,后面的文章会介绍,欢迎关注! 2、通过上滚下滚来让底部导航显示或者因此,安卓上面的浏览器都可以,但是苹果safari会一闪一闪,原因是苹果safari自动有个弹跳效果,导致事件重复执行,解决办法是给上滚下滚一个距离,滚动到一定距离后返回是上滚还是下滚。 单纯判断滚动条方向 function scroll( fn ) { var beforeScrollTop = document.body.scrollTop, fn = fn ||… Read More

js页面文字选中后分享到新浪微博实现

一、功能简述 正是微博如火如荼的时节,其中各个微博的分享功能是网站推广产品的好东东啊,此时如何方便快捷的使用微博的分享功能就显得比较重要了。我的站点每篇文章的底部有一些分享的链接: 不过我觉得这些分享基本上就是聋子的耳朵——摆设。除非这篇文章惊天地、泣鬼神,痛彻心扉,穿越前世今生。但是,如果有更加方便快捷的分享方式,这种冷淡得让人结冰的场面或许就不会经常出现。 一般翻译软件都有划词翻译功能,例如有道桌面词典的桌面划词翻译功能: 启用后,随便选中那个软件的一段文字,就会出现类似这样子的浮动提示框: 在web页面上,我们也是可以实现类似的效果的:划词→显示提示→分享。这就是本文要展示的内容。 二、效果与demo demo 您可以狠狠地点击这里:js文字选中分享到新浪微博demo demo页面的文字是我点兵点将随机找的篇博客内容,纯粹示例。随便选择一段文字,结果就会出现个新浪的怪眼睛logo,然后,点击那个晃啊晃的猥琐的眼睛,就实现了选中文字分享到新浪微博的功能啦——会打开个新页面 是不是分享起来很简单很方便啊! 其实呢,本篇文章所在的页面本身就是个demo,你使用鼠标选中一段文字看看,哦呵呵,是不是有反应啊,不要犹豫,果断分享吧。//zxx:如果您发现并没有此效果,同时您没有禁用javascript,那么,您可能是在rss阅读器中或是在其他邪门歪道的网站上阅读本文,点击或浏览器地址栏中输入以下地址http://www.zhangxinxu.com/wordpress/?p=1428可以看到分享功能。 三、方法与代码 选中即分享的功能看上去比较高级,其实实现是相当简单的。其中的会让人头大,一般人也不感兴趣的原理这里就直接跳过。这个js文字选中后分享到新浪 微博的功能我简单的封装了下,方法名是:$sinaMiniBlogShare,当然,您不喜欢可以换掉,甚至不要,此方法完整代码如下: var $sinaMiniBlogShare =… Read More

Google Maps API 以某一经纬度为中心,以某一长度位半径画圆 Draw the radius of a circle

直接看代码: <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title> - jsFiddle demo</title> <script type='text/javascript' src="http://maps.google.com/maps/api/js?sensor=false&.js"></script> <script type='text/javascript'>… Read More