PHP中的socket扩展模块,是基于对计算机网络技术网络层和传输层的实现,使用socket来实现采集是在网络层面上来说最底层的实现方式,它只是建立了一个长连接(TCP连接),然后我们要自己构造 http协议的请规则去实现数据的获取。例如:要想获取这个页面的内容,http://www.w3capi.com/cms/column/id/4.html,用socket实现代码如下:
function collect_by_url($domain,$url) {
//连接,$error错误编号,$errstr错误的字符串,30s是连接超时时间
$fp = fsockopen($domain, 80, $errno, $errstr, 30);
if (!$fp) die("连接失败" . $errstr);
//因为socket是网路偏底层协议实现,这里需要构造http协议的请求头(http协议属于网络应用层协议,有自己规定的请求和响应格式)
$http = "GET ".$url." HTTP/1.1\r\n"; // \r\n表示前面的是一个命令
$http .= "Host:".$domain."\r\n"; //请求的主机
$http .= "Connection:close\r\n\r\n"; // 连接关闭,最后一行要两个\r\n
//发送这个字符串到服务器
fwrite($fp, $http, strlen($http));
//接收服务器返回的数据
$data = '';
while (!feof($fp)) {
$data .= fread($fp, 4096); //fread读取返回的数据,一次读取4096字节
}
//关闭连接
fclose($fp);
return $data;
}
$domain = "www.w3capi.com";
$url = "/cms/column/id/4.html";
var_dump(collect_by_url($domain,$url));
返回结果如下所示,这也是 http 协议规定的响应内容格式,其中包含了我们请求的页面的源码数据: