【发布时间】:2011-09-12 10:28:18
【问题描述】:
我使用此代码登录远程服务器。当我不使用代理时,一切工作正常。但使用代理则不会。
代码如下:
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $ref_url);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
curl_setopt($ch, CURLOPT_PROXY, $proxy.':'.$port);
ob_start();
return curl_exec ($ch); // execute the curl command
ob_end_clean();
curl_close ($ch);
unset($ch);
我尝试禁用 CURLOPT_HTTPPROXYTUNNEL 但没有帮助。
所以,没有代理我可以正常登录。 没有代理。 代理广告效果很好。
【问题讨论】:
-
这不会直接解决问题,但是a)因为你设置了
CURLOPT_RETURNTRANSFER,所以输出缓冲是没有意义的,去掉ob_start()/ob_end_clean()调用,b)你正在尝试在return语句之后运行代码 - 这永远不会执行,您需要在变量中捕获返回数据,然后调用curl_close(),然后返回数据。我猜,因为你有一个return调用,这是在一个函数中,所以unset()调用是不必要的 - 当你离开函数的范围时,句柄将被销毁。 -
如果您将
return调用替换为echo- 即curl_exec()的输出是什么?您需要删除输出缓冲才能看到这个... -
这只是我在浏览我登录并抓取一些数据的站点时多次调用的函数。在第一次运行中,我检查代理,然后登录,然后在站点内导航...但是当我不使用代理时一切正常...所以代码很好...但是当使用代理时,然后在登录页面后我得到再次登录页面,就像它不会将帖子数据发送到登录页面一样。