0

我有一个每小时运行一次的 cron 作业来检索添加到我的 Magento 商店的产品。

令人讨厌的是,它已经停止工作,而且很难调试。

当它尝试运行时,我收到以下错误:

  [SoapFault]
  looks like we got no XML document

在做了一些研究之后,看起来被返回的 xml 可能包含错误,因此无效,因此出现错误。

有没有办法查看返回的xml?

代码没有改变,这让我怀疑它可能是 magento 中的设置已被另一个用户更改。

cron 作业建立在 Symfony 2 平台上。

这是我的代码:

private $client;
private $session;

private $api = 'https://www.mywebsite.co.uk/api/?wsdl';
private $user = 'xxx';
private $pass = 'xxx';

$output->writeln('Updating shop product...');

$this->client = new \SoapClient($this->api);
$this->session = $this->client->login($this->user, $this->pass);

$products = $this->client->call($this->session, 'catalog_product.list');
4

2 回答 2

1

使用Fiddler (Windows) 或Charles (cross-platform) 等调试代理来调试/监控传出请求和传入响应。

如果代理正在运行,假设127.0.0.1:8080您可以通过选项数组告诉肥皂客户端使用代理:

private $options = array(
    'proxy_host'   => '127.0.0.1',
    'proxy_port'   => '8080',
    'cache_wsdl'   => WSDL_CACHE_NONE,   // try disabling the wsdl cache for debugging
    'soap_version' => SOAP_1_1,          // check the soap version
    'user_agent'   => 'Batman incoming v2.0',
    // ... more options
);

$this->client = new \SoapClient($this->api, $this->options);

现在 SOAPClient 将通过代理发送请求,您可以看到传入/传出的 xml(或非 xml,呵呵)。

于 2013-07-11T14:58:50.870 回答
1

扩展soap 客户端类使我能够准确地看到返回的内容。

class SoapClientNG extends \SoapClient{

    public function __doRequest($req, $location, $action, $version = SOAP_1_1, $one_way = 0){

        $xml = explode("\r\n", parent::__doRequest($req, $location, $action, $version));


        $response = preg_replace( '/^(\x00\x00\xFE\xFF|\xFF\xFE\x00\x00|\xFE\xFF|\xFF\xFE|\xEF\xBB\xBF)/', "", $xml[5] );

        return $response;

    }

}

原来它收到的 xml 包含错误。删除 Magneto 中的产品并重新输入它们可以解决问题。

于 2013-07-12T10:58:03.997 回答