2009年05月10日

转载:HTTP协议的基础知识


1. 什么是HTTP协议

我们知道HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它是一种分布式,合作式,多媒体住处系统服务,面向应用层的协议(同时它也是基于网络层tcp协议的)。

2.HTTP协议是怎么工作的

当我们想浏览一个网站的时候,如www.dianyuan.com。建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URI)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。然后电源网(www.dianyuan.com)服务器接到请求后,给予相应的响应信息其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。最后 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。这就是完整的HTTP协议的工作过程。

3.HTTP协议的基础。

浏览器和web服务器之间通过http在internet上进行数据的发送和接收,这些数据也被称为http消息(message)。http消息可以是客户端到服务器的请求消息,也可以是服务器到客户端

消息(message)的一般格式:

Message = start-line (Request-line | status-line)

*message-header

CRLF

[message-body]

我们先看请求信息内容

(1). 请求内容的组成:

Message=Request-line

*message-header

CRLF

[message-body]

(2)请求行的结构(Request-line):
Reqest-Method Request-URI HTTP-Version CRLF

*Request-Method: 请求方法:POST,GET,PUT,DELETE(注意要大写)

*HTTP-Version: http协议的版本(1.0/1.1)

*注:CRLF为回车换行;

(3)例子:

Message = POST ./li.php HTTP/1.0\nUser_Agent: XML-RPC Client\nHost: www.dianyua.com\nContent-Type:image/png\nContent-Length: 8\n\n[message-body];

*注:[message-body]自己定义:如username=yaoming&pwd=123

我们再看响应消息内容

(1)响应内容:message=status-line

* message-header

[message-body]

(2)状态行:status-line的结构:

HTTP-Version status-code Reason-Phrase

CRLF

*注:状态码:status-code:

状态码表示响应类型
1×× 保留
2×× 表示请求成功地接收
3×× 为完成请求客户需进一步细化请求
4×× 客户错误
5×× 服务器错误

*注:404—没有找到

*注:401—未授权

*注:403—-禁用

我们再来看看HTTP消息报头内容

1.Message-header分为普通报头(general-header ),请求报头( Request-header ) , 实体报头(entity-header)

2.报头的格式:名字+“:”+空格+值

(1)普通报头:gengerl-header

<1>Cache-Control

Cache-Contrlol 常用头域被用于指定指令,此指令必须被在请求/响应链上的所有缓存机制遵守。注意HTTP/1.0缓存并不能实现Cache-Control,而是只实现Pragma:no-cache..请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、 proxy-revalidate、max-age。

<2>Date

Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

<3> Pragma

Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。

(2)请求信息报头(Request-header)

<1>Host

Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

<2>Referer

Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可 用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。

<3>Accept

Accept请求头域被用于指定服务器返回客房端可接受的响应媒体类型。如:image/png,text/html等;

<4>Accept-Charset

此头域可以用来指出请求客房端能接受什么样的字符集响应。如: utf8,iso-8859-5;

<5>Accept-Language,Authorization,From,Host,If-Modified-Since,User-Agent等等

(3)响应报头(Response-head);

<1>Expires

它给出了在何日何时之后响应即被视为陈旧的。一个陈旧的缓存项不能被缓存返回级客房端。它的日期格式是绝对日期。由HTTP-date定义的。它必须是RFC1123的格式。例如:Thu,01 Dec 1994 16:00:00 GMT

<2>Content-Encoding

它是对媒体类型的修饰。其值表明对实体以何种方式的内容编码。

<3>Content-Language

它描述了实体面向用户的语言。

<4>Content-Type

指明发给接收者的实体的媒体类型。Content-Type: text/html;charset=ISO-8859-4

当然这里面还有很多关于报头的命令,这里不一一列举。

4.最后我们来看看php与HTTP的结合

Php内建的函数和全局变量都可以获取对HTTP请求中传递的任何消息的内容

(1).getallHeaders() =>返回的是一个数组

(2) 超全局变量$_SERVER, HTTP_HOST,HTTP_PORT,HTTP_ACCEPT,REQUEST_METHOD

Php与响应

Php中使用header()将HTTP响应状态行和报头发送到浏览器

header ( string string [, bool replace [, int http_response_code]] )

(1).返回状态行:

header(“HTTP/1.0 404 NOT FONUD”);

(2).返回响应报头

Header(“WWW-Authenticte:BASIC”);

(3).重定向,设置内容和类型

(4)php禁止客房端缓存:

[php]<?php
header(“Expries: Thu,01 Jun 1970 00:00:00 GMT”);</br>
header(“Last-Modify:”.gmdate(“D,d M Y H:i:s”.”GMT”)); header(“Cache-control: no-store, no-cache,must-revalidate”);
header(“Cache-control: post-check,pre-check=0”,false);header(“prama:no-cache”);
?>[/php]

<5>php模拟HTTP请求:

<?php

$host=”localhost”;

$port=80;

$request=”username=yaoming&pwd=123″;

$fp = fsockopen($host, $port);

$query=”POST/zxu.phpHTTP/1.0\r\nUser_Agent:Client\r\nHost:”.$host.”\r\nAccept:*/*\r\nContent-Type:application/x-www-form-urlencoded;charset=UTF-8\r\nContent-Length:”.strlen($request).”\r\n\r\n”.$request.”\n”;

echo $query;

//把构造好的HTTP协议发送给服务器,失败返回false

if (!fputs($fp, $query, strlen($query)))

{

$errstr = “Write error”;

return false;

}

//获取从服务器端返回的所有信息,包括HTTP头和XML信息

$contents = “”;

while (!feof($fp))

{

$contents .= fgets($fp);

}

//关闭连接资源后返回获取的内容

fclose($fp);

echo $contents;

?>

2009年05月7日

Query Construction 查询构造


Term Query (单词查询)

[php]word1[/php]

Multi-Term Query (多词查询)

[php]+word1 author:word2 -word3[/php]

Boolean Query (布尔查询)

[php]+(word1 word2 word3) author:(word4 word5) -word6[/php]

Wildcard Query (通配符查询)

[php]field1:test*[/php]

Fuzzy Query (模糊查询)

[php]field1:test~[/php]

Phrase Query (语句查询)

Range Query (随机查询)

[php]mod_date:[20020101 TO 20030101] title:{Aida To Carmen}[/php]

2009年02月21日

yui 3.0.0pr2 base css


此framework在我看来如同对于其他3个css的轻量级渲染,也是yui css比较精华所在,全篇使用em作为单位.
[css]/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:

http://developer.yahoo.net/yui/license.txt

version: 3.0.0pr2
*/

/* base.css, part of YUI’s CSS Foundation */
h1 {
/*18px via YUI Fonts CSS foundation*/
/*在13px的基础1em之上增大到18px,增律为138.5%*/
font-size:138.5%;
}
h2 {
/*16px via YUI Fonts CSS foundation*/
/*在13px的基础1em之上增大到16px,增律为123.1%*/
font-size:123.1%;
}
h3 {
/*14px via YUI Fonts CSS foundation*/
/*在13px的基础1em之上增大到14px,增律为108%*/
font-size:108%;
}
h1,h2,h3 {
/* top &amp; bottom margin based on font size */
/* 上下留一个字的外补丁 */
margin:1em 0;
}
h1,h2,h3,h4,h5,h6,strong {
/*bringing boldness back to headers and the strong element*/
/*把重点标签表示的明显一些*/
font-weight:bold;
}
abbr,acronym {
/*indicating to users that more info is available */
/*指明有效信息 */
border-bottom:1px dotted #000;
cursor:help;
}
em {
/*bringing italics back to the em element*/
/*给em斜体*/
font-style:italic;
}
blockquote,ul,ol,dl {
/*giving blockquotes and lists room to breath*/
/*给块和列表呼吸的空间*/
margin:1em;
}
ol,ul,dl {
/*bringing lists on to the page with breathing room */
/*使列表有更加通畅的空间,我认为主要是来纠正bug和留出列表符号位置. */
margin-left:2em;
}
ol li {
/*giving OL’s LIs generated numbers*/
/*给数字符号*/
list-style: decimal outside;
}
ul li {
/*giving UL’s LIs generated disc markers*/
/*给圆点*/
list-style: disc outside;
}
dl dd {
/*giving UL’s LIs generated numbers*/
/*英文注释可能有问题,主要为了使dd与dt错后一个字符.*/
margin-left:1em;
}
th,td {
/*borders and padding to make the table readable*/
/*增加表格的可识别性*/
border:1px solid #000;
padding:.5em;
}
th {
/*distinguishing table headers from data cells*/
/*强调表头*/
font-weight:bold;
text-align:center;
}
caption {
/*coordinated margin to match cell’s padding*/
/*留出表的空间*/
margin-bottom:.5em;
/*centered so it doesn’t blend in to other content*/
/*居中为了与其他内容区分*/
text-align:center;
}
p,fieldset,table,pre {
/*so things don’t run into each other*/
/*为了不适彼此融合*/
margin-bottom:1em;
}
/* setting a consistent width, 160px;
control of type=file still not possible */
/* 统一宽度为160px,但保留文件域默认,其中使用了css2的选择符,仍然使用的相对宽度,做了ie5的纠正 */
input[type=text],input[type=password],textarea{width:12.25em;*width:11.9em;}[/css]

2009年02月21日

YUI 3.0.0pr2 fonts css


如果想使用其他字号,只需要设定%就可以.但是13px对于中文来说是不可行的,所以想要使用须按照他的模式或继承重新处理.那么同样也增加了contextual版本
[css]/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:

http://developer.yahoo.net/yui/license.txt

version: 3.0.0pr2
*/
/**
* Percents could work for IE, but for backCompat purposes, we are using keywords.
* x-small is for IE6/7 quirks mode.
* 这里我也并没有明白真正意图,从注释分析到为了ie做了处理但考虑兼容使用了关键词并没有使用数值.
* 分析代码:使用了缩略写法,但是不知道这么处理是否继承问题,因为ie6有这个bug.字体大小依然用了13px但是没有用1em不知何故(难道small等于1em?那么其他浏览器则会自动处理放大和缩小处理),行高用了比例,换算回来是16px,依次使用4种字体供选择.
*/
body {
font:13px/1.231 arial, helvetica, clean, sans-serif;
*font-size:small;
*font:x-small;
}
/**
* Nudge down to get to 13px equivalent for these form elements
* 3.0.0pr2 新增内容 微调使之与13px相等
*/
select,
input,
button,
textarea {
font:99% arial,helvetica,clean,sans-serif;
}

table {
font-size:inherit;
font:100%;
}
/**
* Bump up IE to get to 13px equivalent
* 提升ie到13px,使用了ie hacker.
*/
pre, code, kbd, samp, tt {
font-family:monospace;
*font-size:108%;
line-height:100%;
}[/css]

2009年02月21日

YUI 3.0.0pr2 reset css


yui3 reset ccs相对于2.5.1并没有什么改动只是增加了几个todo.比较有趣的是增加了context模式,所谓context模式就是可以与其他css framework或已经自定义的css下使用,工作原理也非常简单,只是在所有css定义前面加了.yui-cssreset 的命名空间,那么针对此处理我的建议是自己在基于css framework下写的css要处理好命名空间和尽量少继承其他css定义,这样可以保证耦合度非常低而且高内聚,使之不论替换任何css framework的情况和放到不同页面中的widget都能正常.

[css]/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:

http://developer.yahoo.net/yui/license.txt

version: 3.0.0pr2
*/
/*为背景定义了颜色*/
html {
color:#000;
background:#FFF;
}
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td {
margin:0;
padding:0;
}
/*合并边线,边线空间至零.*/
table {
border-collapse:collapse;
border-spacing:0;
}
/*清除边线*/
fieldset, img {
border:0;
}
address, caption, cite, code, dfn, em, strong, th, var {
font-style:normal;
font-weight:normal;
}
li {
list-style:none;
}
caption, th {
text-align:left;
}
h1, h2, h3, h4, h5, h6 {
font-size:100%;
font-weight:normal;
}
/*添加空字符清除融合*/
q:before, q:after {
content:”;
}
abbr, acronym {
border:0;
font-variant:normal;
}
/* to preserve line-height and selector appearance */
sup {
vertical-align:text-top;
}
sub {
vertical-align:text-bottom;
}
input, textarea, select {
font-family:inherit;
font-size:inherit;
font-weight:inherit;
}
/*to enable resizing for IE*/
/*在ie下重定义*/
input, textarea, select {
*font-size:100%;
}
/*because legend doesn’t inherit in IE */
/*IE下legend不继承 */
legend {
color:#000;
}[/css]

2009年01月18日

CSS Sprites–深入探讨http协议


这是既前年的一篇日志的更新,在这一年我对http协议有了更进一步的认识,其中非常得益于去年国内sns api的大热,我制作了校内的app我的豆瓣整合了两个sns,从中学习了大量的oauth和rest等知识.更得益于最近手头的两本书.它们是

这两本书实质与http协议并没有关系,但是都和http紧密关联,有趣的是一本偏于后端技术,一本纯前端,说明http协议的知识对于大部分从事web开发的人来说都有很大的意义.最后我要感谢天津观光2路汽车,是你每天带着我让我有时间拜读这两本书.下面我要借与两本书参合我的认识做一个http协议的综述.

简单的http,复杂的web

客户端请求 服务器端响应
GET /hello.txt Hello , World!

简单的http0.9就是这个样子了,但我们从中看到了可循址性和无状态性.

GET /index.php HTTP/1.1
Host : www.myued.com
User-Agent: Mozilla/5.0 (x11; U;)……
Accept : text/xml,application/xml,application/xhtml+xml,text/html;q=0.9…
Accept-Language: us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Keep-Alive:300
Connection:keep-alive

 

因为客户端(主要指浏览器)请求资源的时候,对于同一个域只能同时请求两个资源(这个东西是人为规定的,一开始我还以为规定在服务器端,所以产生很多疑问,毕竟http是无面向连接,后来才知道是规定在客户端的),而每一个http请求平均往返延迟0.2秒,如果网站装载20项,造成2潜伏期第二单,不论他们是样式表,图象或文字。 (平均宽带连接与浏览器能够下载两个组件的时候)。
因为浏览器花费大约80 %的时间获取外部元件,例如脚本,样式表和图像。所以减少http请求具有最大影响提高网站的性能。此外,它是最容易的方法,使绩效改进。

css sprites 允许你创建一个包含所有的网页画面的图片,即只有一个单一的图片和只有单一服务器请求,所得图片与原图片大小差不多,因为空是被压缩的。在该文件中,你将放置所有的独立图片 ,而且你的界面要有足够的分离空间,他们不能运行超过对方。然后设定背景位置(使用负值提高背景)和包含足够的空间,只出现在背景元素。

就是说把一个网页的所有图片放到一个图片里,然后调动不同的位置显示,好处就是减少服务器进程,因为按照yahoo的高性能网站规则中说服务器进程比起带宽更重要。

2008年07月19日

校内网应用开发php会话问题


什么是session?

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 – 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

好的,我们知道了session_id是客户端和服务器端共识的标识符了,常规我们可以利用cookie保存这个标识,但是对于校内网的所有请求由校内服务器统一发出http请求,那么原始的办法肯定会行不通的.这样我们需要找到特异而且共识的标志,我们可以在校内服务器发出的post中找到若干个这样的标识,但是xn_sig_session_key是一个现成的混合好的参数集合用它再合适不过了,但是不知出于那个特殊的符号违反了session_id的命名规则,只要再做一个md5()就可以解决了.

session_id(md5 ( $_POST ['xn_sig_session_key'] )); session_start();

2008年07月2日

工作总结


时间荏苒,转眼间我来到天津中医药大学第二附属医院工作已经有一年的时间了。

一年前,我怀揣着对于网络工作的热爱和激情来到这里,结识了新的工作伙伴,认识了新的领导,从事了我喜爱的工作,在这短短一年的时间里,主任和同事们都给予了我很大的帮助和关怀,使我能很快适应这里的新环境,在工作、学习、思想等各个方面都有了很大的提高,现总结如下:

一、严于律已,自觉加强党性锻炼,党性修养和政治思想觉悟进一步提高。在单位里我顺利的成为了正式的中国共产党党员。一年来,我没有放弃对于马克思主义、毛泽东思想、邓小平理论以及三个代表重要思想的学习,还在网络、电视、报纸上学习了有关江泽民文选的重要内容。党的十六届六中全会召开时,我也特别的关注,对于党中央做出的每一个指示都认真的去体会,在平时的工作和生活重我始终坚持运用马克思列宁主义的立场、观点和方法论,运用辩证唯物主义与历史唯物主义去分析和观察事物,明辨是非,坚持真理,坚持正确的世界观、人生观、价值观,用正确的世界观、人生观、价值观指导自己的学习、工作和生活实践,在思想上积极构筑抵御资产阶级民主和自由化、拜金主义、自由主义等一切腐朽思想侵蚀的坚固防线。热爱祖国,热爱中国共产党,热爱社会主义,拥护中国共产党的领导,拥护改革开放,坚信社会主义最终必然战胜资本主义,对社会主义充满必胜的信心。认真贯彻执行党的路线、方针、政策,为加快社会主义建设事业认真做好本职工作。工作积极主动,勤奋努力,不畏艰难,尽职尽责,在平凡的工作岗位上作出力所能及的贡献。

强化理论和业务学习,不断提高自身综合素质。我走出学校,接触了一份新的工作,虽然我一直对于电脑络有着极其浓厚的兴趣,但毕竟我不是计算机专业的科班出身,要干好这份工作就必须努力学习,不断丰富自己的业务知识,计算机行业是个飞速发展的行业,计算机技术更是发展的日新月异,因此,不断加强理论学习,拓展知识领域,进行知识更新,也是形势所迫。为了掌握计算机更前沿的技术,充实自己的理论知识,在这一年的时间里,我阅读了大量的关于计算机及网络工程的书籍,并通过了网络管理员的资格认证考试。来到了一个新的工作环境,对这里的一切都不是很熟习,孔子曰:三人行必有我师,每一个在这里的前辈都是我的老师,为了能很快适应这里的新环境,能够更快胜任自己的工作,我每天都在不断向身边的同事学习和请教。信息中心的工作覆盖面很广,除了要求有过硬的计算机知识外,还需要对医院的业务流程有详细得了解,还需要能够很好的与医护人员进行沟通。虽然我是中医专业得学生,但是当面对这么复杂得工作流程时,感觉自己还是所学的知识太少了,今后我要更加努力的去熟悉流程,向主任和同事请教。

努力工作,按时完成工作任务。在这一年的时间里,我时刻紧记自己是一个新人,刚刚参加工作,对于自己的要求是丝毫不能放松,努力完成领导交给的工作任务,认真检查医院里的每一台电脑,无论白班还是夜班,我都时刻严阵以待,无论哪个科室的电脑出现故障,我都能即使赶到,以最快的速度解决问题,对于大家提出的问题都能认真思考病做出解答,遇到技术难题,无论是请教上层领导,还是自己阅读书籍或上网查找有关资料,我都要兴尽办法一一攻克。医院是一个救死扶伤的神圣地方,我深知医院网络工作的重要性,如果医院的网络系统出现问题,那医院就医工作将无法正常进行,耽误了患者的就医时间,就是对于患者健康的最大危害,甚至会以患者的生命作为代价。我虽然不是一名医生,但我是医院工作不可缺少的一份子,我的工作是让医院的网络系统正常运行,让在一线工作的医生们能够顺利的进行工作,这样就是节省了患者的就医时间,让患者在最短的时间了看上病,吃上药,让他们早日康复。我是天津中医药大学的本科毕业生,在天津中医药大学学习和生活了五年,对于我们的学校有着深厚的感情。毕业后,我有幸能够进入二附院这个大集体,从事我喜爱的职业,我感到万分的喜悦,虽然我只在这里工作了短短的一年时间,但我已经对咱们的医院充满了深厚的感情,我已经把自己当成了这里的一份子,我愿意并渴望继续在这里奉献我的青春与热情,奉献我的一生。

总结人:王承石2007-7-16

2008年06月30日

zend framework in web services


2008年06月27日

Web services


  1. 我们对网络提供的服务有了什么样的需求变化?

    回到几年前,我们上网最不喜欢的就是让别人知道自己的存在,总是想尽各种办法来隐藏自己的身份.那么今天,我们则更喜欢秀出自己真实的色彩,把自己的日记发布出来,发布自己的照片和视频,最近社区也逐渐走入实名化.那么为什么发生了这种变化呢,我想应该是人们的show本性和对于互联网的可靠和信任提升.

  2. 对于网站架构发生了怎样的改变?

    我听说在互联网刚刚开始的时候发送邮件是收费的,yahoo第一个开始支持免费邮箱直到今天连邮箱的空间都无限了,但是它提供的服务都是基于yahoo自身,后来有了google,它告诉我们他来帮我们找到资源,今天facebook又告诉我们,你们可以来到我这里提供服务.从中我们看到,互联网也在走向更加的开放更加的"廉价".

    那么,基于原来的形式,客户端发出指令,服务层把指令翻译成资源的操作再返回客户端.这个资源往往是数据库.今天,我们进入一个mashup时代,我们往往需要同时请求不同来源的资源.那么肯定的是这些服务的提供者不会直接让我们来操作他们的数据库,这时就需要一组api来映射资源操作.

  3. SOAP or REST?

    首先不管SOAP还是REST,他们只是规范,对于选择并没有绝对的道理.SOAP是一种面向服务的规范,他并不强调我们对于什么资源,只是强调事情的结果.而REST是一种面向资源的规范,与SOAP相反.那么REST为什么相对来说比较吃香呢?上一话题我已经谈到,这些api在后台对应了某一资源,而资源在后台往往对应的数据库.