在php中文手册对curl_setopt函数说明的翻译中,对CURLOPT_NOBODY选项说明是如下:
CURLOPT_NOBODY
启用时将不对HTML中的BODY部分进行输出。
这一点是完全翻译错误。准确的意思是指定http请求方法为HEAD,在http协议中服务器对HEAD方法响应消息中将只包含消息头的部分,而不包含消息体(即body)。对应分析php-curl扩展中对CURLOPT_NOBODY
命令字的响应是直接调用curl_easy_setopt,在curl_easy_setopt中对CURLOPT_NOBODY命令字响应其实是设置请求方法为HEAD,如下
在Curl_setopt()函数中
case CURLOPT_NOBODY:
/*
* Do not include the body part in the output data stream.
*/
data->set.opt_no_body = (0 != va_arg(param, long))?TRUE:FALSE;
break;
以及在Curl_http()函数中
if(data->set.str[STRING_CUSTOMREQUEST])
request = data->set.str[STRING_CUSTOMREQUEST];
else {
if(data->set.opt_no_body)
request = "HEAD";
实际验证结果,也证明如此,如:
Administrator@attention /e/Code
$ php PageCrawler.php > /dev/null
* About to connect() to port 80 (#0)
* Trying 61.174.55.11...
* connected
* Connected to (61.174.55.11) port 80 (#0)
> HEAD /539349.html HTTP/1.1
Host:
Accept: */*
Referer:
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Cache-Conrol: no-cache
< HTTP/1.1 200 OK
< Server: JDWS
< Date: Sun, 11 Aug 2013 14:01:13 GMT
< Content-Type: text/html; charset=gbk
< Vary: Accept-Encoding
< Last-Modified: Sun, 11 Aug 2013 12:00:54 GMT
< Expires: Sun, 11 Aug 2013 14:06:14 GMT
< Cache-Control: max-age=300
< X-Cache: EXPIRED from
< Age: 0
< Via: http/1.1 ( [cSsSfD]), http/1.1 HZ-CT-1-JCS-45 ( [cMsSf ])
< Connection: keep-alive
* no chunk, no close, no size. Assume close to signal end
<
* Closing connection #0
由于CURLOPT_NOBODY是设置只返回http响应头,因此不能同时设置CURLOPT_HEADER为FALSE(输出中不包含响应头),否则curl_exec将失败返回FALSE
看来什么事都不能太相信手册,哪怕是官方的,源码才是王道!