使用file_get_contents指定出口IP和端口

如果我们的机器有多个IP,可能是多个网卡,也可能是一个网卡绑定多个IP,那么我们使用file_get_contents获取网页内容的时候就可以指定使用某个IP和端口作为出口,让对方网站获取我们的IP时候可以做到我们预想的结果。

首先来准备一个显示IP和端口的页面:

getip.php
<?php
echo $_SERVER['REMOTE_ADDR'].':'.$_SERVER['REMOTE_PORT'];

假定我们现在有2个IP,一个127.0.0.1,一个192.168.1.2

<?php
$opts1 = array(
    'socket' => array(
        'bindto' =>'127.0.0.1:0'
    )
);
$opts2 = array(
    'socket' => array(
        'bindto' =>'192.168.1.2:0'
    )
);
$opts3 = array(
    'socket' => array(
        'bindto' =>'0:8888'
    )
);
$opts4 = array(
    'socket' => array(
        'bindto' =>'127.0.0.1:8888'
    )
);

$url = 'http://192.168.1.2/getip.php';

$context1 = stream_context_create($opts1);
$context2 = stream_context_create($opts2);
$context3 = stream_context_create($opts3);
$context4 = stream_context_create($opts4);

echo file_get_contents($url, false, $context1)."\r\n";
echo file_get_contents($url, false, $context2)."\r\n";
echo file_get_contents($url, false, $context3)."\r\n";
echo file_get_contents($url, false, $context4)."\r\n";

上面代码运行结果为:

127.0.0.1:54873
192.168.1.2:54874
192.168.1.2:8888
127.0.0.1:8888