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 相关文章推荐
如何分别全角和半角以避免乱码
Oct 09 PHP
中篇:安装及配置PHP
Dec 13 PHP
在PHP中使用curl_init函数的说明
Nov 02 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
php获取网页中图片、DIV内容的简单方法
Jun 19 PHP
php对关联数组循环遍历的实现方法
Mar 13 PHP
PHP对象链式操作实现原理分析
Oct 09 PHP
php生成与读取excel文件
Oct 14 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
May 28 PHP
PHP从尾到头打印链表实例讲解
Sep 27 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
JQuery 风格的HTML文本转义
2009/07/01 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
JavaScript判断数字是否为质数的方法汇总
2016/06/02 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
python 构造三维全零数组的方法
2018/11/12 Python
一百行python代码将图片转成字符画
2021/02/19 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
一个C/C++编程面试题
2013/11/10 面试题
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
税务会计岗位职责
2014/02/18 职场文书
个人创业事迹材料
2014/12/30 职场文书
亲情作文之母爱
2019/09/25 职场文书
React实现动效弹窗组件
2021/06/21 Javascript