首页 > 开发 > PHP > 正文

php自定义类fsocket模拟post或get请求的方法

2024-05-04 23:38:30
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php自定义类fsocket模拟post或get请求的方法,涉及php使用socket模拟post及get请求的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了php自定义类fsocket模拟post或get请求的方法。分享给大家供大家参考。具体如下:

zsocket.class.php文件如下:

 

  1. <?php 
  2. class ZSocket { 
  3. /* 
  4. * Init  
  5. */ 
  6. private function _fsockopen($host, $port, &$errno, &$errstr, $timeout){ 
  7. $ip = @gethostbyname($host); 
  8. $s = @socket_create(AF_INET, SOCK_STREAM, 0); 
  9. if(socket_set_nonblock($s)){ 
  10. $r = @socket_connect($s, $ip, $port); 
  11. if ($r || socket_last_error() == EINPROGRESS) { 
  12. $errno = EINPROGRESS; 
  13. return $s; 
  14. $errno = socket_last_error($s); 
  15. $errstr = socket_strerror($errno); 
  16. socket_close($s); 
  17. return false
  18. /* 
  19. * 设置Cookie 
  20. */ 
  21. private function _setCookie($cookie){ 
  22. $_cookies = explode("; ",$cookie); 
  23. $_tmp = explode("=",$_cookies[0]); 
  24. setcookie($_tmp[0], $_tmp[1]); 
  25. return $_cookies; 
  26. /* 
  27. * 获取返回数据header内容 
  28. */ 
  29. private function _getDataHeader(&$fp,&$reHeader,&$cookies){ 
  30. $maxlen = 0; 
  31. while(!feof($fp)){ 
  32. $line = fgets($fp,1024); 
  33. if(substr($line, 0, 12) == 'Set-Cookie: '){ $cookies[] = $this->_setCookie(substr($line, 12)); } 
  34. $reHeader .= $line; 
  35. if(substr($line, 0, 16) == 'Content-Length: '){ 
  36. $maxlen = intval(substr($line, 16, -2));  
  37. if($line == "/r/n" || $line == ""break
  38. return $maxlen; 
  39. /* 
  40. * 获取返回数据正文内容 
  41. */ 
  42. private function _getDataBody(&$fp,$maxlen){ 
  43. $reData = ""
  44. while(!feof($fp)){ 
  45. $line = fgets($fp,$maxlen+1); 
  46. $reData .= $line; 
  47. if(strlen($line) < $maxlen) $maxlen = $maxlen - strlen($line); 
  48. else break
  49. return $reData; 
  50. /* 
  51. * 设置并返回要发送的header内容 
  52. */ 
  53. public function get_HeaderInfo($host,$type='GET',$file='/',$params=array(),$head=array(),$cookies=array()){ 
  54. $_params = $_cookies = ''
  55. if(is_array($params)){ 
  56. foreach($params as $key=>$value){  
  57. $_params .= "&".$key."=".urlencode($value);  
  58. $_params = (strlen($_params) > 1) ? substr($_params,1) : ''
  59. }else if(is_string($params)){ 
  60. $_params = urlencode($params); 
  61. foreach($cookies as $key=>$value){ 
  62. $_cookies .= "; ".$key."=".urlencode($value);  
  63. $_cookies = (strlen($_cookies) > 2) ? substr($_cookies,2) : ''
  64. $file .= ($type == 'GET') ? ($_params == '' ? '' : '?'.$_params) : ''
  65. $header = $type." ".$file." HTTP/1.1/r/n"
  66. $header .= "Host: ".$host."/r/n"
  67. //$header .= "Referer: ".get_ip()."/r/n"; 
  68. //$header .= "X-Forwarded-For: ".get_ip()."/r/n"; 
  69. $header .= ($type == 'GET') ? '' : "Content-Type: application/x-www-form-urlencoded/r/n"
  70. if(is_array($head) && $head != array()){ 
  71. foreach($head as $k=>$v){ 
  72. $header .= $k.": ".$v."/r/n"
  73. $header .= "Content-Length: ".strlen($_params)."/r/n"
  74. if($_cookies != '') $header .= "Cookie: ".$_cookies."/r/n"
  75. /* 
  76. foreach($_SERVER as $name => $value){ 
  77. if(substr($name, 0, 5) == 'HTTP_' && $name != 'HTTP_HOST'){ 
  78. $header .= str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))).":".$value."/r/n"; 
  79. } 
  80. } 
  81. */ 
  82. $header .= "Connection: Close/r/n/r/n"
  83. $header .= $_params."/r/n"
  84. return $header; 
  85. /* 
  86. * 发送,并返回结果 Array 
  87. */ 
  88. public function get_SendData($host,$port=80,$header=''){ 
  89. if(function_exists('fsockopen')){ 
  90. $fp = fsockopen($host,$port,$errno,$errstr,10); 
  91. }else if(function_exists('pfsockopen')){ 
  92. $fp = pfsockopen($host,$port,$errno,$errstr,10); 
  93. }else if(function_exists('stream_socket_client')){ 
  94. $fp = stream_socket_client($host.':'.$port,$errno,$errstr,10); 
  95. }else
  96. $fp = $this->_fsockopen($host,$port,$errno,$errstr,10); 
  97. $fp = fsockopen($host,$port,$errno,$errstr,10); 
  98. if(!$fp) return array('header'=>'','data'=>$errstr."--->".$errno,'cookie'=>''); 
  99. $reHeader = $reData = ""
  100. $cookies = array(); 
  101. fputs($fp,$header); 
  102. $maxlen = $this->_getDataHeader($fp,$reHeader,$cookies); 
  103. $reData = $this->_getDataBody($fp,$maxlen); 
  104. fclose($fp); 
  105. return array('header'=>$reHeader,'data'=>$reData,'cookie'=>$cookies); 

demo代码如下:

 

 
  1. $host = 'www.vevb.com'
  2. $port = '80'
  3. $type = 'POST'
  4. $file = '/'
  5. $params = ''
  6. //include_once('include/zsocket.class.php'); //include 
  7. $zsk = new ZSocket(); 
  8. $header = $zsk->get_HeaderInfo($host,$type,$file,$params); 
  9. $data = $zsk->get_SendData($host,$port,$header); 
  10. /* 
  11. echo "<!--/r/n"; 
  12. print_r($header); 
  13. print_r($data); 
  14. echo "-->/r/n"; 
  15. */ 
  16. var_dump($header); 
  17. var_dump($data); 

希望本文所述对大家的php程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表