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

fsockopen 的功能很强大,比如前面模拟 HTTP 访问,模拟 POST/GET 请求,什么的,这里再举一个例子,那就是下载东西。比如下载 http://www.nowamagic.net//librarys/webapp/Snow.zip 这个文件,用下面的程序就能实现:

# Socket 模拟HTTP协议传输文件
# Http是应用层协议使用端口80
#
$hostname = 'www.nowamagic.net';
$port = '80';
# 建立连接
$fp = fsockopen($hostname,$port,$errno,$errstr);
//set_socket_blocking($fp,false);
//stream_set_blocking($fp,0);
stream_set_blocking($fp, true); 
if(!$fp)
{
    echo "$errno : $errstr<br/>";
}
else
{
    # 发送一个HTTP请求信息头
    $request_header="GET /librarys/webapp/Snow.zip HTTP/1.1\n";
    # 起始行
    # 头域
    $request_header.="Host: $hostname\n";
    # 再一个回车换行表示头信息结束
    $request_header.="\n";

    # 发送请求到服务器
    fputs($fp,$request_header);
    # 接受响应
    $fp2=fopen('Snow.zip','w');
    while (!feof($fp))
    {
        $line = fputs($fp2,fgets($fp,128));
        //echo $line;
    }
    # 关闭
    fclose($fp2);
    fclose($fp);
}

执行程序,你会发现在这个程序文件的同级目录就会出现那个你需要下载的文件了。

这实质上是 Socket 模拟 HTTP 协议传输文件。同时还要注意一下 PHP 的超时限制,这里设置我 PHP 服务器超时为无限才能正确下载,否则可能下载不全 PHP 程序就停止了。

同时,set_socket_blocking 和 stream_set_blocking 的用法也要稍微注意下,Google一下就能了解,这里不再赘述。

posted @ 2017-06-01 08:57  壁虎漫步.  阅读(369)  评论(0编辑  收藏  举报