如何调试SOAP调用?

时间:2017-06-14 14:42:10

标签: php debugging soap phpstorm xdebug

我正在编写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' => '...',
                ],
            ],
            ...
        ]);
    }
}

2 个答案:

答案 0 :(得分:0)

解决方案是将?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。

答案 1 :(得分:0)

您可以通过在客户端应用程序中设置XDEBUG_SESSION cookie来完成此操作。

我认为这是比accepted answer更好的选择,因为它不需要更改服务器端代码(WSDL)。

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

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

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