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 XPath对XML文件查找及修改实现代码
Jul 27 PHP
php 调试利器debug_print_backtrace()
Jul 23 PHP
PHP程序员基本要求和必备技能
May 09 PHP
windows7下安装php的imagick和imagemagick扩展教程
Jul 04 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
php中注册器模式类用法实例分析
Nov 03 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
joomla组件开发入门教程
May 04 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 PHP
php格式文件打开的四种方法
Feb 24 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
vue实现通讯录功能
2018/07/14 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
python实现狄克斯特拉算法
2019/01/17 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
高中毕业生个人自我鉴定
2013/11/24 职场文书
实用求职信范文分享
2013/12/25 职场文书
考试作弊被抓检讨书
2014/01/10 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
教师节活动总结
2014/08/29 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
2015暑假假期总结
2015/07/13 职场文书
MySQL的存储过程和相关函数
2022/04/26 MySQL