PHP 脚本不再从上下文流接收数据

我们有一个“遗留”脚本不久前停止工作。很确定这是因为它连接的端点从 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 和代理工作,所以这不是一般的连接问题。


非常感谢收到任何和所有建议!



慕运维8079593
浏览 91回答 1
1回答

紫衣仙女

您可以使用 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 lineforeach ($lines as $line)...
打开App,查看更多内容
随时随地看视频慕课网APP