卷曲通过代理返回没有内容

时间:2011-01-26 09:10:43

标签: php curl

我正在开发一个PHP脚本,它将请求发送到我们学校的服务器,以获取有关不同课程的班级大小的实时信息。当我不使用代理时,脚本运行完全正常,返回一个充满课程编号和可用座位的字符串。但是,我想为学生提供这项服务,我担心如果我提出太多请求,我的IP将被阻止。所以我试图通过代理执行此操作,但没有成功。只要我将CURLOPT_HTTPPROXYTUNNEL和CURLOPT_PROXY字段添加到我的请求中,就不会返回任何内容。由于我没有收到任何类型的错误消息,我甚至不确定如何对此进行故障排除。有谁知道发生了什么,或者至少如何排除故障?

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$proxy = explode(':', $proxy);
curl_setopt($ch, CURLOPT_PROXY, $proxy[0]);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy[1]);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'tempcookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'tempcookie.txt');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER, $ref);
$exec = curl_exec($ch);

echo curl_error($ch);
print_r(curl_getinfo($ch));
echo $exec;

用于测试的代理:75.147.173.215:8080

3 个答案:

答案 0 :(得分:2)

如果必须使用curl代理,我使用以下代码:

$proxy = "127.0.0.1:8080"; // or something like that

if($proxy !== null){

    // no need to specify PROXYPORT again
    curl_setopt($ch, CURLOPT_PROXY, $proxy);

    // to make the request go through as though proxy didn't exist
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);

}

答案 1 :(得分:1)

您可以设置CURLOPT_STDERR和CURLOPT_VERBOSE curl options以将错误保存在文件中。此外,您可以使用curl_error()功能。 BTW,默认情况下,curl应该显示STDERR中的所有错误。

此外,对于一般检查,您只需在浏览器配置属性中指定所选代理,尝试在浏览器中打开特定服务,并查看是否返回正确的响应。

<强>更新

CURLOPT_HTTPPROXYTUNNEL用于在请求代理服务器时进行curl调用CONNECT HTTP方法(有关详细信息,请参阅here)。我没有这个选项就测试了代码 - 它运行成功。

我使用的代码:

$proxy = "75.147.173.215:8080";
$proxy = explode(':', $proxy);
$url = "http://google.com";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy[0]);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxy[1]);
curl_setopt($ch, CURLOPT_HEADER, 1);

$exec = curl_exec($ch);

echo curl_error($ch);
print_r(curl_getinfo($ch));
echo $exec;

答案 2 :(得分:1)

这是一个经过良好测试的功能,我用于我的项目,带有详细的自我解释性评论


有很多次80以外的端口被服务器防火墙阻止,所以代码似乎在localhost上工作正常,但在服务器上没有,尝试使用端口80代理

function get_page($url){

global $proxy;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_HEADER, 0); // return headers 0 no 1 yes
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return page 1:yes
curl_setopt($ch, CURLOPT_TIMEOUT, 200); // http request timeout 20 seconds
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Follow redirects, need this if the url changes
curl_setopt($ch, CURLOPT_MAXREDIRS, 2); //if http server gives redirection responce
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); // cookies storage / here the changes have been made
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // false for https
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); // the page encoding

$data = curl_exec($ch); // execute the http request
curl_close($ch); // close the connection
return $data;
}