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 相关文章推荐
建立动态的WML站点(二)
Oct 09 PHP
第六章 php目录与文件操作
Dec 30 PHP
php中的PHP_EOL换行符详细解析
Oct 26 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 PHP
php+mysql删除指定编号员工信息的方法
Jan 14 PHP
php制作文本式留言板
Mar 18 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
详解YII关联查询
Jan 10 PHP
PHP实现的网站目录扫描索引工具
Sep 08 PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
Jan 15 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 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
CI框架给视图添加动态数据
2014/12/01 PHP
异步动态加载js与css文件的js代码
2013/09/15 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
2020/07/28 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
简单分析js中的this的原理
2019/08/31 Javascript
python中as用法实例分析
2015/04/30 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
Python socket服务常用操作代码实例
2020/06/22 Python
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
群胜软件Java笔试题
2012/09/29 面试题
乡镇庆八一活动方案
2014/02/02 职场文书
温馨提示标语
2014/06/26 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
2015年小学开学寄语
2015/02/27 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
庆七一晚会主持词
2015/06/30 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
golang 实现并发求和
2021/05/08 Golang
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle