博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php函数fsockopen的使用
阅读量:4966 次
发布时间:2019-06-12

本文共 3543 字,大约阅读时间需要 11 分钟。

函数说明:fsockopen — 打开一个网络连接或者一个Unix套接字连接

语法:

resource fsockopen  ( string $hostname  [, int $port  = -1  [, int &$errno  [, string &$errstr  [, float $timeout  = ini_get("default_socket_timeout")  ]]]] )

参数:

  1. hostname 如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议ssl://或者是tls://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机。 
  2. port 端口号。如果对该参数传一个-1,则表示不使用端口,例如unix://。 
  3. errno 如果errno的返回值为0,而且这个函数的返回值为 FALSE ,那么这表明该错误发生在套接字连接(connect())调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。 
  4. errstr 错误信息将以字符串的信息返回。 
  5. timeout 设置连接的时限,单位为秒。

返回值:

  fsockopen() 将返回一个文件句柄,之后可以被其他文件类函数调用(例如: fgets() , fgetss() , fwrite() , fclose() 还有 feof() )。如果调用失败,将返回 FALSE 。

1、简单连接一个http请求

<?php

$fp = fsockopen("www.baidu.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>

 

2、fsockopen 来模拟生成 HTTP 连接

\n"; } else { $out = "GET ".$info['path']." HTTP/1.1".PHP_EOL; $out .= "Host: ".$info['host'].PHP_EOL; $out .= "Connection: Close".PHP_EOL.PHP_EOL; fwrite($fp, $out); $content = ''; while (!feof($fp)) { $content .= fgets($fp); } echo $content; fclose($fp); }

3、PHP fsockopen模拟POST/GET方法

fsockopen除了像上面实例模拟生成 HTTP 连接之外,还能实现很多功能,比如模拟post 和 get 传送数据的方法。 

'bar', 'baz'=>'boom', 'site'=>'www.manongjc.com', 'name'=>'nowa magic');function sock_data($url,$port=80,$t=30,$method='get',$data=null){ $info=parse_url($url); $fp = fsockopen($info["host"],$port, $errno, $errstr,$t); // 判断是否有数据 if(isset($data) && !empty($data)) { $query = http_build_query($data); // 数组转url 字符串形式 }else { $query=null; } // 如果用户的$url "http://www.manongjc.com/"; 缺少 最后的反斜杠 if(!isset($info['path']) || empty($info['path'])) { $info['path']="/index.html"; } // 判断 请求方式 if($method=='post') { $head = "POST ".$info['path']." HTTP/1.0".PHP_EOL; }else { $head = "GET ".$info['path']."?".$query." HTTP/1.0".PHP_EOL; } $head .= "Host: ".$info['host'].PHP_EOL; // 请求主机地址 $head .= "Referer: http://".$info['host'].$info['path'].PHP_EOL; if(isset($data) && !empty($data) && ($method=='post')) { $head .= "Content-type: application/x-www-form-urlencoded".PHP_EOL; $head .= "Content-Length: ".strlen(trim($query)).PHP_EOL; $head .= PHP_EOL; $head .= trim($query); }else { $head .= PHP_EOL; } $write = fputs($fp, $head); //写入文件(可安全用于二进制文件)。 fputs() 函数是 fwrite() 函数的别名 while (!feof($fp)) { $line = fread($fp,4096); echo $line; }}// 函数调用sock_data($url,$port,$t,'post',$data);

4、fsockopen以Socket方式模拟HTTP下载文件/

function sock_down($url,$port=80,$down_name=null) { $info=parse_url($url); # 建立连接 $fp = fsockopen($info["host"],$port,$errno,$errstr,$t); stream_set_blocking($fp, 1); if(!$fp) { echo "$errno : $errstr
"; } else { # 发送一个HTTP请求信息头 $request_header="GET ".$info['path']." HTTP/1.1".PHP_EOL; # 起始行 # 头域 $request_header.="Host: ".$info["host"].PHP_EOL; # 再一个回车换行表示头信息结束 $request_header.=PHP_EOL; # 发送请求到服务器 fputs($fp,$request_header); if(!isset($down_name) || empty($down_name)) { $down_name=basename($url); //默认当前文件同目录 } # 接受响应 $fp2=fopen($down_name,'w'); // 要下载的文件名 下载到指定目录 $line=''; while (!feof($fp)) { $line.= fputs($fp2,fgets($fp)); } if(feof($fp)) { echo ""; } # 关闭 fclose($fp2); fclose($fp); } } //函数调用 sock_down($url,$port);

 

转载于:https://www.cnblogs.com/-qing-/p/10914777.html

你可能感兴趣的文章
优先队列详解
查看>>
VS2012 创建项目失败,,提示为找到约束。。。。
查看>>
外观模式(Facade Pattern)
查看>>
PHP-----数组和常见排序算法
查看>>
FTS(3) BSD 库函数手册 遍历文件夹(一)
查看>>
jsp_javabean
查看>>
JavaScript中Trim(),TrimStart(),TrimEnd()的实现
查看>>
JavaScript大厦之JS运算符
查看>>
Visualforce控制器
查看>>
9) 依赖查询 & 镜像站
查看>>
MapGuide open source开发心得二: 资源
查看>>
笔记62 | 个人项目“易来”开发记录《一》实现号码测凶吉功能模块
查看>>
乐观锁和悲观锁
查看>>
linux 下 apache启动、停止、重启命令
查看>>
jsidk 上传图片转移到另一个项目遇到的问题
查看>>
学习进度2
查看>>
onbeforeunload与onunload事件
查看>>
字典示例
查看>>
WPF仿360卫士9.0界面设计
查看>>
[破解]java打包Exe工具 - Jar2Exe Wizard
查看>>