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


Posted in PHP onJuly 31, 2015

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

zsocket.class.php文件如下:

<?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代码如下:

$host = '3water.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程序设计有所帮助。

PHP 相关文章推荐
用PHP实现多级树型菜单
Oct 09 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
PHP无限分类(树形类)
Sep 28 PHP
微信公众平台天气预报功能开发
Jul 06 PHP
php上传文件并存储到mysql数据库的方法
Mar 16 PHP
PHP限制HTML内容中图片必须是本站的方法
Jun 16 PHP
Symfony2 session用法实例分析
Feb 04 PHP
PHP实现支持加盐的图片加密解密
Sep 09 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
php多进程模拟并发事务产生的问题小结
Dec 07 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
Jul 31 #PHP
PHP中filter函数校验数据的方法详解
Jul 31 #PHP
PHP代码实现爬虫记录――超管用
Jul 31 #PHP
PHP 前加at符合@的作用解析
Jul 31 #PHP
PHP查看当前变量类型的方法
Jul 31 #PHP
如何把php5.3版本升级到php5.4或者php5.5
Jul 31 #PHP
PHP内核探索:哈希表碰撞攻击原理
Jul 31 #PHP
You might like
php 模拟POST|GET操作实现代码
2010/07/20 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
js 匿名调用实现代码
2009/06/19 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
使用angular写一个hello world
2015/01/23 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
Python中的lstrip()方法使用简介
2015/05/19 Python
python插入排序算法实例分析
2015/07/03 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
Python Django 命名空间模式的实现
2019/08/09 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
我爱祖国演讲稿
2014/09/02 职场文书
市场营销计划书
2015/01/17 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
合同补充协议书
2016/03/24 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
Nginx安装配置详解
2022/06/25 Servers