fsockopen函数的应用

demo如下:

//fsockopen()用于打开一个socket网络连接,类似与python中以下代码:
"""
# 初始化socket
client = socket.socket()

# 链接服务端
client.connect(('127.0.0.1', 8000))

# 向服务端发送信息
client.send(b'this is client')

# 接受服务端消息,一次最多1024个字节
recive_msg = client.recv(1024)
"""

$fp = fsockopen("www.baidu.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo '<pre>';
    echo '*****************************************';
    echo "$errstr ($errno)<br />\n";
    echo '*****************************************';
    echo '</pre>';
} else {
    //构建响应给浏览器的http头信息
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: baidu.com\r\n";

    $out .= "name:longqiqi\r\n";
    $out .= "Connection: Close\r\n\r\n";

    fwrite($fp, $out);
    echo '<pre>';
    echo '------------------------------------------------';
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    echo '------------------------------------------------';
    echo '</pre>';
    fclose($fp);
}

else结构体中的$out是构建响应给浏览器的http头信息格式, 不能缺少。

拼接上HTTP头信息后,把fsockopen获取到的网页内容相应给浏览器

 

demo2

$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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值