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 抑制警告的直接输出

调用未定义的函数 simplexml_load_file()

XML - simplexml_load_file - foreach

使用 simplexml_load_file() 加载 XML 时的警告