关于redis的传输协议

很久之前就想写这篇,但是因为时间问题一直也没有弄,先粗糙整理一篇。

redis的传输协议(RESP)

redis的协议总体算比较简单,第一个符号表示回复的类型:

"+" 表示是一个简单字符串,一般都是状态消息,比如输入PING命令
"-" 错误返回使用减号,比如输入一条错误命令
":" 返回数字,比如使用INC命令
"$" 表示返回一条字符串安全的字符串,最长512M,比如使用GET命令
"*" 返回的是一组数据,比如使用SMEMBERS命令

如果是"+"、"-"或者":"后面紧跟着消息体,然后跟一个CRLF,CRLF其实就是"\r\n",消息结束。

[+-:]<msg>CRLF

比如:

  •  +PONG\r\n
  • -unknow command 'foobar'\r\n
  • :10\r\n

剩下的两个个形式在第一个符号后面跟着对应的长度表示,然后是CRLF,接着是消息体表示,最后CRLF结尾:

[$*]<LEN>CRLF<BODY>CRLF

这里的<LEN>如果是结果是字符串则表示字符串长度,如果是一组数据则表示元素个数。<BODY>是消息体,如果是字符串则表示字符串长度,如果是一组数据则使用对应的单条数据的表示形式填充(:|$等数据)。如果长度是-1则表示没有这条数据。比如:

  • $6\r\nfoobar\r\n
  • $-1\r\n
  • *0\r\n
  • *2\r\n$3\r\nfoor$3\r\nbar\r\n
  • *5\r\n:10\r\n$-1\r\n$3foor\r\n

redis协议可以参考这篇文档:redis protocol

这里还有篇中文的:通信协议

继续阅读

php 异步执行脚本

最近有个地方需要拉起一个脚本处理任务,起了进程交给init进程发现还是会阻塞,后来找到这篇文章,发现原来自己想的太复杂。

这里说的异步执行是让php脚本在后台挂起一个执行具体操作的脚本,主脚本退出后,挂起的脚本还能继续执行。比如执行某些耗时操作或可以并行执行的操作,可以采用php异步执行的方式。主脚本和子脚本的通讯可以采用外部文件或memcached的方式。原理就是通过exec或system来执行一个外部命令。注意:本文所述的是针对Linux环境。

在Linux下要让一个脚本挂在后台执行可以在命令的结尾加上一个 “&” 符号,有时候这还不够,需要借助nohup命令才能是忽略挂起信号。

继续阅读

mysq使用like查找有反斜杠的数据

不知道什么时候记录的这条了,一直也没发布。

这里的重点是使用like binary,而且使用了四个反斜线。

具体可以参考下面的地址:

http://stackoverflow.com/questions/8583144/mysql-like-operator-with-wildcard-and-backslash

wordpress禁用Google Open Sans字体

这两天打开博客发现十分慢,看了一下网络请求,发现多了一个google样式

搜了一下发现wordpress3.8开始就使用这个google开放字体了,由于google的网络因为一些原因访问异常,所以我们只能想办法禁用掉了。

可以使用【Disable Google Fonts】这个插件禁用这个样式。

PHP autoload和spl_autoload自动加载机制详解 [转]

PHP autoload机制详解

(1) autoload机制概述

在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这 也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例 子:

在这个例子中,no-autoload.php文件需要使用Person类,它使用了require_once将其包含,然后就可以直接使用Person类来实例化一个对象。

但 随着项目规模的不断扩大,使用这种方式会带来一些隐含的问题:如果一个PHP文件需要使用很多其它类,那么就需要很多的require/include语 句,这样有可能会造成遗漏或者包含进不必要的类文件。如果大量的文件都需要使用其它的类,那么要保证每个文件都包含正确的类文件肯定是一个噩梦。

PHP5为这个问题提供了一个解决方案,这就是类的自动装载(autoload)机制。autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件include进来,这种机制也称为lazyloading。 下面是使用autoload机制加载Person类的例子:

通常PHP5在使用一个类时,如果发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。在我们这个简 单的例子中,我们直接将类名加上扩展名" title="扩展名">扩展名”.class.php”构成了类文件名,然后使用require_once将其加载。

从这个例子中,我们可以看出 autoload至少要做三件事情,第一件事是根据类名确定类文件名,第二件事是确定类文件所在的磁盘路径(在我们的例子是最简单的情况,类与调用它们的 PHP程序文件在同一个文件夹下),第三件事是将类从磁盘文件中加载到系统中。第三步最简单,只需要使用include/require即可。要实现第一 步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。 继续阅读