本文实例讲述了php自定义类fsocket模拟post或get请求的方法。分享给大家供大家参考。具体如下:
zsocket.class.php文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
<?php class ZSocket { /* * Init */ private function _fsockopen( $host , $port , & $errno , & $errstr , $timeout ){ $ip = @ gethostbyname ( $host ); $s = @socket_create(AF_INET, SOCK_STREAM, 0); if (socket_set_nonblock( $s )){ $r = @socket_connect( $s , $ip , $port ); if ( $r || socket_last_error() == EINPROGRESS) { $errno = EINPROGRESS; return $s ; } } $errno = socket_last_error( $s ); $errstr = socket_strerror( $errno ); socket_close( $s ); return false; } /* * 设置Cookie */ private function _setCookie( $cookie ){ $_cookies = explode ( "; " , $cookie ); $_tmp = explode ( "=" , $_cookies [0]); setcookie( $_tmp [0], $_tmp [1]); return $_cookies ; } /* * 获取返回数据header内容 */ private function _getDataHeader(& $fp ,& $reHeader ,& $cookies ){ $maxlen = 0; while (! feof ( $fp )){ $line = fgets ( $fp ,1024); if ( substr ( $line , 0, 12) == 'Set-Cookie: ' ){ $cookies [] = $this ->_setCookie( substr ( $line , 12)); } $reHeader .= $line ; if ( substr ( $line , 0, 16) == 'Content-Length: ' ){ $maxlen = intval ( substr ( $line , 16, -2)); } if ( $line == "\r\n" || $line == "" ) break ; } return $maxlen ; } /* * 获取返回数据正文内容 */ private function _getDataBody(& $fp , $maxlen ){ $reData = "" ; while (! feof ( $fp )){ $line = fgets ( $fp , $maxlen +1); $reData .= $line ; if ( strlen ( $line ) < $maxlen ) $maxlen = $maxlen - strlen ( $line ); else break ; } return $reData ; } /* * 设置并返回要发送的header内容 */ public function get_HeaderInfo( $host , $type = 'GET' , $file = '/' , $params = array (), $head = array (), $cookies = array ()){ $_params = $_cookies = '' ; if ( is_array ( $params )){ foreach ( $params as $key => $value ){ $_params .= "&" . $key . "=" .urlencode( $value ); } $_params = ( strlen ( $_params ) > 1) ? substr ( $_params ,1) : '' ; } else if ( is_string ( $params )){ $_params = urlencode( $params ); } foreach ( $cookies as $key => $value ){ $_cookies .= "; " . $key . "=" .urlencode( $value ); } $_cookies = ( strlen ( $_cookies ) > 2) ? substr ( $_cookies ,2) : '' ; $file .= ( $type == 'GET' ) ? ( $_params == '' ? '' : '?' . $_params ) : '' ; $header = $type . " " . $file . " HTTP/1.1\r\n" ; $header .= "Host: " . $host . "\r\n" ; //$header .= "Referer: ".get_ip()."\r\n"; //$header .= "X-Forwarded-For: ".get_ip()."\r\n"; $header .= ( $type == 'GET' ) ? '' : "Content-Type: application/x-www-form-urlencoded\r\n" ; if ( is_array ( $head ) && $head != array ()){ foreach ( $head as $k => $v ){ $header .= $k . ": " . $v . "\r\n" ; } } $header .= "Content-Length: " . strlen ( $_params ). "\r\n" ; if ( $_cookies != '' ) $header .= "Cookie: " . $_cookies . "\r\n" ; /* foreach($_SERVER as $name => $value){ if(substr($name, 0, 5) == 'HTTP_' && $name != 'HTTP_HOST'){ $header .= str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))).":".$value."\r\n"; } } */ $header .= "Connection: Close\r\n\r\n" ; $header .= $_params . "\r\n" ; return $header ; } /* * 发送,并返回结果 Array */ public function get_SendData( $host , $port =80, $header = '' ){ if (function_exists( 'fsockopen' )){ $fp = fsockopen ( $host , $port , $errno , $errstr ,10); } else if (function_exists( 'pfsockopen' )){ $fp = pfsockopen( $host , $port , $errno , $errstr ,10); } else if (function_exists( 'stream_socket_client' )){ $fp = stream_socket_client( $host . ':' . $port , $errno , $errstr ,10); } else { $fp = $this ->_fsockopen( $host , $port , $errno , $errstr ,10); } $fp = fsockopen ( $host , $port , $errno , $errstr ,10); if (! $fp ) return array ( 'header' => '' , 'data' => $errstr . "--->" . $errno , 'cookie' => '' ); $reHeader = $reData = "" ; $cookies = array (); fputs ( $fp , $header ); $maxlen = $this ->_getDataHeader( $fp , $reHeader , $cookies ); $reData = $this ->_getDataBody( $fp , $maxlen ); fclose( $fp ); return array ( 'header' => $reHeader , 'data' => $reData , 'cookie' => $cookies ); } } |
demo代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$host = 'www.zzvips.com' ; $port = '80' ; $type = 'POST' ; $file = '/' ; $params = '' ; //include_once('include/zsocket.class.php'); //include $zsk = new ZSocket(); $header = $zsk ->get_HeaderInfo( $host , $type , $file , $params ); $data = $zsk ->get_SendData( $host , $port , $header ); /* echo "<!--\r\n"; print_r($header); print_r($data); echo "-->\r\n"; */ var_dump( $header ); var_dump( $data ); |
希望本文所述对大家的php程序设计有所帮助。