1 <?php 2 /**** 3 自学it网 高端PHP培训 4 5 论 坛: http://www.zixue.it 6 微 博: http://weibo.com/Yshiba 7 ****/ 8 9 10 11 /* 12 PHP+socket编程 发送HTTP请求 13 14 要求能 模拟下载,注册,登陆,批量发帖 15 */ 16 17 18 // http请求类的接口 19 interface Proto { 20 // 连接url 21 function conn($url); 22 23 //发送get查询 24 function get(); 25 26 // 发送post查询 27 function post(); 28 29 // 关闭连接 30 function close(); 31 } 32 33 34 35 class Http implements Proto { 36 37 const CRLF = "\r\n"; 38 39 protected $errno = -1; 40 protected $errstr = ''; 41 protected $response = ''; 42 43 protected $url = null; 44 protected $version = 'HTTP/1.1'; 45 protected $fh = null; 46 47 protected $line = array(); 48 protected $header = array(); 49 protected $body = array(); 50 51 52 public function __construct($url) { 53 $this->conn($url); 54 $this->setHeader('Host: ' . $this->url['host']); 55 } 56 57 // 此方法负责写请求行 58 protected function setLine($method) { 59 $this->line[0] = $method . ' ' . $this->url['path'] . ' '. $this->version; 60 } 61 62 // 此方法负责写头信息 63 protected function setHeader($headerline) { 64 $this->header[] = $headerline; 65 } 66 67 // 此方法负责写主体信息 68 protected function setBody($body) { 69 $this->body[] = http_build_query($body); 70 } 71 72 73 // 连接url 74 public function conn($url) { 75 $this->url = parse_url($url); 76 // 判断端口 77 if(!isset($this->url['port'])) { 78 $this->url['port'] = 80; 79 } 80 81 $this->fh = fsockopen($this->url['host'],$this->url['port'],$this->errno,$this->errstr,3); 82 } 83 84 //构造get请求的数据 85 public function get() { 86 $this->setLine('GET'); 87 $this->request(); 88 return $this->response; 89 } 90 91 // 构造post查询的数据 92 public function post($body = array()) { 93 $this->setLine('POST'); 94 95 // 设计content-type 96 $this->setHeader('Content-type: application/x-www-form-urlencoded'); 97 98 // 设计主体信息,比GET不一样的地方 99 $this->setBody($body); 100 101 102 // 计算content-length 103 $this->setHeader('Content-length: ' . strlen($this->body[0])); 104 105 $this->request(); 106 } 107 108 // 真正请求 109 public function request() { 110 // 把请求行,头信息,实体信息 放在一个数组里,便于拼接 111 $req = array_merge($this->line,$this->header,array(''),$this->body,array('')); 112 //print_r($req); 113 114 $req = implode(self::CRLF,$req); 115 //echo $req; exit; 116 117 fwrite($this->fh,$req); 118 119 while(!feof($this->fh)) { 120 $this->response .= fread($this->fh,1024); 121 } 122 123 $this->close(); // 关闭连接 124 } 125 126 127 // 关闭连接 128 public function close() { 129 fclose($this->fh); 130 } 131 132 133 134 } 135 136 137 138 139 /* 140 $url = 'http://news.163.com/13/0613/09/9187CJ4C00014JB6.html'; 141 142 $http = new Http($url); 143 echo $http->get(); 144 */ 145 /* 146 set_time_limit(0); 147 148 $url = 'http://liangyue.net.cn/0523/?'; 149 150 151 152 for($i=1;$i<100;$i++) { 153 $str = str_shuffle('abcdefghijklmnopqrst0776656'); 154 $tit = substr($str,0,5); 155 $con = substr($str,6,8); 156 157 $http = new Http($url); 158 $http->post(array('tit'=>$tit,'con'=>$con,'submit'=>'留言')); 159 160 echo $tit,'-----------',$con,'<br />'; 161 162 usleep(2000); 163 } 164 165 */