为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕运维8079593 2023-04-23 17:56:20
我们有一个“遗留”脚本不久前停止工作。很确定这是因为它连接的端点从 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)

...


查看完整回答
反对 回复 2023-04-23
  • 1 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信