simplexml_load_file 通过 url 读取远程 xml,由对等方重置连接
Posted
技术标签:
【中文标题】simplexml_load_file 通过 url 读取远程 xml,由对等方重置连接【英文标题】:simplexml_load_file to read remote xml via url, connection reset by peer 【发布时间】:2019-01-23 04:53:52 【问题描述】:当我尝试从以下 url 读取 xml 输出时,通过 godaddy 共享主机中的 cron 作业。
https://www.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery&loginid=MAA00001&format=xml&lickey=a28f0bb8690c75ce3368bb1c76ea98bc&verno=1.3&scan=1&awb=awb&numbers=14539611450
我收到以下错误
警告:simplexml_load_file() [function.simplexml-load-file]: SSL: Connection reset by peer in /Applications/XAMPP/xamppfiles/htdocs/indiagsl/cron/test.php 上线 32
警告:simplexml_load_file() [function.simplexml-load-file]:失败 启用加密 /Applications/XAMPP/xamppfiles/htdocs/indiagsl/cron/test.php 上线 32
警告: simplexml_load_file(https://www.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery&loginid=MAA01849&awb=awb&format=xml&lickey=5eeb55bdce11d065649a32f7e6f6463c&verno=1.3&scan=1&numbers=50545219152) [function.simplexml-load-file]:无法打开流:操作 失败
我的代码如下
$url = "https://www.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery&loginid=MAA00001&format=xml&lickey=a28f0bb8690c75ce3368bb1c76ea98bc&verno=1.3&scan=1&awb=awb&numbers=14539611450";
try
echo $i."-";
$xml = simplexml_load_file($url);
if(false === $xml)
echo "Failed Loading XML";
foreach(libxml_get_errors() as $errors)
echo "\t", $errors->message ."##";
$updateFlag=0;
catch(Exception $e)
echo "ERROR::";
print_r($e);
请帮助我提供您宝贵的意见。 谢谢
【问题讨论】:
将您的链接更改为http
而不是https
使其工作。似乎他们的 ssl 证书设置不正确。另外:我不确定这是否是真实的客户数据,但如果是,您可能希望删除链接,以免全世界都看到它。
谢谢,链接是虚拟的,用于测试目的。但是我已经尝试过了,将 https 更改为 http,它在将其作为 cron 作业运行时并没有修复它。
你确定你在你的 cronjob 中得到的错误是一样的吗?您发布的错误确实指向 SSL 部分。也许你也可以在你的 catch 子句中打印你的$url
以 100% 确定调用的是什么 url。
好的,现在检查。请给我几分钟。
你真的不应该发布一个包含你在 SO 上的服务的登录 ID 和许可证密钥的 URL。
【参考方案1】:
使用curl
添加一个简单的函数来检索文档,并将simple_xml_load_file
更改为simple_xml_load_string
应该可以解决问题。
libxml_use_internal_errors(true); //to get the errors from libxml_get_errors()
$url = "https://www.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery&loginid=MAA00001&format=xml&lickey=a28f0bb8690c75ce3368bb1c76ea98bc&verno=1.3&scan=1&awb=awb&numbers=14539611450";
$i = 2; //to get rid of notice error. remove this line
function getXml($url)
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem"); //absolute path to certificate
//curl_setopt($ch, CURLOPT_CAINFO, "c:/path/to/cacert.pem");
$curl_response = curl_exec($ch);
curl_close($ch);
return $curl_response;
try
echo $i."-";
$xml_file = getXml($url);
$xml = simplexml_load_string($xml_file);
if(false === $xml)
echo "Failed Loading XML";
foreach(libxml_get_errors() as $errors)
echo "\t", $errors->message ."##";
$updateFlag=0;
// else die(print_r($xml));
catch(Exception $e)
echo "ERROR::";
print_r($e);
取消注释else die(print_r($xml));
在下面给出
SimpleXMLElement Object
(
[Shipment] => SimpleXMLElement Object
(
[@attributes] => Array
(
[WaybillNo] => 14539611450
)
[Status] => Incorrect Waybill number or No Information
[StatusType] => NF
)
)
注意 此功能用于回复。在现实世界的场景中,我强烈建议您使用 Guzzle
cacert.pem from curl.haxx.se
【讨论】:
上述代码失败,并显示消息“加载 XML 失败”。关于包含证书的任何建议,可以从浏览器中复制? 你需要证书做什么? 这是一个 SSL 错误,所以认为提供 ssl 证书可以解决问题.. 我已经更新了我的答案以使用证书,但是它应该可以使用或不使用它.. 你的机器一定有问题。它适用于我的机器。不过我会更新详细信息以上是关于simplexml_load_file 通过 url 读取远程 xml,由对等方重置连接的主要内容,如果未能解决你的问题,请参考以下文章
想要使用 cURL 而不是 SimpleXML_load_file()
当我尝试做 simplexml_load_file 时出现 XML 错误
调用未定义的函数 simplexml_load_file()