【问题标题】:Magento Soap Error - Premature end of data in tag definitions line 2Magento Soap 错误 - 标签定义第 2 行中的数据过早结束
【发布时间】:2012-08-30 14:39:02
【问题描述】:

我的客户正在使用 Unleashedsoftware.com 连接到 Magento 商店。但它给出了这个错误。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>WSDL</faultcode>
            <faultstring>
                SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.domain.com/index.php/api/v2_soap/index/wsdl/1/' : Premature end of data in tag definitions line 2
            </faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

浏览http://www.domain.com/index.php/api/v2_soap/index/ 时,Firebug 给我“500 内部服务错误”。

当我浏览 http://www.domain.com/index.php/api/v2_soap/index/wsdl/1/ 时,我得到了有效的 XML 数据。

我检查了服务器日志文件,它看起来像:

[Thu Aug 30 22:22:25 2012] [warn] [client 92.92.92.92] mod_fcgid: stderr:  in /home/doaminuser/public_html/lib/Zend/Soap/Server.php on line 762

我现在已经搜索了几天,今天我试图将整个站点复制到另一个测试服务器,它似乎正在工作!所以这似乎是一个服务器问题。

请问,有人知道可能是什么问题吗?

有没有更好的方法来调试这个问题,任何示例代码或调试技巧。

Magento 版本是 1.6.2

谢谢。

【问题讨论】:

  • 你解决了这个问题吗?
  • 正如@AlanStorm 指出的那样,“这可能是某种服务器配置问题”。所以我不得不转向专用服务器。 “curl”命令表明,请求没有完成。所以我认为服务器无法处理这样的请求。我知道这不是一个解决方案。如果您发现任何内容,请发布任何更新。

标签: api magento soap wsdl


【解决方案1】:

很多时候 Magento 的 SOAP API 由于您的 Magento 服务器与自身通信的问题而失败。

也就是说,PHP 的 SOAP 实现要求 SOAP 服务器本身通过 http 获取 WSDL 文件,并且本地网络配置问题阻碍了 Magento 获取它自己的 WSDL。

您可以通过 SSH 连接到您的 Magento 服务器并运行以下命令来调试它

curl -l 'http://www.example.com/index.php/api/v2_soap/index/wsdl/1/' > /tmp/wsdl.xml

然后检查wsdl.xml 文件。因为您是从网络服务器执行此操作,所以您可能会得到与从本地浏览器执行此操作不同的结果。

【讨论】:

  • 我对此有记忆。对我有用的是将主机名放在服务器上的 /etc/hosts 加上 www 别名在 127.0.0.1 但是,在这种情况下,服务器位于建筑物中而不是某些 ISP 位置,并且 LAN 上有 Windows 计算机. Windows 用户下载了大量的木马病毒色情内容,这些内容一直在向网络发送垃圾邮件,因此真正的问题在于网络上的 Windows 计算机,而不是服务器或 Magento。在 fdisking PC 之后,问题就解决了。
  • 谢谢艾伦。该站点托管在共享服务器上,未启用外壳访问。只是等待主机为我启用它。一旦我尝试了这些步骤,我会更新你。千万不要这样想!
  • @ewebs 如果你知道 PHP 的 curl 函数,你可以通过上传一个 PHP 文件和等效的 curl 命令来做到这一点。
  • @AlanStorm 我不喜欢执行建议的命令。我尝试使用已禁用的 shell_exec。我绑了类似的东西bit.ly/PSH9mp。似乎没有完全检索到 xml。请查看源代码。这是我使用的代码: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "domain.com/index.php/api/v2_soap/index/wsdl/1/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); print('
    ' . print_r($output ,true) .'
    ' );
  • 这个答案帮助我意识到我的网站处于维护模式。因为我将我的 IP 列入白名单,所以我什至没有意识到这一点,这是导致 API 失败的主要原因。谢谢!
【解决方案2】:

我在调用 URL 时遇到了类似的问题 http://www.store.com/index.php/api/v2_soap/?wsdl
一段时间后,我在 apache 错误日志中收到了消息 500 - Internal Server ErrorPremature end of script headers 消息。
经过一整天的研究,我发现 Apache 模块的 Timeout-Directive(在 Linux 环境的 httpd.conf 中配置)设置为“20”,导致服务器在 20 秒后发送 500 错误.问题是,在我的情况下,Magento 系统需要更长的时间来“抓取”所有 wsdl.xml 文件以构建 WSDL 输出(如果您使用的是 Magento SOAPv2)。 也许你应该检查你的超时指令..希望有帮助。

【讨论】:

  • 我试图这样做,但我的是共享主机。只有有限的权限!所以我在等他们更新httpd.conf。有什么办法可以为我们的本地环境更新它,有什么想法吗?感谢您的指导。
【解决方案3】:

“我对此有记忆。对我有用的是把主机名 在服务器上的 /etc/hosts 加上 127.0.0.1 上的 www 别名但是, 在这种情况下,服务器在建筑物中,而不是在某些 ISP 地点和 LAN 上有 Windows 计算机。 Windows 用户有 下载了大量的木马病毒色情内容 一直在向网络发送垃圾邮件,所以真正的问题在于 网络上的 Windows 计算机,而不是服务器或 Magento。 fdisking PC 后,问题就解决了。”

谢谢我在 magento 1.6 和 Windows Server 2008 上为此苦苦挣扎了 2 天,将此行添加到主机文件 (C:\Windows\System32\drivers\etc) 为我解决了这个问题:

127.0.0.1   www.Domain.com

还记得修复您的 magento soap(角色),因为角色资源不会保存在 1.6 中,除非您修复此文件:

MagentoRoot\app\code\core\Mage\Adminhtml\Block\Api\Tab\Rolesedit.php

替换这个:

if (array_key_exists(strtolower($item->getResource_id()), $resources) && $item->getPermission() == 'allow') {

用这个:

if (array_key_exists(strtolower($item->getResource_id()), $resources) && $item->getApiPermission() == 'allow') {

【讨论】:

    【解决方案4】:

    在我的情况下,问题是启用了 Mod_Security 规则“PHP Easter Egg Access”。 规则 ID:380800

    一旦禁用,api 访问就会起作用。

    Apache 日志文件中有一个指标:

    Jun 19 09:15:52 httpd[1024961]: [error] [client xyz.xyz.xyz.xyz] ModSecurity: [file "/usr/local/apache/conf/modsec/99_asl_jitp.conf"] [line "116"] [id "380800"] [rev "1"] [msg "Atomicorp.com WAF Rules - Virtual Just In Time Patch: PHP Easter Egg Access"] [data "phpe9568f35-d428-11d2-a769-00aa001acf42"] [severity "CRITICAL"] Access denied with code 403 (phase 2). Pattern match "php(?:e9568f3[56]-d428-11d2-a769-00aa001acf42|b8b5f2a0-3c92-11d3-a3a9-4c7b08c10000)" at REQUEST_URI. [hostname "www.yoursever.com"]...
    

    Magento 版本:1.7.0.2
    PHP版本:5.3.26

    有关 PHP 复活节彩蛋访问规则的更多信息: http://www.atomicorp.com/forums/viewtopic.php?f=3&t=5057
    http://www.0php.com/php_easter_egg.php

    对于那些想要快速测试脚本来复制问题的人(在试图说服您的托管服务提供商认为这是他们的问题时很有用),请使用:

    <?php
       $server = new SoapServer("http://<url to your magento shop>/index.php/api/v2_soap/index/wsdl/1/");
    ?>
    

    这是 /lib/Zend/Soap/Server.php 中触发错误的行。

    在我的情况下,如果您浏览到:
    http:///index.php/api/v2_soap/index/wsdl/1/
    xml很好,但是如果你在服务器上运行上面的php脚本,就会报错。

    【讨论】:

      【解决方案5】:

      这个错误最常出现在我身上,而忽略了 Magento SOAP url 中给出的域的 www。 Url 必须与 Magento 配置中指定的基本 url 匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        • 2011-08-31
        • 1970-01-01
        • 2017-10-05
        • 2012-04-01
        • 2011-09-11
        • 1970-01-01
        相关资源
        最近更新 更多