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+DBM的同学录程序(4)
Oct 09 PHP
php AJAX实例根据邮编自动完成地址信息
Nov 23 PHP
php curl的深入解析
Jun 02 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
php中url函数介绍及使用示例
Feb 13 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
May 04 PHP
php通过文件流方式复制文件的方法
Mar 13 PHP
如何实现php图片等比例缩放
Jul 28 PHP
php使用pdo连接sqlite3的配置示例
May 27 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
Laravel框架下载,安装及路由操作图文详解
Dec 04 PHP
YII2 全局异常处理深入讲解
Mar 24 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 Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
js处理json以及字符串的比较等常用操作
2013/09/08 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
理解javascript正则表达式
2016/03/08 Javascript
Json解析的方法小结
2016/06/22 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
vue项目引入字体.ttf的方法
2018/09/28 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
使用PDB模式调试Python程序介绍
2015/04/05 Python
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
在Python中进行自动化单元测试的教程
2015/04/15 Python
对于Python装饰器使用的一些建议
2015/06/03 Python
构建Python包的五个简单准则简介
2015/06/15 Python
使用pyqt5 tablewidget 单元格设置正则表达式
2019/12/13 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
应届大学生自荐信格式
2013/09/21 职场文书
迎接领导欢迎词
2014/01/11 职场文书
工作失职检讨书范文
2014/01/16 职场文书
说明书格式及范文
2014/05/07 职场文书
法定代表人授权委托书范文
2014/08/02 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
详解Laravel制作API接口
2021/05/31 PHP