在php中调试被调用的webservice的最佳方法?

时间:2009-04-14 04:42:06

标签: php debugging phped

我有一个n层系统,其中前端模板层调用后端应用程序服务器。例如,我需要检索一些搜索结果,前端调用后端来获取结果。

模板引擎和appserver都是用PHP编写的。我目前使用PHPed来启动模板引擎的调试会话,但是,当http请求发送到远程服务时,我的调试器只是坐着等待IO完成。

我想要做的是模拟HTTP调用,但实际上只是留在我的PHP进程中,将环境大量推送到某种堆栈,然后让我的appserver环境加载并处理调用。调用完成后,我执行一个env pop,并在var中获取http调用的结果(例如,通过输出缓冲区)。我可以在同一台服务器上运行这两项服务。有没有人有任何想法或图书馆已经这样做了?

7 个答案:

答案 0 :(得分:2)

你能不运行调试器并在appserver中设置断点?两个不同的调试会话 - 一个用于捕获模板引擎调用,另一个用于在调用服务器中捕获调用。

您应该能够在模板引擎调试会话中跟踪appserver的输出。

如果无法运行两个调试会话,则通过捕获模板引擎的输出并使用测试应用程序服务器输入的单个调试器为appserver创建一些测试输入。

答案 1 :(得分:2)

这是一个令人尴尬的粗糙,并且没有任何关于调试器如何工作的研究,但你尝试过添加

    debugBreak(); 

在你的被叫例程的入口点? (假设两个进程在同一台机器上运行)。

我已经使用这种技术打破了通过AMFPHP调用的过程。我有一个PHP文件将Flash文件加载到浏览器中,然后使用AMFPHP回调到PHP,所有这些都在同一台服务器上。当我点击debugBreak()行时,PhpED重新获得控制权。

答案 2 :(得分:1)

为什么不使用HTTP嗅探器?像tcpflow这样的东西。

或者,您可以将完整的XML记录到每个请求的文件中。响应。

不幸的是,你的问题并不清楚你想要实现什么,所以这些只是猜测。您应该更清楚地说明您要解决的问题。

您可能会重新考虑调用remove服务的代码并使用依赖注入和模拟。这将允许您通过提供“模拟”但有效的数据来隔离前端和后端的开发。

希望有所帮助。

答案 3 :(得分:1)

我可以假设您在谈论PHP中缺少线程,因此该服务会停止程序流并停止调试器吗?有办法解决它,但它们很难,很麻烦和黑客。

例如,如果您使用Zend这样的框架来处理HTTP流量,您可以破解HTTP类使用原始套接字来进行服务读取/写入而不是内置的东西,并创建一个小型任务切换器(循环:)跟踪发生了什么。

你当然可以使用fopen('http:// ...')并在循环中以块的方式进行fread,这可以解决问题,但是你需要在流中打开http:support。

答案 4 :(得分:1)

我对PHP 调试了解不多,我不确定是否遵循“将环境推送到某种堆栈”,但我不知道netcat +是否有一些shell脚本可以在疑难解答中有用吗?

您可以使用netcat:

  • 欺骗HTTP请求
  • 像网络服务器一样(在端口上侦听 - 选择一个端口,任何端口!)

http://www.plenz.com/netcat-tips

您可以使用它在一端存根虚假的网络服务:

echo "<xml .. <node>hello php!</node>" | netcat -lp 80 ... etc

...你当然可以在端口上使用它来非常清楚地看到传入Web服务请求的样子。

你可以使用一个带有netcat的shell脚本作为你的web服务的中间人,立即返回一些通用的东西来让你的PHP开心,然后将请求传递给你的实际appserver并记录结果吗?

超级简单。

netcat webserver http://img240.imageshack.us/img240/791/netcat.jpg

答案 5 :(得分:1)

这不是开源的,但请查看Charles。它作为代理工作,是我见过的最好的调试代理。它适用于linux,os / x和windows。

几乎任何HTTP库都允许您指定代理。

答案 6 :(得分:0)

PhpED支持parallel debug sessions - 这意味着您可以开始调试向初始服务器发出请求的代码,然后是服务器间请求。您所需要的只是在相应的项目中设置断点并在服务器之间传递调试器请求。通常,您可以通过将DBGSESSID(调试器请求)变量的值及其值重新传输到第二个服务器来执行此操作。变量可以在$ _COOKIES和/或$ _GET中找到(取决于你如何开始调试 - 来自IDE或使用调试器工具栏)。要将变量重新传输到辅助服务器,您可以将其添加到POST变量或URL参数或cookie。如果你做不到那个f.e.如果您的服务器从get / post / cookies中过滤掉所有内容,请尝试嵌入DebugBreak()调用。 确保所有服务器都可以通过请求中的IP地址找到IDE,并允许连接回IDE - 例如你在防火墙和LinuxSE中有必要的规则(购买默认这个SE层现在在所有现代Linux中启用)。我花了一天的时间来弄清楚为什么我的服务器无法连接。

如果无法从服务器连接到IDE(如果具有IDE的工作站位于不同的网络中,例如在您的家中),则可以使用ssh tunnels。在这种情况下,IDE地址当然是localhost。