PHP fsockopen函数详解-php教程

资源魔 35 0

PHP fsockopen是一个性能比拟弱小的函数。咱们正在这篇文章中将会对这个函数做一个详细的引见,心愿对各人有所协助。记患上之前的B2C网站就是经过这个函数完成前台以及定单解决零碎的交互。

PHP fsockopen函数阐明:

语法:

resource fsockopen ( string $hostname [, int KaTeX parse error: Expected 'EOF', got '&' at position 20: … = -1 [, int &̲errno [, string &$errstr [, float $timeout = ini_get(“default_socket_timeout”) ]]]] )

开启PHP fsockopen这个函数

PHP fsockopen需求 PHP.ini 中 allow_url_fopen 选项开启。

allow_url_fopen = On

参数:

hostname:假如装置了OpenSSL,那末你兴许应该正在你的主机名地点后面增加拜访协定ssl://或许是tls://,从而能够应用基于TCP/IP协定的SSL或许TLS的客户端衔接到近程主机。

port:端标语。假如对该参数传一个-1,则示意没有应用端口,例如unix://。

errno:假如errno的前往值为0,并且这个函数的前往值为 FALSE ,那末这标明该谬误发作正在套接字衔接(connect())挪用以前,招致衔接失败的缘由最年夜的多是初始化套接字的时分发作了谬误。

errstr:谬误信息将以字符串的信息前往。

timeout:设置衔接的时限,单元为秒。

前往值:

fsockopen() 将前往一个文件句柄,之后能够被其余文件类函数挪用(例如: fgets() , fgetss() , fwrite() , fclose() 另有 feof() )。假如挪用失败,将前往 FALSE 。

php fsockopen应用案例

一、fsockopen 来模仿天生 HTTP 衔接

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

运转后果:

1.jpg

二、PHP fsockopen模仿POST/GET办法

fsockopen除了了像下面实例模仿天生 HTTP 衔接以外,还能完成不少性能,比方模仿post 以及 get 传送数据的办法。
get :

<?php
$url = "http://localhost/test2.php?site=www.tbrer.com";
print_r(parse_url($url));// 解析 URL,前往其组成局部

/* get提交 */
sock_get($url,'user=gonn');

// fsocket模仿get提交
function sock_get($url,$query){
    $data = array(
        'foo' => 'bar',
        'baz' => 'boom',
        'site' => 'www.tbrer.com',
        'name' => 'nowa magic'
    );

    $query_str = http_build_query($data);// http_build_query()函数的作用是应用给出的联系关系(或下标)数组天生一个通过 URL-encode 的申请字符串

    $info = parse_url($url);
    $fp = fsockopen($info["host"],80,$errno,$errstr,30);
    $head = "GET " . $info['path'] . '?' . $query_str . " HTTP/1.0\r\n";
    $head .= "Host: " . $info['host'] . "\r\n";
    $head .= "\r\n";
    $write = fputs($fp,$head);
    while(!feof($fp)){
        $line = fread($fp,4096);
        echo $line;
    }
}
?>

post :

<?php
$url = "http://localhost/test2.php?site=www.tbrer.com";
print_r(parse_url($url));// 解析 URL,前往其组成局部

/* get提交 */
sock_post($url,'user=gonn');

// fsocket模仿get提交
function sock_post($url,$query){
    $info = parse_url($url);
    $fp = fsockopen($info["host"],80,$errno,$errstr,30);
    $head = "POST " . $info['path'] . "?" . $info["query"] . " HTTP/1.0\r\n";
    $head .= "Host: " . $info['host'] . "\r\n";
    $head .= "Referer: http://" . $info['host'] . $info['path'] . "\r\n";
    $head .= "Content-type: application/x-www-form-urlencoded\r\n";
    $head .= "Content-Length: ". strlen(trim($query)) . "\r\n";
    $head .= "\r\n";
    $head  .= trim($query);
    $write = fputs($fp,$head);
    while(!feof($fp)){
        $line = fread($fp,4096);
        echo $line;
    }
}
?>

接纳页面 test2.php 的代码为:

<?php
    $data = $_REQUEST;

    echo '<pre>';
    print_r($data);
    echo '</pre>';
?>

三、fsockopen以Socket形式模仿HTTP下载文件

<?php
    /* 
        *   Socket 模仿HTTP协定传输文件
        *   Http是使用层协定应用80端口
    */
    $hostname = '127.0.0.1';
    $port = '80';

    // 建设衔接
    $fp = fsockopen($hostname,$port,$errno,$errstr);
    stream_set_blocking($fp,true);
    if(!$fp){
        echo "$errno : $errstr<br />";
    }else{
        // 发送一个HTTP申请信息头
        $request_header = "GET /aaa.txt";

        // 肇始行
        // 头域 
        $request_header .= "Host: $hostname\n";
        
        // 再一个回车换行示意头信息完结
        $request_header .= "\n";

        // 发送申请到效劳器
        fputs($fp,$request_header);

        // 承受呼应
        $fp2 = fopen('aaa.txt','w');

        while(!feof($fp)){
            $line = fputs($fp2,fgets($fp,128));
            echo $line;
        }

        // 封闭
        fclose($fp2);
        fclose($fp);
    }
?>

执行顺序,你会发如今这个顺序文件的同级目次就会呈现阿谁你需求下载的文件了。

这本质上是 Socket 模仿HTTP协定传输文件。同时还要留意一下 PHP 的超时限度,这里设置我 PHP 效劳器超时为有限能力正确下载,不然可能下载没有全 PHP 顺序就中止了。

留意:

bool stream_set_blocking ( resource $stream , int $mode )

为 stream 设置梗阻或许梗阻模。

此函数实用于支持非梗阻模式的任何资本流(惯例文件,套接字资本流等)。

参数

stream:资本流。

mode:假如 mode 为0,资本流将会被转换为非梗阻模式;假如是1,资本流将会被转换为梗阻模式。 该参数的设置将会影响到像 fgets() 以及 fread() 这样的函数从资本流里读取数据。 正在非梗阻模式下,挪用 fgets() 老是会立刻前往;而正在梗阻模式下,将会不断比及从资本流外面猎取到数据能力前往。

前往值

胜利时前往 TRUE, 或许正在失败时前往 FALSE。

四、应用 fsockopen 捏造去路

<?php
$host = "127.0.0.1"; //你要拜访的域名
$ip = '127.0.0.1';
$target = "/test2.php"; //你要拜访的页面地点
$referer = "http://www.tbrer.com/"; //捏造去路页面
//$fp = fsockopen($host, 80, $errno, $errstr, 30);
$fp = fsockopen($ip, 80, $errno, $errstr, 30);
if(!$fp)
{
    echo "$errstr($errno)<br />\n";
}
else
{
	$end = "\r\n";
    $out = "GET $target HTTP/1.1$end";
	$out .= "Host: $ip$end";
	$out .= "Referer: $referer$end";
	$out .= "Connection: Close$end";
	$out .= "$end";
    fwrite($fp, $out);
    while(!feof($fp))
    {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}
?>

test2.php 的代码为:

<?php
    $data = $_REQUEST;

    echo '<pre>';
    print_r($data);
    echo '</pre>';
?>

能够看到 HTTP_REFERER 的值为 http://www.tribrer.com/,即去路曾经捏造胜利。

相干保举:

PHP视频教程:https://www.php.cn/course/list/29/type/2.html

以上就是PHP fsockopen函数详解的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!