【问题标题】:How to debug a SOAP call?如何调试 SOAP 调用?
【发布时间】:2017-06-14 14:42:10
【问题描述】:

我正在为 SOAP API 编写集成测试(代码示例如下)。

现在我遇到了一个错误,想调试我的服务器端代码(在 PhpStorm 中)。但调试器只考虑测试中的断点,而忽略服务器端代码。

好的,我大概明白为什么了:$soapClient->doSomething(...); 的调用启动了一个新的 HTTP 请求。 如何调试这个“子请求”(从 PhpUnit 的角度)?


集成测试代码:

class UserIntegrationTest extends TestCaseBase
{
    const URL = "http://my-server.loc/soapapi/user/wsdl";
    public static $classMap = [];
    /** @var SoapClient */
    private $soapClient;


    /** @var ConfigurationServiceInterface */
    private $config;

    public function setUp()
    {
        parent::setUp();

        $options = [
            'exceptions' => true,
            'login' => 'foo',
            'password' => 'pwd',
            'encoding' => 'utf-8',
//            'proxy_host' => '192.168.2.96',
//            'proxy_port' => '8080',
            'classmap' => [],
            'connection_timeout' => 5,
        ];

        $this->soapClient = new SoapClient(self::URL, $options);
    }

    /**
     * @test
     * @group integration
     */
    public function testDoSomething()
    {
        $options = array(
            'exceptions' => true,
            'login' => 'foo',
            'password' => 'pwd',
            'encoding' => 'utf-8',
//            'proxy_host' => '192.168.2.96',
//            'proxy_port' => '8080',
            'classmap' => [],
            'connection_timeout' => 5,
        );

        $soapClient = new SoapClient(self::URL, $options);

        $message = new MyMessage();
        $message->x = 1;
        $message->y = 2;
        $result = $soapClient->doSomething($message);
    }

    protected function getDataSet()
    {
        return new ArrayDataSet([
            'users' => [
                [
                    'id' => 1,
                    'username' => 'foo',
                    'password' => '...',
                ],
            ],
            ...
        ]);
    }
}

【问题讨论】:

    标签: php debugging soap phpstorm xdebug


    【解决方案1】:

    解决方案是将?XDEBUG_SESSION_START=ECLIPSE_DBGP 附加到SOAP 客户端调用的URI。所以在 WSDL 的 port 段中

    <port name="UserPort" binding="tns:UserBinding">
        <soap:address location="http://my-server.loc/soapapi/user"/>
    </port>
    

    该位置需要通过 Xdebug 查询进行扩展,如下所示:

    http://my-server.loc/soapapi/user?XDEBUG_SESSION_START=ECLIPSE_DBGP
    

    当然,生产 WSDL 不应该包含这样的location。但是 WSDL 通常是生成的(例如由Zend\Soap\AutoDiscover),并且 URI 可以很容易地动态配置。

    【讨论】:

    • ... 或者只是在 php.ini 中配置 xdebug.remote_autostart = 1 -- xdebug 将尝试调试每个请求,而不管“调试我”参数/cookie。缺点——影响所有请求,而不仅仅是 SOAP。
    • 我不想改变 Xdebug 的行为。但是对于没有问题的人来说,当然,它也可以工作,甚至是一个更好/更简单的解决方案。
    【解决方案2】:

    您可以通过在客户端应用程序中设置 XDEBUG_SESSION cookie 来做到这一点。

    我相信这比accepted answer 更好,因为它不需要更改服务器端代码 (WSDL)。

    例如,根据 OP 的代码示例使用 PHP SoapClient

    $soapClient = new SoapClient(self::URL, $options);
    $soapClient->__setCookie('XDEBUG_SESSION', 'PHPSTORM');
    

    然后在 PhpStorm 中,开始监听 PHP 调试连接并运行您的测试脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      相关资源
      最近更新 更多