作者归档:admin

Form表单的enctype属性和method属性

在WEB开发过程中,Form表单元素是一个使用频率非常高的控件,对于这样一个控件,也许我们并没有认真关注过。今天我们来解读它的enctype属性和method属性。

enctype 属性

enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。它的编码方式有三种:

  • application/x-www-form-urlencoded编码是以name=value键值对为基础,以&连接;
    此为默认值。如果method属性为GET,则编码后的字符串会接到url的后面(其实用其它编码方式,GET的效果也是一样的)。
    如果method属性为POST,则编码后的字符串会被封装到HTTP协议的请求实体中,然后发送到服务器。
  • text/plain编码是以name=value键值对为基础,以\r\n连接;如果服务端的程序是PHP的话,使用此编码,如果method为GET,一切和其它编码一样,如果method为POST,则无论是$_GET、$_POST还是$_REQUEST都无法获取数据,为什么呢?因为PHP对于POST方法处理方法中根本就没有针对这种编码的处理函数。当然,我们可以通过php://input或$HTTP_RAW_POST_DATA获取POST过来的原始值。
  • multipart/form-data编码,这是最为特殊的编码;以其Content-Type后面的boundary为分隔符,将各个控件的值包含的请求实体中。

对于POST请求,一般来说用默认的application/x-www-form-urlencoded就可以了。但是如果有文件控件(type=file)的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上 Content-Disposition(form-data或者file),Content-Type(默认为text/plain,且没有显示),name(控件的name)等信息,并加上分割符(boundary)。

method 属性

Form的method属性支持POST和GET方法。默认为GET提交。
GET方法用于信息获取,而且应该是安全的和幂等的。所谓安全指该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。相当于SQL中的SELECT操作。所谓幂等指对同一URL的多个请求应该返回同样的结果。比如sina网中点击某一个新闻页面,不同的时候返回应该是同一篇文章,如果后台有修改这条新闻,用户所看到的内容不同,但是我们还是会认为这是幂等的。

POST方法表示可能修改变服务器上的资源的请求。这里的修改包括在服务器上增加资源,修改已有资源或者其它修改类型的操作。

虽然method只支持这两个方法,但是HTTP协议还定义了一些其它的方法:
比如PUT方法,它表示完全替换或更新一个已经存在的资源或创建一个新的资源。PUT与POST的差别是这是一个完整的修改,不存在只修改部分。比如DELETE,它表示删除一个资源。

只是,在实际应用中,为了图方便,我们经常使用GET方法实现修改操作,因为这样我们不需要创建表单,如此而已。

PHP变量的CV类型

PHP变量的CV类型

在我们使用VLD扩展查看PHP生成的中间代码时,经常会看到有这样一项:compiled vars: !0 = $a,或者如果使用更加详细的 -dvld.verbosity=3参数,会看到IS_CV,IS_VAR等类型。这里所说的Compiled vars和IS_CV都与今天我们所要了解的CV类型有莫大的关系。

CV者,Compiled variable也。
CV类型是PHP编译过程中产生的一种变量类型,以类似于缓存的方式,提高某些变量的存储速度。
与CV类型同一级别的类型还有:

	#define IS_CONST (1<<0)
	#define IS_TMP_VAR (1<<1)
	#define IS_VAR (1<<2)
	#define IS_UNUSED (1<<3) /* Unused variable */
	#define IS_CV (1<<4) /* Compiled variable */

比如最常见的赋值语句:$a = 10;

以php -dvld.active=1 -dvld.verbosity=3 test.php(这段代码在放在test.php文件中)查看。

 
	function name:  (null)
	number of ops:  3
	compiled vars:  !0 = $a
	line     # *  op            return  operands
	----------------------------------------------
	   2     0  >   EXT_STMT       RES[  IS_UNUSED  ]         OP1[  IS_UNUSED  ] OP2[  IS_UNUSED  ]
		 1      ASSIGN                 OP1[IS_CV !0 ] OP2[ ,  IS_CONST (0) 10 ]
	  13     2    > RETURN                 OP1[IS_CONST (0) 1 ]

如上我们可以知道10的类型为IS_CONST,$a的类型为IS_CV。

这里的CV类型在代码运行时存储在哪呢?在什么时候能起到性能优化的作用?

我们知道PHP中间代码运行的数据大部分都放在全局变量execute_data中,对于这个变量我们通常以EX(element)的方式调用,如EX(CVs)、EX(opline)等等。通过对execute_data所有字段的查阅我们可以大概知道CV类型变量存放在EX(CVs)中。

如何判别呢?
同样,以上面的简单赋值语句为例,依据其中间代码(ZEND_ASSIGN),操作数的类型(IS_CV和IS_CONST),可以得出其中间代码最终执行的函数为:ZEND_ASSIGN_SPEC_CV_CONST_HANDLE。在此函数中,对于操作数据处理:

	zval *value = &opline->op2.u.constant;
	zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);

op2为右值,op1为左值,左值的查找处理是_get_zval_ptr_ptr_cv。如下:

	static zend_always_inline zval **_get_zval_ptr_ptr_cv(const znode *node, const temp_variable *Ts, int type TSRMLS_DC)
	{
		zval ***ptr = &CV_OF(node->u.var);
 
		if (UNEXPECTED(*ptr == NULL)) {
			return _get_zval_cv_lookup(ptr, node->u.var, type TSRMLS_CC);
		}
		return *ptr;
	}
 
	// 函数中的CV_OF宏定义
	#define CV_OF(i)     (EG(current_execute_data)->CVs[i])

上面的函数和宏定义道出了CV这个类缓存机制的实现过程和CV类型的存储位置。

在函数中,程序会先判断变量是否存在于EX(CVs) – 这就是存储位置,如果存在则直接返回,否则调用_get_zval_cv_lookup,通过HashTable操作在EG(active_symbol_table)表中查找变量。虽然HashTable的查找操作已经比较快了,但是与原始的数组操作相比还是不在一个数量级。这就是CV类型变量的性能优化点所在。

以上是变量的赋值操作,也是变量的创建过程,与此对应,在变量销毁时PHP内核应该会对此种类型的变量执行清除HashTable和数组两个操作,以unset操作为例,针对IS_CV类型的变量,其中间代码最终会执行ZEND_UNSET_VAR_SPEC_CV_HANDLER。在此函数中不管是ZEND_QUICK_SET类型的操作,还是常规的unset操作,都会对HashTable(EG(active_symbol_table)或target_symbol_table)和数组(EX(CVs)和ex->CVs)执行清除操作。

胖子的乱看乱想笔记三

1、凡事预则立,不预则废。 - 《礼记.中庸》

2、无论干什么,都要有一种归属感,甚至使命感,才能全情投入。

3、决策者的七个根性: 沉稳,细心,有胆识,积极,大度,诚信,有担当。﹣ ≪ 赢在决策≫

4、这个世界没有不能用的人,只有用错地方的人。 ﹣ ≪ 赢在决策≫

5、第一,思考你的战略,第二,计划你的工作,第三,教育好你的员工 ﹣ ≪经理人五项修炼≫

6、 危机 = 危险 + 机遇

7、为解决容量问题,需要为应用程序决定一种架构。通常要特别注意进程、网络边界和IO。-≪持续交付≫

8、第一次就把事情做好。﹣余世维

9、之前做了什么?做得怎样?有什么经验和教训?现在正在做什么?做了这些有什么用?以后准备做什么?

10、最理想的任务完成时间:昨天。- ≪做事做到位≫

11、 上善若水。水善利万物而不争 - 《老子》 不争即争

12、一个人的能力分为必备能力、储备能力、进阶能力。≪中层危机≫

13、爱你身边的人,他们最重要 - 于威

14、男人一定要像个爷们,这个世界需要你们的肩膀 - 于威

15、正直,勇敢,坚韧,善良,乐观,大气,有了这些,就有了一切。- 于威

16、四行说:你自己得行,得有人说你行,说你行的人得行,你身子骨得行 ﹣≪悟道≫

17、态度比能力重要

18、怨人不如自怨,求诸人不如求之己。 — 《文子·上德》

19、不要让别人等你。

20、 奇技淫巧可以用,但不能什么地方都用

21、思路决定出路,态度决定高度

22、最基本的东西往往是最重要的

23、想得开、拿得起、放得下

24、我们,记得说我们,谢谢,记得说谢谢!