[记录]curl和fsock在php中使用代理访问网络

大部分的编程语言都提供有网络功能,php提供有

socket_create等相关socket函数;
fsockopen函数;
stream_socket_client函数;
file_get_contents函数;
fopen函数;

另外,还可以安装其他的拓展,比如:curl等

而curl使用代理非常简单,只需要调用curl_setopt 设置需要使用的代理就可以了,如下:

curl_setopt ( $curl, CURLOPT_PROXY, $proxy );( $curl, CURLOPT_PROXY, '127.0.0.1:8087' );

在使用socket加入代理的功能之前,首先了解使用了代理与没有使用代理有什么区别:

我使用firefox+firebug,访问了一下baidu首页,在没有使用代理前,请求头为:

GET / HTTP/1.1
Host: www.baidu.com
...这里省略部分内容...

为了捕获使用了代理后的请求头,我用java的socket简单写了个server端,该server端只是打印出所有请求头内容(这里就不提供了,因为还有其他方式可以达到我们的目标),再用curl并设置代理访问baidu,得到的请求头为:

GET http://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.35.0
Accept: */*
Proxy-Connection: Keep-Alive

对比上面两中的请求头,可以看出,最开始的GET***部分有所不同,在没有使用代理时,只需要提供url中的服务器域名之后的部分,所以是“/”;

如果使用了代理,那么将提供完整的url给代理服务器,这里其实很容易理解。

上面是提供了默认端口的请求,如果是使用了其他端口的http请求,请求头如下:

GET http://www.baidu.com:8989/ HTTP/1.1
Host: www.baidu.com:8989
User-Agent: curl/7.35.0
Accept: */*
Proxy-Connection: Keep-Alive

有上面可知,使用代理的话,需要改变请求头,把完整链接设置上去;另外,就是把原先链接的地址改成代理的地址与端口,下面是代码例子:

假设我要用的代理服务器是:127.0.0.1,端口是:8087;我要访问的是baidu.com首页,那么没有使用代理和使用了代理的代码大致流程应该是:

$website='www.baidu.com';
$webport=80;
$proxyserver='127.0.0.1';
$proxyport=8087;

/************没有使用代理**** 开始********/
$fp=pfsockopen($website,$webport);
//下面写请求头
fputs ( $fp, 'GET / HTTP/1.1\n' );//这里不需要完整的url
fputs ( $fp, 'Host: '.$website.'\n' );
//...这里省略了无关内容
/************没有使用代理****结束********/



/************使用代理**** 开始********/
$fp=pfsockopen($proxyserver, $proxyport);//这里要注意一点,如果是https请求,需要增加ssl://到前面
fputs ( $fp, 'GET http://' . $website . ':'.$webport."/asd?ads=asdf HTTP/1.1\n" );//这里随便构造了个完整的url
fputs ( $fp, 'Host: ' . $website . "\n" );
//...这里省略无关内容
/************使用代理****结束********/

由上,就拥有可以使用代理服务器的功能了。

 

注意: 对于fopen、file_get_contents可以使用stream_context_create设置请求头;

» 本文链接地址:https://www.xidige.com/792

打开支付宝扫一扫,即可进行扫码打赏哦

扫码支持
扫码打赏,你说多少就多少

标签:

分享到:

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:
评论区0人评论417人参与

电子邮件地址不会被公开。 必填项已用*标注

*

loading

赞助商广告