If you got a dream,You gotta protect it! -《The Pursuit of Happyness》

Fastcgi协议定义解释与说明

首先介绍响应的数据,比较简单,再者我们对返回的数据比较敏感……

1 响应格式
如(十六进制方式显示)

序列0(值01)为version,固定取1即可
序列1(值06)为type,代表FCGI_STDOUT,表示应用的输出
序列2 3(00 01)代表2字节的请求id,默认取1即可(准确说应该是和请求应用时发送的id一致,这里假设请求和响应的id都是1)
序列4 5(01 1D)代表2字节的输出长度,最大为65535,例如当前内容长度为(0x01 << 8) + 0x1D = 285
序列6(03)代表填充padding字节数(填充为满8字节的整数倍),例如当前填充(以0填充)长度为8 – 285 % 8 = 3,即获取输出长度(285)的内容后要跳过的字节数,当然如果为8就无需填充了
序列7(00)为保留字节
8字节(序列7)之后为具体内容(contentData)和填充内容(paddingData)

最后为通知web服务器的请求结束记录,具体内容如下

其中序列1(03)type代表FCGI_END_REQUEST,即请求结束,8字节之后为contentData(EndRequestBody)和paddingData
EndRequestBody的内容也比较个性,是单独定义的

appStatus占了四个字节,定义为cgi通过调用系统退出返回的状态码(The application sets the protocolStatus component to FCGI_REQUEST_COMPLETE and the appStatus component to the status code that the CGI program would have returned via the exit system call.)Linux正常的程序退出默认是返回0(应该是吧?我记着是……)

继续阅读 »

Mac OSX 命令行下控制 Wifi命令

Mac 命令行下查看当前 Wifi网络设备名称

本人结果如下,可以看到我的 Wifi 设备名称为 en0 后面命令需要该设备名称。

继续阅读 »

TCP KeepAlive的几个附加选项[转]

TCP_KEEPALIVE选项只是一个开关,Linux中默认的Keepalive的选项如下:

上文中的keepalive选项表示如果一个连接上7200s后没有任何数据发送,则设置了这个选项的本端向对端发送keepalive保活报文,它会有如下三种结果:

对端回复ACK。则本端TCP认为该连接依然存活。继续等7200s后再发送keepalive报文。
对端回复RESET。说明对端进程已经重启,本端的应用程序应该关闭该连接。
没有对端的任何回复。则本端做重试,如果重试9次(前后重试间隔为75秒)仍然不可达,则向应用程序返回错误信息,ETIMEOUT(无任何应答)或EHOST
如果应用程序向改变keepalive的默认行为,该怎么办呢?答案就是利用 TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT这几个TCP选项,首先看看如何使用:
继续阅读 »

PHP防止SQL注入终极大招

如果到现在为止 你还在使用 mysql_* 系列函数,劝你赶紧改吧。

先把结论奉上(重要的事情说三遍):
使用预处理SQL和参数绑定机制!
使用预处理SQL和参数绑定机制!
使用预处理SQL和参数绑定机制!

此方式在发送给 Mysql Server 时预处理SQL语句和参数是分离发送,这种情况下想进行 SQL 注入是不可能的。

两种方式实现处理SQL语句机制

1、使用 PDO (支持任何数据库)

2、使用 MysqLi(仅支持 Mysql)

如果你使用的不是 Mysql, 对 PostgreSQL 有特殊函数支持 具体请参考 pg_prepare() 和 pg_execute()。
当然使用 PDO 才是王道!
继续阅读 »

WordPress 插件工作原理剖析[转]

一直对软件的组件、插件架构非常感兴趣,我认为现在开发任何应用程序,一定要有一个架构良好的插件机制,这样可以吸引其他人来开发插件,极大的扩充系统的功能。

Eclipse就是一个非常棒的例子,几乎你想什么功能,都可以从社区中找到相应的第三方插件。Firefox也同样如此,它的插件机制非常灵活(尤其是相对IE而言),因此Firefox社区中可以找到各种各样的插件。

1)WordPress读取所有可用的插件
在文件“/wp-admin/includes/plugin.php”中,函数 get_plugins() 用来从文件系统得到所有的插件。

原理很简单,就是读取“wp-content/plugins”目录下的所有PHP文件。这个函数允许一级的子文件夹,也就是说在’wp-content/plugins’下面的PHP文件,以及所以在此目录下的一级子文件夹内部的PHP文件被列作插件的候选,用下面的函数去进一步提取插件信息。这样的好处是方便用户利用文件夹来对插件进行管理和组织。
而函数 get_plugin_data() 则用来得到插件的描述(Plugin Descriptor),主要包括插件的版本、名称、作者,等信息,而这些其实是以注释的方式存在的。用WordPress中自带的Hello插件来举例:

这样,在get_plugin_data函数中,就可以来得到插件的详细信息。
继续阅读 »

PHP扩展内类如何注册命名空间 Namespace?

找到这个问题说明你已经学会了类的基本定义,如果不会 移步这里: PHP扩展内如何定义类、方法

其实PHP 内命名空间注册非常简单,和类名注册一样,在PHP底层其实命名空间也是类,就是不同的字符串,别想太复杂了。

然后就在可以在 php 内直接使用

简单吧~~

PHP扩展内如何定义类、方法?

start

PHP 类底层数据结构为 zend_class_entry 结构体,下面是摘录源代码 稍微了解下即可。
可以看到 有类名、继承父类入口,函数表,静态资源,属性(资产),各种魔术方法,继承接口,构造/析构函数等。

继续阅读 »

为什么要用 do{ }while(0) ?

当使用do{ }while(0)时由于条件肯定为 false,代码也肯定只执行一次。
肯定只执行一次的代码为什么要放在do-while语句里呢? 这种方式适用 于宏定义中存在多语句的情况。如下所示代码:

代码进行预处理后,会变成:

这样if-else的结构就被破坏了if后面有两个语句,这样是无法编译通过的。

那为什么非要do-while而 不是简单的用{}括起来呢? 这样也能保证 if 后面只有一个语句。

例如上面的例子,在调用宏TEST的时候后 面加了一个分号, 虽然这个分号可有可无, 但是出于习惯我们一般都会写上。

那如果是把宏里的代码用 {}括起来,加上最后的那个分号。 还是不能通过编译。

所以一般的多表达式宏定义中都采用 do-while(0) 的方式。

 

来源:TIPI

MAKE_STD_ZVAL 宏展开示意

MAKE_STD_ZVAL 宏 结构如下

通过上面宏可以清楚知道 MAKE_STD_ZVAL 做了两步操作

1、为 zval 结构分配内存

2、初始化 zval 值

 

这样应该能理解 MAKE_STD_ZVAL 到底干什么的,
其实就是初始化 zval 结构,不需要自己分配内存,初始化变量等操作。

[转]Gitlab无法使用SSH协议文件解决方案

原文地址:http://digdeeply.org/archives/06142220.html

真是感谢原博主,感谢你有,转载作为笔记记录

Linux主机间建立信任关系
在主机A和主机B间建立信任关系,使主机A可以无密码ssh登陆主机B.

  1. A主机上执行 ssh-keygen -t rsa -b 1024 (也可以使用 ssh-keygen -t dsa -b 1024)
  2. 主目录下生成 .ssh目录
  3. 进入~/.ssh目录
  4. 执行 cat id_rsa.pub 将显示结果复制 (也可以使用cat id_dsa.pub,这个一般有现成的)
  5. B主机上进入主目录下的~/.ssh(如果没有,则执行ssh-keygen生成)
  6. 将复制的结果粘贴到B主机.ssh目录下的authorized_keys文件的最后一行
  7. ok,信任关系建立了,在主机A上执行 ssh user@B 第一次执行,会提示一个确认,选择yes回车,结果不用输入密码,登录成功!

其中有三点需要注意的地方,如果已经按照以上方法做了,还是不可以,那就比照下边三条对比一下:

  1. authorized_keys 文件必须是600权限(也就是-rw——-)或者644
  2. .ssh目录必须是700权限(也就是drwx——)
  3. /home/work目录 必须是 755权限 即drwxr-xr-x  (我在这里被坑了好几天,头都抓破了!好大的坑)

第(3)条太坑了,就因为 /home/user 目录是777,不是755,怎么都不行,信任关系建不起来,最后把/home/user目录的权限由777改成755就立搞定了。。。>_<,好大的坑啊。。。    

返回顶部