函数说明: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 。

php fsockopen使用案例

  1、fsockopen 来模拟生成 HTTP 连接 

$url="http://www.manongjc.com";
$port=80;
$t=30;
/**fsockopen 抓取页面
* @parem $url 网页地址
* @parem $port 端口 默认 80
* @parem $t 设置连接的时间 默认30s
* */
function fsock($url,$port=80,$t=30)
{
   $info=parse_url($url);
$fp = fsockopen($info['host'],$port,$errno,$errstr,$t);
if (!$fp)
{
echo "$errstr ($errno)<br />\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);
}
}
// 函数调用
fsock($url, $port,$t);

2、PHP fsockopen模拟POST/GET方法

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

$url = "http://localhost/test/test.php"; #url 地址必须 http://xxxxx
$port=80;
$t=30;
$data = array(
'foo'=>'bar',
'baz'=>'boom',
'site'=>'www.manongjc.com',
'name'=>'nowa magic'); /**fsockopen 抓取页面
* @parem $url 网页地址 host 主机地址
* @parem $port 网址端口 默认80
* @parem $t 脚本请求时间 默认30s
* @parem $method 请求方式 get/post
* @parem $data 如果单独传数据为 post 方式
* @return 返回请求回的数据
* */
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);

3、fsockopen以Socket方式模拟HTTP下载文件/* *   PHP设置脚本最大执行时间的三种方法    1、在php.ini里面设置

/** 
PHP设置脚本最大执行时间的三种方法
   1.php.ini文件中
   max_execution_time = 120;
2、通过PHP的ini_set函数设置
ini_set("max_execution_time", "120");
3、通过set_time_limit 函数设置
set_time_limit(120);
以上几个数字设置为0则无限制,脚本会一直执行下去,直到执行结束。
* */
set_time_limit(0); $url = 'http://localhost/test/img.zip';
$port = '80';
/** sockopen 下载文件
* @parem $url 访问文件的url 地址
* @parem $port 默认 80
* @parem $down_name 下载指定路径文件名称 例如 ../aa.zip
* */
function sock_down($url,$port=80,$down_name=null)
{
$info=parse_url($url); # 建立连接
$fp = fsockopen($info["host"],$port,$errno,$errstr,$t);
/*
为资源流设置阻塞或者阻塞模式 参数:资源流(),0是非阻塞,1是阻塞
bool stream_set_blocking ( resource $stream , int $mode )
阻塞的好处是,排除其它非正常因素,阻塞的是按顺序执行的同步的读取。将会一直等到从资源流里面获取到数据才能返回
而非阻塞,因为不必等待内容,所以能异步的执行,现在读到读不到都没关系,执行读取操作后会立即返回数据
* */
stream_set_blocking($fp, 1); if(!$fp)
{
echo "$errno : $errstr<br/>";
}
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 "<script>alert('已下载到当前目录')</script>";
}
# 关闭
fclose($fp2);
fclose($fp);
}
}
//函数调用
sock_down($url,$port);

4、使用 fsockopen 伪造来源网址、路径

  php 伪造HTTP_REFERER页面URL来源的三种方法

php fsockopen使用的更多相关文章

  1. php中使用fsockopen实现异步请求

    php执行一段程序,有可能几毫秒就执行完毕,也有可能耗时较长.例如,用户下单这个事件,如果调用了些第三方服务进行发邮件.短信.推送等通知,可能导致前端一直在等待.而有的时候,我们并不关心这些耗时脚本的 ...

  2. fsockopen读取、发送cookie及注意事项 -代码示例

    function httpPost($url, $data,$cookieStr='') { $url_array = parse_url($url); $host = $url_array['hos ...

  3. 利用fsockopen可实现异步成功访问

    $fp = fsockopen("www.jb51.net", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ( ...

  4. PHP fsockopen 异步调用接口在nginx上偶尔实效的情况

    private function fsock_asy_do($get){ $fp = fsockopen("ssl://www.xxx.com", 443, $errno, $er ...

  5. 虚拟主机无法使用fsockopen操作处理方法

    一.如何禁用fsockopen()下面是两种常用的禁用fsockopen的方法.1.修改php.ini,将 disable_functions = 后加入 fsockopen2.修改php.ini,将 ...

  6. PHP模拟发送POST请求之三、用Telnet和fsockopen()模拟发送POST信息

    了解完了HTTP头信息和URL信息的具体内容,我们开始尝试自己动手写一段头信息发送到服务器.Windows内置命令Telnet可以帮助我们发送简单的HTTP请求. 并且TELNET是一个特别灵活的工具 ...

  7. php中curl和fsockopen发送远程数据的应用

    最近要用到通过post上传文件,网上盛传的有curl的post提交和fsockopen,其中curl最简单,于是从最简单的说起. 这是简单的将一个变量post到另外一个页面 $url = ''; $d ...

  8. php用fsockopen实现post提交数据并获得返回数据

    /** * 函数介绍: 用于post方式提交数据 * 输入参数: 完整url, 数据 * 返回值 : 接口返回值 */ function post_it($url, $data = '', $time ...

  9. php异步加载、多线程fsockopen()、fputs()

    index.php <?php function test() { $fp=fsockopen("localhost", 80, $errno, $errstr, 30); ...

  10. fsockopen/curl/file_get_contents效率比较

    前面小节 PHP抓取网络数据的6种常见方法 谈到了 fsockopen,curl与file_get_contents 的使用方法,虽然它们都能达到同一个使用目的,但是它们之间又有什么区别呢? 先谈谈c ...

随机推荐

  1. Yahoo浮沉录

    Yahoo这一路曾经出过很多好技术 然而,任何人如果只是把 Yahoo 当作一家缺乏聚焦的企业来看也许忽视了公司内部的那些创新—偶尔甚至还有一些很好的产品创意.就拿搜索来说吧,我们说的不是付费搜索,而 ...

  2. hbase.client.RetriesExhaustedException: Can't get the locations hive关联Hbase查询报错

    特征1: hbase.client.RetriesExhaustedException: Can't get the locations 特征2: hbase日志报错如下:org.apache.zoo ...

  3. thread常用方法

  4. sharepoint文档库中日期显示详细日期,不显示几天前

    文档库---库设置----栏

  5. Quartz_1_简单编程式任务调度使用(SimpleTrigger)

    最近在工作中,要做定时任务的更能,最开始的时候,想到的是 JavaSE 中,自带 Timer 及 TimerTask 联合使用,完成定时任务.最后发现,随着业务的复杂,JDK 中的 Timer 和 T ...

  6. javascript 函数,事件

    1.函数字符串函数 var s=new string(); var ss="hello world"; var sss=""HELLO, WORLD" ...

  7. HTML和CSS入门教程

    慕课网上面的HTML+CSS基础课程感觉非常适合入门.

  8. Node.js 介绍及学习

    Node.js => 简单来理解,就是指运行在服务器端的JavaScript.  Node.js 是一个基于Chrome JavaScript运行时建立的一个平台 Node.js是一个事件驱动I ...

  9. 分享常用的GoLang包工具

    包名 链接地址 备注 Machinery异步队列 https://github.com/RichardKnop/machinery Mqtt通信 github.com/eclipse/paho.mqt ...

  10. LeetCode第70题:爬楼梯

    问题描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解 ...