高性能HTTP加速器:Varnish

Varnish是一款高性能且开源的反向代理服务器和HTTP加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的Squid相比,Varnish具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用Varnish来替换Squid,这些都促进Varnish迅速发展起来。
挪威的最大的在线报纸Verdens Gang(vg.no)使用3台Varnish代替了原来的12台Squid,性能比以前更好,这是Varnish最成功的应用案例。

Varnish与一般服务器软件类似,分为master进程和child进程。master进程读入存储配置文件,调用合适的存储类型,然后创建/读入相应大小的缓存文件,接着master初始化管理该存储空间的结构体,然后fork并监控child进程。child进程在主线程的初始化的过程中,将前面打开的存储文件整个mmap到内存中,此时创建并初始化空闲结构体,挂到存储管理结构体,以待分配。child进程分配若干线程进行工作,主要包括一些管理线程和很多worker线程。

接着,开始真正的工作,Varnish的某个负责接收新HTTP连接线程开始等待用户,如果有新的HTTP连接过来,它总负责接收,然后唤醒某个等待中的线程,并把具体的处理过程交给它。worker线程读入HTTP请求的URI,查找已有的object,如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。

分配缓存的过程是这样的:它根据所读到object的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个object的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据LRU机制,把最旧的object释放掉。

释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object的生存期,如果超初设定的TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。

整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object都考虑是在内存中,如果系统内存不足,系统会自动将其换到swap空间,而不需要Varnish程序去控制。

官方网站:https://www.varnish-cache.org/

历史记录API类:History.js

History.js是一个操作历史记录API的JS类,支持所有浏览器,并且对jQuery、Zepto、MooTools等框架都有相应扩展。在开发单页应用项目时可以直接修改视图的URL,而无需再使用URL Hash的老办法进行视图管理。在本站简单的全站AJAX翻页效果一文中也使用了History.js。

History.js内置了pushState, replaceState, onPopState等几个方法,可以自动监听URL变化,进行对应的处理。

Github:History.js

简单的全站AJAX翻页效果

首先假设全站页面结构都如下:

整站页面都有固定的区块内容会改变。

通过js监听页面上所有的a标签点击事件:

推送历史记录需要用到 History.js

4个好用的JS联动选择插件

jQuery City Select

jQuery City Select

一个简单的jQuery省市联动插件,可以自定义JSON字典实现其他内容的联动选择菜单。

PCAS省、市、地区联动选择JS封装类

PCAS (Province City Area Selector 省、市、地区联动选择JS封装类

PCAS可能是国内使用人数最多的JS省市联动菜单封装类,也是使用方法最简单的省市联动菜单。不过作者已经很久没更新过地址库的数据了。

jQuery Dependent Selects

jQuery Dependent Selects

jQuery Dependent Selects只需要在option中指明各层级之间的依赖关系,就可以自动生成多级联动下拉菜单。在小型的项目里是个不错的选择。

LinkageSel无限级联动下拉菜单

Javascript Infinite Level Select 无限级联动下拉菜单

LinkageSel是我目前用过最强大的联动菜单控件,只需要通过设置参数就可以按你的需求生成强大的联动菜单。

用JS检测用户是否能打开国外网站

最近需要在一个页面上添加Facebook的赞按钮,可是这个大公司的网站居然有很多人都打不开,资源文件请求时间过长导致页面加载巨慢。为了减少对页面加载的影响,我写了一个JS脚本用来检测用户是否能打开Facebook。

通过加载一个www.facebook.com域名下的图片,并监听image的onload事件是否被触发,就可以确定用户是否能正常访问Facebook了。不过前提是这个文件必须是个图片,而且不出现4xx状态码。为了验证这个方法是否可行,可以用下面的代码进行测试。

Laravel生成验证码

在composer.json中增加依赖:

在命令行中切换到项目根目录,运行:

编辑app/config/app.php,增加配置项:

在app/controllers目录中建立ExtController.php

增加路由:

用到的库:

https://packagist.org/packages/gregwar/captcha

思路:

把生成的验证码加密后放到Session里,供验证用。同时使用独立的加密key增强安全性。

PHP通过文件signature识别文件格式

在很多PHP项目里,开发者都惯用扩展名来检测文件格式,在允许用户上传文件的项目中往往会因为检查不严格让恶意用户上传大量非法文件。在这样的项目里,通过文件signature检查文件格式是一个简易有效的解决方法。

 注:此方法不适合用来检测CSS、HTML、XML、CSV等plain text型文件,因为plain text并没有固定格式的signature。

更多的文件signature信息可以到 http://www.filesignatures.net/ 查询。