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
Nov 25 PHP
php下使用无限生命期Session的方法
Mar 16 PHP
php定时删除文件夹下文件(清理缓存文件)
Jan 23 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
PHP限制HTML内容中图片必须是本站的方法
Jun 16 PHP
PHP发送短信代码分享
Aug 11 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
PHP的mysqli_select_db()函数讲解
Jan 23 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使用array_search函数实现数组查找的方法
2015/06/12 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
详解Python pygame安装过程笔记
2017/06/05 Python
python自定义异常实例详解
2017/07/11 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
python模块导入的细节详解
2018/12/10 Python
Python中的集合介绍
2019/01/28 Python
Python递归函数实例讲解
2019/02/27 Python
python3人脸识别的两种方法
2019/04/25 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
Python3 Click模块的使用方法详解
2020/02/12 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
浅谈Python协程
2020/06/17 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
机械设计专业应届生求职信
2013/11/21 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
小学生读书感言
2014/02/12 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
大课间体育活动方案
2014/03/12 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
python计算列表元素与乘积详情
2022/08/05 Python