HTTP 头部解释

1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type.

2. Accept-Charset:   浏览器申明自己接收的字符集
Accept-Encoding:  浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法  (gzip,deflate)
Accept-Language::浏览器申明自己接收的语言语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。

3. Accept-Ranges:WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes:表示接受,none:表示不接受。

4. Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。

5. Authorization:当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,该头部来回应自己的身份验证信息给WEB服务器。

6. Cache-Control:请求:no-cache(不要缓存的实体,要求现在从WEB服务器去取)
max-age:(只接受 Age 值小于 max-age 值,并且没有过期的对象)
max-stale:(可以接受过去的对象,但是过期时间必须小于max-stale 值)
min-fresh:(接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象)
响应:public(可以用 Cached 内容回应任何用户)
private(只能用缓存内容回应先前请求该内容的那个用户)
no-cache(可以缓存,但是只有在跟WEB服务器验证了其有效后,才能返回给客户端)
max-age:(本响应包含的对象的过期时间)
ALL:  no-store(不允许缓存)

7. Connection:请求:close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。
keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的 响应后,保持连接,等待本次连接的后续请求)。
响应:close(连接已经关闭)。
keepalive(连接保持着,在等待本次连接的后续请求)。
Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。例如:Keep-Alive:300

8. Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip
Content-Language:WEB 服务器告诉浏览器自己响应的对象的语言。
Content-Length:  WEB 服务器告诉浏览器自己响应的对象的长度。例如:Content-Length: 26012
Content-Range:   WEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。例如:Content-Range: bytes 21010-47021/47022
Content-Type:    WEB 服务器告诉浏览器自己响应的对象的类型。例如:Content-Type:application/xml

9. ETag:就是一个对象(比如URL)的标志值,就一个对象而言,比如一个 html 文件,如果被修改了,其 Etag 也会别修改, 所以,ETag 的作用跟 Last-Modified 的作用差不多,主要供 WEB 服务器 判断一个对象是否改变了。
比如前一次请求某个 html 文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得的 ETag 值发送给  WEB 服务器,然后 WEB 服务器会把这个 ETag 跟该文件的当前 ETag 进行对比,然后就知道这个文件有没有改变了。

10. Expired:WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。是 HTTP/1.0 的头部。
例如:Expires:Sat, 23 May 2009 10:02:12 GMT

11. Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。
例如:Host:rss.sina.com.cn

12. If-Match:如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。
If-None-Match:如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。

13. If-Modified-Since:如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT
If-Unmodified-Since:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。

14. If-Range:浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。 浏览器通过发送请求对象的ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。

15. Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT

16. Location:WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。
例如:Location:http://i0.sinaimg.cn/dy/deco/2008/0528/sinahome_0803_ws_005_text_0.gif

17. Pramga:主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。例如:Pragma:no-cache

18. Proxy-Authenticate: 代理服务器响应浏览器,要求其提供代理身份验证信息。
Proxy-Authorization:浏览器响应代理服务器的身份验证请求,提供自己的身份信息。

19. Range:浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546-

20. Referer:浏览器向 WEB 服务器表明自己是从哪个网页/URL 获得/点击 当前请求中的网址/URL。例如:Referer:http://www.sina.com/

21. Server: WEB 服务器表明自己是什么软件及版本等信息。例如:Server:Apache/2.0.61 (Unix)

22. User-Agent: 浏览器表明自己的身份(是哪种浏览器)。
例如:User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14

23. Transfer-Encoding: WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。例如:Transfer-Encoding: chunked

24. Vary: WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。假如源WEB服务器在接到第一个请求消息时,其响应消息的头部为:
Content-Encoding: gzip; Vary: Content-Encoding  那么 Cache 服务器会分析后续请求消息的头部,检查其 Accept-Encoding,是否跟先前响应的 Vary 头部值一致,即是否使用相同的内容编码方法,这样就可以防止 Cache 服务器用自己Cache 里面压缩后的实体响应给不具备解压能力的浏览器。
例如:Vary:Accept-Encoding

25. Via: 列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。
当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息,当下一个代理服务器 收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via头部,并把自己的相关信息加到后面, 以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部,就知道该请求所经过的路由。
例如:Via:1.0 236-81.D07071953.sina.com.cn:80 (squid/2.6.STABLE13)

============================================================================================================================
HTTP 请求消息头部实例:
Host:rss.sina.com.cn
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language:zh-cn,zh;q=0.5
Accept-Encoding:gzip,deflate
Accept-Charset:gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive:300
Connection:keep-alive
Cookie:userId=C5bYpXrimdmsiQmsBPnE1Vn8ZQmdWSm3WRlEB3vRwTnRtW   <– Cookie
If-Modified-Since:Sun, 01 Jun 2008 12:05:30 GMT
Cache-Control:max-age=0

HTTP 响应消息头部实例:
Status:OK – 200                                                <– 响应状态码,表示 web 服务器处理的结果。
Date:Sun, 01 Jun 2008 12:35:47 GMT
Server:Apache/2.0.61 (Unix)
Last-Modified:Sun, 01 Jun 2008 12:35:30 GMT
Accept-Ranges:bytes
Content-Length:18616
Cache-Control:max-age=120
Expires:Sun, 01 Jun 2008 12:37:47 GMT
Content-Type:application/xml
Age:2
X-Cache:HIT from 236-41.D07071951.sina.com.cn                  <– 反向代理服务器使用的 HTTP 头部
Via:1.0 236-41.D07071951.sina.com.cn:80 (squid/2.6.STABLE13)
Connection:close
========================================================================

Unix信号说明

Unix信号列表
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL

5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE

9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS

13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGUSR1

17) SIGUSR2 18) SIGCHLD 19) SIGPWR 20) SIGWINCH

21) SIGURG 22) SIGIO 23) SIGSTOP 24) SIGTSTP

25) SIGCONT 26) SIGTTIN 27) SIGTTOU 28) SIGVTALRM

29) SIGPROF 30) SIGXCPU 31) SIGXFSZ 32) SIGWAITING

33) SIGLWP 34) SIGFREEZE 35) SIGTHAW 36) SIGCANCEL

37) SIGLOST 39) SIGRTMIN 40) SIGRTMIN+1 41) SIGRTMIN+2

42) SIGRTMIN+3 43) SIGRTMAX-3 44) SIGRTMAX-2 45) SIGRTMAX-1

46) SIGRTMAX

下面是一些信号说明
1) SIGHUP

本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。

登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也 能继续下载。

此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

2) SIGINT

程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

3) SIGQUIT

和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。

4) SIGILL

执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。

5) SIGTRAP

由断点指令或其它trap指令产生. 由debugger使用。

6) SIGABRT

调用abort函数生成的信号。

7) SIGBUS

非法地址, 包括内存地址对齐(alignment)出错。比如访问一个四个字长的整数, 但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。

8) SIGFPE

在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。

9) SIGKILL

用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。

10) SIGUSR1

留给用户使用

11) SIGSEGV

试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.

12) SIGUSR2

留给用户使用

13) SIGPIPE

管道破裂。这个信号通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到SIGPIPE信号。此外用Socket通信的两个进程,写进程在写Socket的时候,读进程已经终止。

14) SIGALRM

时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.

15) SIGTERM

程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。

17) SIGCHLD

子进程结束时, 父进程会收到这个信号。

如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程 来接管)。

18) SIGCONT

让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符

19) SIGSTOP

停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

20) SIGTSTP

停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

21) SIGTTIN

当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.

22) SIGTTOU

类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.

23) SIGURG

有”紧急”数据或out-of-band数据到达socket时产生.

24) SIGXCPU

超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变。

25) SIGXFSZ

当进程企图扩大文件以至于超过文件大小资源限制。

26) SIGVTALRM

虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.

27) SIGPROF

类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.

28) SIGWINCH

窗口大小改变时发出.

29) SIGIO

文件描述符准备就绪, 可以开始进行输入/输出操作.

30) SIGPWR

Power failure

31) SIGSYS

非法的系统调用。

在以上列出的信号中,程序不可捕获、阻塞或忽略的信号有:SIGKILL,SIGSTOP

不能恢复至默认动作的信号有:SIGILL,SIGTRAP

默认会导致进程流产的信号:

SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ

默认会导致进程退出的信号:

SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM

默认会导致进程停止的信号:

SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU

默认进程忽略的信号:

SIGCHLD,SIGPWR,SIGURG,SIGWINCH

此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在进程挂起时是继续,否则是忽略,不能被阻塞。

初窥curl(上)

  1. function isRealUrl($url){  
  2.     $ch = curl_init();  
  3.     $options = array(  
  4.        CURLOPT_URL => $url,  
  5.        CURLOPT_HEADER => true,  
  6.        CURLOPT_RETURNTRANSFER => true,  
  7.        CURLOPT_NOBODY => true  
  8.        );  
  9.     curl_setopt_array($ch, $options);  
  10.     curl_exec($ch);  
  11.     if(!curl_errno($ch)){  
  12.         return 200==curl_getinfo($ch,CURLINFO_HTTP_CODE)? ’yes’:’no’;  
  13.     }else{  
  14.         return curl_error($ch);  
  15.     }  
  16.     curl_close($ch);  
  17. }  

function isRealUrl($url){ $ch = curl_init(); $options = array( CURLOPT_URL => $url, CURLOPT_HEADER => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_NOBODY => true ); curl_setopt_array($ch, $options); curl_exec($ch); if(!curl_errno($ch)){ return 200==curl_getinfo($ch,CURLINFO_HTTP_CODE)? ‘yes’:’no’; }else{ return curl_error($ch); } curl_close($ch); }

上面这个函数是用来判断所给的链接是不是可以访问!

网上看到的一些资料:
函数列表CURL库一共有17个函数:
curl_close:关闭CURL会话
curl_copy_handle:复制一个CURL会话句柄,同时3复制其所有参数
curl_errno:返回最后一个错误码
curl_error:返回一个字符串,用以描述当前会话的最后一个错误
curl_exec:执行当前会话
curl_getinfo:获取特定信息
curl_init:初始化CURL会话
curl_multi_add_handle:在一个多连接会话中添加一个句柄
curl_multi_close:关闭一个多句柄CRUL会话
curl_multi_exec:执行一个多句柄CURL会话
curl_multi_getcontent:返回一个句柄执行后的内容,如果设置了CURLOPT_RETURNTRANSFER
curl_multi_info_read:获取当前所有连接的信息
curl_multi_init:初始化一个多句柄会话
curl_multi_remove_handle:从一个多句柄会话中删除一个句柄
curl_multi_select:获取所有绑定的套接字
curl_setopt:设置CURL传输选项
curl_version:获取CURL版本

常用设置选项布尔值选项:
CURLOPT_AUTOREFERER:当返回的信息头含有转向信息时,自动设置前向连接
CURLOPT_BINARYTRANSFER:TRUEtoreturntherawoutputwhenCURLOPT_RETURNTRANSFERisused.
CURLOPT_COOKIESESSION:标志为新的cookie会话,忽略之前设置的cookie会话
CURLOPT_CRLF:将Unix系统的换行符转换为Dos换行符
CURLOPT_DNS_USE_GLOBAL_CACHE:使用全局的DNS缓存
CURLOPT_FAILONERROR:忽略返回错误
CURLOPT_FILETIME:获取请求文档的修改日期,该日期可以用curl_getinfo()获取。
CURLOPT_FOLLOWLOCATION:紧随服务器返回的所有重定向信息
CURLOPT_FORBID_REUSE:当进程处理完毕后强制关闭会话,不再缓存供重用
CURLOPT_FRESH_CONNECT:强制建立一个新的会话,而不是重用缓存的会话
CURLOPT_HEADER:在返回的输出中包含响应头信息
CURLOPT_HTTPGET:设置HTTP请求方式为GET
CURLOPT_HTTPPROXYTUNNEL:经由一个HTTP代理建立连接
CURLOPT_NOBODY:返回的输出中不包含文档信息.
CURLOPT_NOPROGRESS:如果你不会PHP为CURL传输显示一个进程条,设置这个选项为一个非零值。注意:PHP自动设置这个选项为非零值,你应该仅仅为了调试的目的来改变这个选项。
CURLOPT_NOSIGNAL:忽略所有发往PHP的信息
CURLOPT_POST:设置POST方式提交数据,POST格式为application/x-www-form-urlencoded
CURLOPT_PUTTRUE:设置PUT方式上传文件,同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE
CURLOPT_RETURNTRANSFER:返回字符串,而不是调用curl_exec()后直接输出
CURLOPT_SSL_VERIFYPEER:SSL验证开启
CURLOPT_UNRESTRICTED_AUTH:一直链接后面附加用户名和密码,同时设置CURLOPT_FOLLOWLOCATION
CURLOPT_UPLOAD:准备上传

整数值选项:
CURLOPT_BUFFERSIZE:缓存大小
CURLOPT_CONNECTTIMEOUT:连接时间设置,默认0为无限制
CURLOPT_DNS_CACHE_TIMEOUT:内存中保存DNS信息的时间,默认2分钟
CURLOPT_INFILESIZE:上传至远程站点的文件尺寸
CURLOPT_LOW_SPEED_LIMIT:传输最低速度限制andabort.
CURLOPT_LOW_SPEED_TIME:传输时间限制
CURLOPT_MAXCONNECTS:最大持久连接数
CURLOPT_MAXREDIRS:最大转向数
CURLOPT_PORT:连接端口
CURLOPT_PROXYAUTH:代理服务器验证方式
CURLOPT_PROXYPORT:代理服务器端口
CURLOPT_PROXYTYPE:代理服务器类型
CURLOPT_TIMEOUT:CURL函数的最大执行时间
CURLOPT_VERBOSE:如果你想CURL报告每一件意外的事情,设置这个选项为一个非零值

字符串选项:
CURLOPT_COOKIE:HTTP头中set-cookie中的cookie信息
CURLOPT_COOKIEFILE:包含cookie信息的文件,cookie文件的格式可以是Netscape格式,或者只是HTTP头的格式
CURLOPT_COOKIEJAR:连接结束后保存cookie信息的文件
CURLOPT_CUSTOMREQUEST:自定义请求头,使用相对地址
CURLOPT_ENCODING:HTTP请求头中Accept-Encoding的值
CURLOPT_POSTFIELDS:POST格式提交的数据内容
CURLOPT_PROXY:代理通道
CURLOPT_PROXYUSERPWD:代理认证用户名和密码
CURLOPT_RANGE:返回数据的范围,以字节记
CURLOPT_REFERER:前向链接
CURLOPT_URL:要连接的URL地址,可以在curl_init()中设置
CURLOPT_USERAGENT:HTTP头中User-Agent的值
CURLOPT_USERPWD:连接种使用的验证信息

数组选项:
CURLOPT_HTTP200ALIASES:200响应码数组,数组中的响应吗被认为是正确的响应
CURLOPT_HTTPHEADER:自定义请求头信息

只能是流句柄的选项:
CURLOPT_FILE:传输要写入的晚间句柄,默认是标准输出
CURLOPT_INFILE:传输要读取的文件句柄
CURLOPT_STDERR:作为标准错误输出的一个替换选项
CURLOPT_WRITEHEADER:传输头信息要写入的文件

回调函数选项:
CURLOPT_HEADERFUNCTION:拥有两个参数的回调函数,第一个是参数是会话句柄,第二是HTTP响应头信息的字符串。使用此回调函数,将自行处理响应头信息。响应头信息按行返回。设置返回值为字符串长度。
CURLOPT_READFUNCTION:拥有两个参数的回调函数,第一个是参数是会话句柄,第二是HTTP响应头信息的字符串。使用此函数,将自行处理返回的数据。返回值为数据尺寸。
CURLOPT_WRITEFUNCTION:拥有两个参数的回调函数,第一个是参数是会话句柄,第二是HTTP响应头信息的字符串。使用此回调函数,将自行处理响应头信息。响应头信息是整个字符串。设置返回值为字符串长度。

上面稀里哗啦这么多东西,头晕吧??一开始接触这个,也感觉很混乱~而且手边也没有书籍教程专门来讲这个~GG了一番,筛选了几篇不错的资料整理一下~上面提到的就是curl比较常用的参数~
咱们继续看一些例子:

view plaincopy to clipboardprint?

  1. $ch = curl_init("http://www.bringsir.com/");  
  2. curl_exec($ch);  
  3. curl_close($ch);  
  4. //上面这个例子就不讲了吧?~  
  5.   
  6. $ch = curl_init("http://www.bringsir.com/");  
  7. print_r(curl_getinfo($ch));  
  8. //curl_getinfo()函数获取一个curl廉洁资源句柄的信息,它有两个参数:第一个参数是curl的资源句柄,第二个参数是下面一些常量:  

$ch = curl_init("http://www.bringsir.com/"); curl_exec($ch); curl_close($ch); //上面这个例子就不讲了吧?~ $ch = curl_init("http://www.bringsir.com/"); print_r(curl_getinfo($ch)); //curl_getinfo()函数获取一个curl廉洁资源句柄的信息,它有两个参数:第一个参数是curl的资源句柄,第二个参数是下面一些常量:

可选的常量包括:

CURLINFO_EFFECTIVE_URL
最后一个有效的url地址

CURLINFO_HTTP_CODE
最后一个收到的HTTP代码

CURLINFO_FILETIME
远程获取文档的时间,如果无法获取,则返回值为“-1”

CURLINFO_TOTAL_TIME
最后一次传输所消耗的时间

CURLINFO_NAMELOOKUP_TIME
名称解析所消耗的时间

CURLINFO_CONNECT_TIME
建立连接所消耗的时间

CURLINFO_PRETRANSFER_TIME
从建立连接到准备传输所使用的时间

CURLINFO_STARTTRANSFER_TIME
从建立连接到传输开始所使用的时间

CURLINFO_REDIRECT_TIME
在事务传输开始前重定向所使用的时间

CURLINFO_SIZE_UPLOAD
上传数据量的总值

CURLINFO_SIZE_DOWNLOAD
下载数据量的总值

CURLINFO_SPEED_DOWNLOAD
平均下载速度

CURLINFO_SPEED_UPLOAD
平均上传速度

CURLINFO_HEADER_SIZE
header部分的大小

CURLINFO_HEADER_OUT
发送请求的字符串

CURLINFO_REQUEST_SIZE
在HTTP请求中有问题的请求的大小

CURLINFO_SSL_VERIFYRESULT
Result of SSL certification verification requested by setting CURLOPT_SSL_VERIFYPEER

CURLINFO_CONTENT_LENGTH_DOWNLOAD
从Content-Length: field中读取的下载内容长度

CURLINFO_CONTENT_LENGTH_UPLOAD
上传内容大小的说明

CURLINFO_CONTENT_TYPE
下载内容的“Content-type”值,NULL表示服务器没有发送有效的“Content-Type: header”

curl_setopt()函数的作用是为一个curl设置会话参数。curl_setopt_array()函数的作用是以数组的形式为一个curl设置会话参数:

view plaincopy to clipboardprint?

  1. ch = curl_init();  
  2. $fp = fopen("example_homepage.txt", "w");  
  3. curl_setopt($ch, CURLOPT_FILE, $fp);  
  4. $options = array(  
  5.  CURLOPT_URL => ’http://www.bringsir.com/’,  
  6.  CURLOPT_HEADER => false  
  7.  );  
  8. curl_setopt_array($ch, $options);  
  9. curl_exec($ch);  
  10. curl_close($ch);  
  11. fclose($fp);  

ch = curl_init(); $fp = fopen("example_homepage.txt", "w"); curl_setopt($ch, CURLOPT_FILE, $fp); $options = array( CURLOPT_URL => ‘http://www.bringsir.com/’, CURLOPT_HEADER => false ); curl_setopt_array($ch, $options); curl_exec($ch); curl_close($ch); fclose($fp);

可设置的参数有:

CURLOPT_AUTOREFERER
自动设置header中的referer信息

CURLOPT_BINARYTRANSFER
在启用CURLOPT_RETURNTRANSFER时候将获取数据返回

CURLOPT_COOKIESESSION
启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下curl会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。

CURLOPT_CRLF
启用时将Unix的换行符转换成回车换行符。

CURLOPT_DNS_USE_GLOBAL_CACHE
启用时会启用一个全局的DNS缓存,此项为线程安全的,并且默认为true。

CURLOPT_FAILONERROR
显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息

CURLOPT_FILETIME
启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返回。

CURLOPT_FOLLOWLOCATION
启用时会将服务器服务器返回的“Location:”放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。

CURLOPT_FORBID_REUSE
在完成交互以后强迫断开连接,不能重用。

CURLOPT_FRESH_CONNECT
强制获取一个新的连接,替代缓存中的连接。

CURLOPT_FTP_USE_EPRT
TRUE to use EPRT (and LPRT) when doing active FTP downloads. Use FALSE to disable EPRT and LPRT and use PORT only.
Added in PHP 5.0.0.

CURLOPT_FTP_USE_EPSV
TRUE to first try an EPSV command for FTP transfers before reverting back to PASV. Set to FALSE to disable EPSV.

CURLOPT_FTPAPPEND
TRUE to append to the remote file instead of overwriting it.

CURLOPT_FTPASCII
An alias of CURLOPT_TRANSFERTEXT. Use that instead.

CURLOPT_FTPLISTONLY
TRUE to only list the names of an FTP directory.

CURLOPT_HEADER
启用时会将头文件的信息作为数据流输出。

CURLOPT_HTTPGET
启用时会设置HTTP的method为GET,因为GET是默认是,所以只在被修改的情况下使用。

CURLOPT_HTTPPROXYTUNNEL
启用时会通过HTTP代理来传输。

CURLOPT_MUTE
讲curl函数中所有修改过的参数恢复默认值。

CURLOPT_NETRC
在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。

CURLOPT_NOBODY
启用时将不对HTML中的body部分进行输出。

CURLOPT_NOPROGRESS
启用时关闭curl传输的进度条,此项的默认设置为true

CURLOPT_NOSIGNAL
启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认打开。

CURLOPT_POST
启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

CURLOPT_PUT
启用时允许HTTP发送文件,必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE

CURLOPT_RETURNTRANSFER
讲curl_exec()获取的信息以文件流的形式返回,而不是直接输出。

CURLOPT_SSL_VERIFYPEER
FALSE to stop cURL from verifying the peer’s certificate. Alternate certificates to verify against can be specified with the CURLOPT_CAINFO option or a certificate directory can be specified with the CURLOPT_CAPATH option. CURLOPT_SSL_VERIFYHOST may also need to be TRUE or FALSE if CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2). TRUE by default as of cURL 7.10. Default bundle installed as of cURL 7.10.

CURLOPT_TRANSFERTEXT
TRUE to use ASCII mode for FTP transfers. For LDAP, it retrieves data in plain text instead of HTML. On Windows systems, it will not set STDOUT to binary mode.

CURLOPT_UNRESTRICTED_AUTH
在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。

CURLOPT_UPLOAD
启用时允许文件传输

CURLOPT_VERBOSE
启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中

CURLOPT_BUFFERSIZE
每次获取的数据中读入缓存的大小,这个值每次都会被填满。

CURLOPT_CLOSEPOLICY
不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,还存在另外三个,但是curl暂时还不支持。.

CURLOPT_CONNECTTIMEOUT
在发起连接前等待的时间,如果设置为0,则不等待。

CURLOPT_DNS_CACHE_TIMEOUT
设置在内存中保存DNS信息的时间,默认为120秒。

初窥curl(下)

CURLOPT_FTPSSLAUTH
The FTP authentication method (when is activated): CURLFTPAUTH_SSL (try SSL first), CURLFTPAUTH_TLS (try TLS first), or CURLFTPAUTH_DEFAULT (let cURL decide).

CURLOPT_HTTP_VERSION
设置curl使用的HTTP协议,CURL_HTTP_VERSION_NONE(让curl自己判断),CURL_HTTP_VERSION_1_0(HTTP/1.0),CURL_HTTP_VERSION_1_1(HTTP/1.1)

CURLOPT_HTTPAUTH
使用的HTTP验证方法,可选的值 有:CURLAUTH_BASIC,CURLAUTH_DIGEST,CURLAUTH_GSSNEGOTIATE,CURLAUTH_NTLM,CURLAUTH_ANY,CURLAUTH_ANYSAFE, 可以使用“|”操作符分隔多个值,curl让服务器选择一个支持最好的值,CURLAUTH_ANY等价于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM,CURLAUTH_ANYSAFE等价于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM

CURLOPT_INFILESIZE
设定上传文件的大小

CURLOPT_LOW_SPEED_LIMIT
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时,PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

CURLOPT_LOW_SPEED_TIME
The number of seconds the transfer should be below CURLOPT_LOW_SPEED_LIMIT for PHP to consider the transfer too slow and abort.
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时,PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

CURLOPT_MAXCONNECTS
允许的最大连接数量,超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接

CURLOPT_MAXREDIRS
指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。

CURLOPT_PORT
一个可选的用来指定连接端口的量

CURLOPT_PROXYAUTH
The HTTP authentication method(s) to use for the proxy connection. Use the same bitmasks as described in CURLOPT_HTTPAUTH. For proxy authentication, only CURLAUTH_BASIC and CURLAUTH_NTLM are currently supported.

CURLOPT_PROXYPORT
The port number of the proxy to connect to. This port number can also be set in CURLOPT_PROXY.

CURLOPT_PROXYTYPE
Either CURLPROXY_HTTP (default) or CURLPROXY_SOCKS5.

CURLOPT_RESUME_FROM
在恢复传输时传递一个字节偏移量(用来断点续传)

CURLOPT_SSL_VERIFYHOST
1 to check the existence of a common name in the SSL peer certificate.
2 to check the existence of a common name and also verify that it matches the hostname provided.

CURLOPT_SSLVERSION
The SSL version (2 or 3) to use. By default PHP will try to determine this itself, although in some cases this must be set manually.

CURLOPT_TIMECONDITION
如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过,则使用CURL_TIMECOND_IFMODSINCE返回页面,如果没有被修 改过,并且CURLOPT_HEADER为true,则返回一个”304 Not Modified”的header,CURLOPT_HEADER为false,则使用CURL_TIMECOND_ISUNMODSINCE,默认值为 CURL_TIMECOND_IFMODSINCE

CURLOPT_TIMEOUT
设置curl允许执行的最长秒数

CURLOPT_TIMEVALUE
设置一个CURLOPT_TIMECONDITION使用的时间戳,在默认状态下使用的是CURL_TIMECOND_IFMODSINCE

CURLOPT_CAINFO
The name of a file holding one or more certificates to verify the peer with. This only makes sense when used in combination with CURLOPT_SSL_VERIFYPEER.

CURLOPT_CAPATH
A directory that holds multiple CA certificates. Use this option alongside CURLOPT_SSL_VERIFYPEER.

CURLOPT_COOKIE
设定HTTP请求中“Set-Cookie:”部分的内容。

CURLOPT_COOKIEFILE
包含cookie信息的文件名称,这个cookie文件可以是Netscape格式或者HTTP风格的header信息。

CURLOPT_COOKIEJAR
连接关闭以后,存放cookie信息的文件名称

CURLOPT_CUSTOMREQUEST
A custom request method to use instead of “GET” or “HEAD” when doing a HTTP request. This is useful for doing “DELETE” or other, more obscure HTTP requests. Valid values are things like “GET”, “POST”, “CONNECT” and so on; i.e. Do not enter a whole HTTP request line here. For instance, entering “GET /index.html HTTP/1.0rnrn” would be incorrect.
Note: Don’t do this without making sure the server supports the custom request method first.

CURLOPT_EGBSOCKET
Like CURLOPT_RANDOM_FILE, except a filename to an Entropy Gathering Daemon socket.

CURLOPT_ENCODING
header中“Accept-Encoding: ”部分的内容,支持的编码格式为:”identity”,”deflate”,”gzip”。如果设置为空字符串,则表示支持所有的编码格式

CURLOPT_FTPPORT
The value which will be used to get the IP address to use for the FTP “POST” instruction. The “POST” instruction tells the remote server to connect to our specified IP address. The string may be a plain IP address, a hostname, a network interface name (under Unix), or just a plain ‘-’ to use the systems default IP address.

CURLOPT_INTERFACE
在外部网络接口中使用的名称,可以是一个接口名,IP或者主机名。

CURLOPT_KRB4LEVEL
KRB4(Kerberos 4)安全级别的设置,可以是一下几个值之一:”clear”,”safe”,”confidential”,”private”。默认的值 为”private”,设置为null的时候表示禁用KRB4,现在KRB4安全仅能在FTP传输中使用。

CURLOPT_POSTFIELDS
在HTTP中的“POST”操作。如果要传送一个文件,需要一个@开头的文件名

CURLOPT_PROXY
设置通过的HTTP代理服务器

CURLOPT_PROXYUSERPWD
连接到代理服务器的,格式为“[username]:[password]”的用户名和密码。

CURLOPT_RANDOM_FILE
设定存放SSL用到的随机数种子的文件名称

CURLOPT_RANGE
设置HTTP传输范围,可以用“X-Y”的形式设置一个传输区间,如果有多个HTTP传输,则使用逗号分隔多个值,形如:”X-Y,N-M”。

CURLOPT_REFERER
设置header中”Referer: ” 部分的值。

CURLOPT_SSL_CIPHER_LIST
A list of ciphers to use for SSL. For example, RC4-SHA and TLSv1 are valid cipher lists.

CURLOPT_SSLCERT
传递一个包含PEM格式证书的字符串。

CURLOPT_SSLCERTPASSWD
传递一个包含使用CURLOPT_SSLCERT证书必需的密码。

CURLOPT_SSLCERTTYPE
The format of the certificate. Supported formats are “PEM” (default), “DER”, and “ENG”.

CURLOPT_SSLENGINE
The identifier for the crypto engine of the private SSL key specified in CURLOPT_SSLKEY.

CURLOPT_SSLENGINE_DEFAULT
The identifier for the crypto engine used for asymmetric crypto operations.

CURLOPT_SSLKEY
The name of a file containing a private SSL key.

CURLOPT_SSLKEYPASSWD
The secret password needed to use the private SSL key specified in CURLOPT_SSLKEY.
Note: Since this option contains a sensitive password, remember to keep the PHP script it is contained within safe.

CURLOPT_SSLKEYTYPE
The key type of the private SSL key specified in CURLOPT_SSLKEY. Supported key types are “PEM” (default), “DER”, and “ENG”.

CURLOPT_URL
需要获取的URL地址,也可以在PHP的curl_init()函数中设置。

CURLOPT_USERAGENT
在HTTP请求中包含一个”user-agent”头的字符串。

CURLOPT_USERPWD
传递一个连接中需要的用户名和密码,格式为:“[username]:[password]”。

CURLOPT_HTTP200ALIASES
设置不再以error的形式来处理HTTP 200的响应,格式为一个数组。

CURLOPT_HTTPHEADER
设置一个header中传输内容的数组。

CURLOPT_POSTQUOTE
An array of FTP commands to execute on the server after the FTP request has been performed.

CURLOPT_QUOTE
An array of FTP commands to execute on the server prior to the FTP request.

CURLOPT_FILE
设置输出文件的位置,值是一个资源类型,默认为STDOUT (浏览器)。

CURLOPT_INFILE
在上传文件的时候需要读取的文件地址,值是一个资源类型。

CURLOPT_STDERR
设置一个错误输出地址,值是一个资源类型,取代默认的STDERR。

CURLOPT_WRITEHEADER
设置header部分内容的写入的文件地址,值是一个资源类型。

CURLOPT_HEADERFUNCTION
设置一个回调函数,这个函数有两个参数,第一个是curl的资源句柄,第二个是输出的header数据。header数据的输出必须依赖这个函数,返回已写入的数据大小。

CURLOPT_PASSWDFUNCTION
设置一个回调函数,有三个参数,第一个是curl的资源句柄,第二个是一个密码提示符,第三个参数是密码长度允许的最大值。返回密码的值。

CURLOPT_READFUNCTION
设置一个回调函数,有两个参数,第一个是curl的资源句柄,第二个是读取到的数据。数据读取必须依赖这个函数。返回读取数据的大小,比如0或者EOF。

CURLOPT_WRITEFUNCTION
设置一个回调函数,有两个参数,第一个是curl的资源句柄,第二个是写入的数据。数据写入必须依赖这个函数。返回精确的已写入数据的大小

view plaincopy to clipboardprint?

  1. $ch = curl_init("http://www.bringsir.com/");  
  2. $another = curl_copy_handle($ch);  
  3. curl_exec($another);  
  4. curl_close($another);  

$ch = curl_init("http://www.bringsir.com/"); $another = curl_copy_handle($ch); curl_exec($another); curl_close($another);

curl_error()函数的作用是返回一个包含当前会话错误信息的字符串。
curl_errno()函数的作用是返回一个包含当前会话错误信息的数字编号。

curl_multi_init()函数的作用是初始化一个curl批处理句柄资源。
curl_multi_add_handle()函数的作用是向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。
curl_multi_exec()函数的作用是解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资源数量。
curl_multi_remove_handle()函数表示移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。
curl_multi_close()函数的作用是关闭一个批处理句柄资源。

view plaincopy to clipboardprint?

  1. $ch1 = curl_init();  
  2. $ch2 = curl_init();  
  3. curl_setopt($ch1, CURLOPT_URL, "http://www.baidu.com/");  
  4. curl_setopt($ch1, CURLOPT_HEADER, 0);  
  5. curl_setopt($ch2, CURLOPT_URL, "http://www.google.com/");  
  6. curl_setopt($ch2, CURLOPT_HEADER, 0);  
  7. $mh = curl_multi_init();  
  8. curl_multi_add_handle($mh,$ch1);  
  9. curl_multi_add_handle($mh,$ch2);  
  10. do {  
  11.  curl_multi_exec($mh,$flag);  
  12. } while ($flag > 0);  
  13. curl_multi_remove_handle($mh,$ch1);  
  14. curl_multi_remove_handle($mh,$ch2);  
  15. curl_multi_close($mh);  

$ch1 = curl_init(); $ch2 = curl_init(); curl_setopt($ch1, CURLOPT_URL, "http://www.baidu.com/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.google.com/"); curl_setopt($ch2, CURLOPT_HEADER, 0); $mh = curl_multi_init(); curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); do { curl_multi_exec($mh,$flag); } while ($flag > 0); curl_multi_remove_handle($mh,$ch1); curl_multi_remove_handle($mh,$ch2); curl_multi_close($mh);

curl_multi_getcontent()函数的作用是在设置了CURLOPT_RETURNTRANSFER的情况下,返回获取的输出的文本流。

curl_multi_info_read()函数的作用是获取当前解析的curl的相关传输信息。

curl_multi_select()
Get all the sockets associated with the cURL extension, which can then be “selected”

这些例子很简单,就是用来理解函数用的,看的不爽,对吧?来一个实战的~

刷论坛代码(从其他地方拔出来的~嘿嘿)
1、抓cookies程序:

view plaincopy to clipboardprint?

  1. $URL="http://www.yoururl.com/bbs/login.asp?action=chk";  
  2. //填入论坛的登陆页面地址  
  3. $ch = curl_init();  
  4. curl_setopt($ch,CURLOPT_URL,$URL);  
  5.   
  6. curl_setopt($ch,CURLOPT_REFERER,"http://www.hxfoods.com/bbs/login.asp");  
  7. //设置,访问页面的来源地址  
  8.   
  9. curl_setopt($ch,CURLOPT_POST,1);  
  10. curl_setopt($ch,CURLOPT_POSTFIELDS,’username=→→敢死队→&password=168168′);  
  11. //分析登陆页面,把用户名,密码分别对应起来  
  12.   
  13. curl_setopt ($ch, CURLOPT_HEADER,true);  
  14. //使能显示http头  
  15.   
  16. curl_exec($ch);  
  17.   
  18. if (curl_errno($ch))  
  19. {  
  20. print curl_error($ch);  
  21. }  
  22. else  
  23. {  
  24. curl_close($ch);  
  25. }  

$URL="http://www.yoururl.com/bbs/login.asp?action=chk"; //填入论坛的登陆页面地址 $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$URL); curl_setopt($ch,CURLOPT_REFERER,"http://www.hxfoods.com/bbs/login.asp"); //设置,访问页面的来源地址 curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,’username=→→敢死队→&password=168168′); //分析登陆页面,把用户名,密码分别对应起来 curl_setopt ($ch, CURLOPT_HEADER,true); //使能显示http头 curl_exec($ch); if (curl_errno($ch)) { print curl_error($ch); } else { curl_close($ch); }

2、刷楼了:

view plaincopy to clipboardprint?

  1. set_time_limit(0);  
  2. //设置程序执行时间无限制  
  3. $i=10000;  
  4. //耍10000次  
  5. for($j=0;$j<$i;$j++)  
  6. {  
  7.   
  8. $URL="http://www.yoururl.com/bbs/savepost.asp";  
  9. //这个地址是回复表单里面action的url地址  
  10.   
  11. $ch = curl_init();  
  12. curl_setopt($ch,CURLOPT_URL,$URL);  
  13. curl_setopt($ch,CURLOPT_REFERER,"http://www.hxfoods.com/bbs/dispbbs.asp?boardid=14&replyid=672709&id=127437&page=1&skin=0&Star=53");  
  14. //设置来源地址,如果不设置,论坛服务器有可能有验证不允许回复  
  15.   
  16. curl_setopt($ch,CURLOPT_COOKIESESSION,true);  
  17. //能保存cookie  
  18. curl_setopt($ch,CURLOPT_COOKIE,"DvForum=userid=24122&usercookies=0&userhidden=2&password=w0reu3g775VrY745&userclass=%96%7C&username=%A1%FA%A1%FA%B8%D2%CB%C0%B6%D3%A1%FA&StatUserID=2194783945 ");  
  19. //这儿就是设置cookie了  
  20.   
  21. curl_setopt($ch,CURLOPT_POST,1);  
  22. curl_setopt($ch,CURLOPT_NOBODY,1);  
  23. //不显示内容,因为有很多论坛回复后要自动跳转。  
  24.   
  25. curl_setopt($ch,CURLOPT_POSTFIELDS,’Body=gfdfgdfgasdfgdfgdfgdfg& amp; followup=672709&RootID=127437&star=58& TotalUseTable=Dv_bbs3& amp;UserName=→→敢死队→&signflag=1& total=65535′);  
  26. //把你分析的回复表单的参数分别赋值  
  27.   
  28. curl_setopt ($ch, CURLOPT_HEADER,true);  
  29. curl_exec($ch);  
  30. if (curl_errno($ch))  
  31. {  
  32. print curl_error($ch);  
  33. }  
  34. else  
  35. {  
  36. curl_close($ch);  
  37. }