我们有一个“遗留”脚本不久前停止工作。很确定这是因为它连接的端点从 http 更改为 https,并且旧的 http 地址现在返回 301。除了对 PHP 脚本进行微小的更改之外,我从未做过任何其他事情,所以我在这里有点力不从心。请注意,我们的 PHP 版本是旧版本 - 5.3.0。这很可能是问题的一部分。脚本原样(无论如何相关位):$uri = "http://www.imf.org/external/np/fin/data/rms_mth.aspx" ."?SelectDate=$date&reportType=CVSDR&tsvflag=Y";$opts = array('http' => array( 'proxy' => 'tcp://internal.proxy.address:port', 'method' => 'GET', 'request_fulluri' => true) );$ctx = stream_context_create($opts);$lines = file($uri, false, $ctx);foreach ($lines as $line)...这不再返回任何内容。顺便说一下,链接是 IMF 汇率链接,所以它对所有人开放——如果你打开它,你会得到一个包含汇率表的下载。脚本的其余部分基本上解析了我们想要的数据。现在,很确定我们的代理没问题。使用 curl 运行一些测试会得到以下结果:curl --proxy tcp://internal.proxy.address:port -v https://www.imf.org/external/np/fin/data/rms_mth.aspx?SelectDate=05/28/2020&reportType=CVSDR&tsvflag=Y(指定 https)工作得很好。curl --proxy tcp://internal.proxy.address:port -v http://www.imf.org/external/np/fin/data/rms_mth.aspx?SelectDate=05/28/2020&reportType=CVSDR&tsvflag=Y(指定 http)不起作用,并显示 301 错误curl --proxy tcp://internal.proxy.address:port -v -L http://www.imf.org/external/np/fin/data/rms_mth.aspx?SelectDate=05/28/2020&reportType=CVSDR&tsvflag=Y(指定带有跟随重定向的 http)然后工作正常。经过一些谷歌搜索后,我尝试了一些事情。在使用 https 时,我似乎也需要选择“ssl”。所以我做了以下更改$uri = "https://www.imf.org/external/np/fin/data/rms_mth.aspx" ."?SelectDate=$date&reportType=CVSDR&tsvflag=Y";$opts = array('http' => array( 'proxy' => 'tcp://internal.proxy.address:port', 'method' => 'GET', 'request_fulluri' => true), 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'SNI_enabled' => false) );可悲的是,这个SNI_enabled标志是在 5.3.0 之后引入的,所以我认为这没有帮助。http还有一个follow_locationcontext选项,不过是5.3.4引入的,所以也没用。(顺便说一句,我几乎无法控制我们拥有的 PHP 版本,所以虽然我很欣赏更高版本可能会提供更好的解决方案,但恐怕这对我来说用处不大)。基本上,我现在被困住了。这些参数或设置的组合根本不会返回任何数据。我可以看到它通过 curl 和代理工作,所以这不是一般的连接问题。非常感谢收到任何和所有建议!
1 回答
紫衣仙女
TA贡献1839条经验 获得超15个赞
您可以使用 php curl 函数从给定的 url 获取响应。然后你可以使用explode()函数逐行打破响应。
$uri = "https://www.imf.org/external/np/fin/data/rms_mth.aspx"
."?SelectDate=$date&reportType=CVSDR&tsvflag=Y";
$opts = array(
CURLOPT_URL => $uri,
CURLOPT_PROXY => 'tcp://internal.proxy.address:port',
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true
);
$ch = curl_init();
curl_setopt_array($ch, $opts);
$lines = curl_exec($ch);
curl_close($ch);
$lines = explode("\n", $lines); // breaking the whole response string line by line
foreach ($lines as $line)
...
- 1 回答
- 0 关注
- 117 浏览
添加回答
举报
0/150
提交
取消