最近练手php,一个地方需要缓存来支持,想来想去还是用memcached做缓存,可是电脑是windows系统,如果是linux系统安装memcached就比较容易,敲入几行shell就搞定,windows下还没搞过,于是记录下过程,备用。
Windows下的Memcache安装
1、下载memcache for windows。下载地址:http://jehiah.cz/projects/memcached-win32,推荐下载binaries版本,解压(本例中解压到c:\\memcached)。
2、在命令行状态下输入: c:\\memcached\\memcached.exe -d install 。至此memcached已经安装成windows服务
3、在命令行下输入: c:\\memcached\\memcached.exe -d start 以启动memcached服务。当然也可以选择在windows服务中启动
你没看错,就是这么简单,简简单单的三步memcache的服务器端就准备完毕
php安装Memcached模块支持
1、下载php_memcache.dll模块,你可以从http://downloads.php.net/pierre/找到对应的版本,
php5.3的直接下载http://shikii.net/blog/downloads/php_memcache-cvs-20090703-5.3-VC6-x86.zip
2、修改php.ini,添加如下内容:
extension=php_memcache.dll
3、重启apache服务器,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!
测试windows下的Memcached
测试代码如下:
< ?php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
$mem->set('key', 'Hello Memcached!', 0, 60);
$val = $mem->get('key');
echo $val;
更多测试代码,需要移步:
http://www.php.net/manual/en/memcache.examples-overview.php
Memcached的基本设置
继续阅读全文……
这是我前些日子准备的关于《XSS注入和防范》的技术分享ppt,现在放出来,之前是做的powderpoint文件,后来网上流传impress.js做ppt,于是自己也整了个impress.js版本的放在了SAE上面,经过测试发现当ppt的内容较多,带有图片等,impress.js效果就会比较卡。不多说其他的,说说ppt的内容:
《XSS注入和防范》主要从xss是什么,xss的危害,xss的类型及其防范的措施,几个方面来讲解xss。希望对大家理解xss有所帮助,另外多说句cookie的httponly方式,在apache下面有个漏洞,当cookie超过4k的时候就会出现泄漏,所以要注意这个漏洞!(具体代码:狂点此处)
废话不多说了,上ppt地址:【PPT分享】XSS注入和防范,请使用支持chrome浏览器查看ppt页面

XSS注入和防范
继续阅读全文……
IE6 a标签的请求被abort的原因
最近项目中掉进IE6 a标签abort两次坑,第一次是a标签绑定一个事件,href='javascript:;'这样a标签触发了事件,切换验证码图片,结果验证码图片总是显示不出来,通过抓包显示状态为abort。其实这个的原因可以从IE6中a标签执行顺序说起,IE6中a标签执行onclick在执行默认事件(即href跳转)之前,当触发了绑定的事件之后,那么处理完事件之后,如果不return false或者阻止默认事件,则会继续执行href跳转,IE6会认为页面跳转到其他页面或者页面重新刷新,则abort之前onclick事件中的请求。
继续阅读全文……
前端开发工程师都知道javascript有编码函数escape()和对应的解码函数unescape(),而php中只有个urlencode和urldecode,这个编码和解码函数对encodeURI和encodeURIComponent有效,但是对escape的是无效的。
javascript中的escape()函数和unescape()函数用户字符串编码,类似于PHP中的urlencode()函数,下面是php实现的escape函数代码:
/**
* js escape php 实现
* @param $string the sting want to be escaped
* @param $in_encoding
* @param $out_encoding
*/
function escape($string, $in_encoding = 'UTF-8',$out_encoding = 'UCS-2') {
$return = '';
if (function_exists('mb_get_info')) {
for($x = 0; $x < mb_strlen ( $string, $in_encoding ); $x ++) {
$str = mb_substr ( $string, $x, 1, $in_encoding );
if (strlen ( $str ) > 1) { // 多字节字符
$return .= '%u' . strtoupper ( bin2hex ( mb_convert_encoding ( $str, $out_encoding, $in_encoding ) ) );
} else {
$return .= '%' . strtoupper ( bin2hex ( $str ) );
}
}
}
return $return;
}
继续阅读全文……
IE中的contains方法可以判断A元素是否包含B元素,如果包含则返回true,否则返回false,在开发中会在事件代理处理上面用到。W3C的方法是compareDocumentPosition,所以综上来说:JS通过contains和compareDocumentPosition方法来确定DOM节点间的关系,判断一个元素(对象)是否为另一个元素的子元素。
IE的contains方法很简单,但是W3C的DOMElement.contains(DOMNode)方法会返回却是一个数值。
DOMElement.contains(DOMNode)
link:https://developer.mozilla.org/En/DOM/Node.compareDocumentPosition。
DOMElement.contains(DOMNode)返回的不是一个布尔值,而是一个很奇怪的数值,它是通过如下方式累加计算出来的:
| Bits |
Number |
Meaning |
| 000000 |
0 |
元素一致 |
| 000001 |
1 |
节点在不同的文档(或者一个在文档之外) |
| 000010 |
2 |
节点 B 在节点 A 之前 |
| 000100 |
4 |
节点 A 在节点 B 之前 |
| 001000 |
8 |
节点 B 包含节点 A |
| 010000 |
16 |
节点 A 包含节点 B |
| 100000 |
32 |
浏览器的私有使用 |
继续阅读全文……
元旦假期帮朋友折腾VPS,安装了centOS和lnmp,网站部好了,而且定时任务也加上了,觉得应该做个压力测试,之前用过apache自带的ab,不过今天使用的是webbench做压力测试。备份下安装测试过程。
首先我们先来安装webbench吧, 为了测试准确,请将 webbench 安装在别的linux服务器上, 因为webbench 做压力测试时,自身也会消耗CPU和内存资源, 否则, 很可能把自己服务器搞挂掉。于是我切换到了ubuntu系统做webbench测试。
安装webbench
安装过程比较简单,如果你的机子之前安装过一些常用软件直接使用下面的命令就可以了:
wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz
tar zxvf webbench-1.5.tar.gz
cd webbench-1.5
make && make install
webbench安装报错
没有安装ctags
如果没有安装 ctags make 编译会报错:/bin/sh: ctags: command not found
这时当然是要安装ctags啦,于是:
apt-get install ctags
搞定
没有安装gcc
这时候可能会报错:
cc: Command not found
这时需要gcc:
apt-get install gcc
其他报错
如果出现下面的错误:
cannot create regular file `/usr/local/man/man1′: No such file or directory
继续阅读全文……
你尝试过写javascript不用字母和数字吗?最近准备个xss的分享,记起了之前看到过老外一篇文章,内容是关于non-alpha javascript的,拿到代码分析下。
先看这段猥琐的javascript代码:
_=+[];$=_++;__=(_< <_);___=(_<<_)+_;____=__+__;_____=__+___;$$=({}+"")[_____]+({}+"")[_]+({}[$]+"")[_]+(($!=$)+"")[___]+(($==$)+"")[$]+(($==$)+"")[_]+(($==$)+"")[__]+({}+"")[_____]+(($==$)+"")[$]+({}+"")[_]+(($==$)+"")[_];$$$=(($!=$)+"")[_]+(($!=$)+"")[__]+(($==$)+"")[___]+(($==$)+"")[_]+(($==$)+"")[$];$_$=({}+"")[_____]+({}+"")[_]+({}+"")[_]+(($!=$)+"")[__]+({}+"")[__+_____]+({}+"")[_____]+ ({}+"")[_]+({}[$]+"")[__]+(($==$)+"")[___]; ($)[$$][$$]($$$+"('"+$_$+"')")();
看到这里你肯定抓狂了,但是这段代码是可以运行的,运行的结果是 alert('cool code'); 。
javascript分析
这段代码能够运行,原因是javascript是弱类型的脚本语言,而且语法相对松散。例如下面的javascript是正确的,而且是有出乎意料结果的:
继续阅读全文……
前几天看到国外人在github总结的javascript的奇巧淫技(http://t.cn/herRcq),里面对位运算提到的很多,所以来科普一下javascript的位运算。于是找到了w3cschool的这篇教程,很好很强大啊,于是就忍不住转载了……
ECMAScript 整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在 ECMAScript 中,所有整数字面量默认都是有符号整数,这意味着什么呢?
有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数。数值范围从 -2147483648 到 2147483647。
可以以两种不同的方式存储二进制形式的有符号整数,一种用于存储正数,一种用于存储负数。正数是以真二进制形式存储的,前 31 位中的每一位都表示 2 的幂,从第 1 位(位 0)开始,表示 20,第 2 位(位 1)表示 21。没用到的位用 0 填充,即忽略不计。例如,下图展示的是数 18 的表示法。

18 的二进制版本只用了前 5 位,它们是这个数字的有效位。把数字转换成二进制字符串,就能看到有效位:
var iNum = 18;
alert(iNum.toString(2)); //输出 "10010"
这段代码只输出 “10010″,而不是 18 的 32 位表示。其他的数位并不重要,因为仅使用前 5 位即可确定这个十进制数值。如下图所示:

负数也存储为二进制代码,不过采用的形式是二进制补码。计算数字二进制补码的步骤有三步:
- 确定该数字的非负版本的二进制表示(例如,要计算 -18的二进制补码,首先要确定 18 的二进制表示)
- 求得二进制反码,即要把 0 替换为 1,把 1 替换为 0
- 在二进制反码上加 1
要确定 -18 的二进制表示,首先必须得到 18 的二进制表示,如下所示:
0000 0000 0000 0000 0000 0000 0001 0010
接下来,计算二进制反码,如下所示:
1111 1111 1111 1111 1111 1111 1110 1101
最后,在二进制反码上加 1,如下所示:
1111 1111 1111 1111 1111 1111 1110 1101
1
---------------------------------------
1111 1111 1111 1111 1111 1111 1110 1110
因此,-18 的二进制表示即 1111 1111 1111 1111 1111 1111 1110 1110。记住,在处理有符号整数时,开发者不能访问 31 位。
有趣的是,把负整数转换成二进制字符串后,ECMAScript 并不以二进制补码的形式显示,而是用数字绝对值的标准二进制代码前面加负号的形式输出。例如:
var iNum = -18;
alert(iNum.toString(2)); //输出 "-10010"
这段代码输出的是 “-10010″,而非二进制补码,这是为避免访问位 31。为了简便,ECMAScript 用一种简单的方式处理整数,使得开发者不必关心它们的用法。
另一方面,无符号整数把最后一位作为另一个数位处理。在这种模式中,第 32 位不表示数字的符号,而是值 231。由于这个额外的位,无符号整数的数值范围为 0 到 4294967295。对于小于 2147483647 的整数来说,无符号整数看来与有符号整数一样,而大于 2147483647 的整数则要使用位 31(在有符号整数中,这一位总是 0)。
把无符号整数转换成字符串后,只返回它们的有效位。
注意:所有整数字面量都默认存储为有符号整数。只有 ECMAScript 的位运算符才能创建无符号整数。
继续阅读全文……
今天处理IE6下的一个bug,经过调试才发现是javascript文件文件总是执行不了,后来中午吃完饭回来才想起以前同事遇见的html中的javascript不可以执行的问题,怀疑是gzip的原因,此次的问题就是因为动态加载javascript文件导致代码不执行,经过研究发现gzip压缩过的javascript文件,如果header里Cache-Control 数据有no-cache, no-store,就会出现IE6中js代码不执行的问题。下面是转发的文章内容:
IE6下面调用开启了gzip压缩Javascript的时候,时常会碰到无法执行的情况,有可能是src调用,有可能是ajax调用,其它的浏览器工作正常,唯独IE6不能正常工作。
出现这个BUG的状况如下:
- 用户使用IE6浏览器
- 服务器没有设置 被请求文件(javascript) expires, cache-control.
- 服务器端开启了chunked encoding模式
- 通过javascrip的src调用方式或者ajax请求javascript文件
- 有可能是通过php生成的javascript文件
- 服务器端开启了gzip压缩
解决这个问题,我们要在服务器的cache-control和expires 头信息上做点工作。
经过测试,header头信息如下的gzip压缩过的javascript调用可以正常工作。
Cache-Control:maxage=1
Connection:keep-alive
Content-Encoding:gzip
Content-Type:application/x-javascript;charset=GBK
Date:Wed, 01 Dec 2010 01:24:07 GMT
Expires:Wed, 01 Dec 2010 01:24:08 GMT
Pragma:public
Server:nginx
Transfer-Encoding:chunked
分析上面的头信息,我们可以注意到:
- cache-control必须要设置成maxage=time的格式,maxage是指定缓存生效时间,1为1秒
- Expires必须要设置,它的时间稍大于Date即可,Date是页面请求时间,Expires是过期时间
- Pragma设置为public
继续阅读全文……