5

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

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

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

4

7 回答 7

2

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

您应该能够在模板引擎调试会话中跟踪来自应用服务器的输出。

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

于 2009-04-15T12:13:30.530 回答
2

这是令人尴尬的粗略,并且完全没有任何关于调试器如何工作的研究,但是您是否尝试过添加

    debugBreak(); 

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

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

于 2009-04-21T10:07:57.690 回答
1

为什么不使用 HTTP 嗅探器?类似 tcpflow 的东西。

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

不幸的是,您的问题尚不清楚您要达到的目标,因此这些只是猜测。您可能应该更清楚地说明您要解决的问题。

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

希望有帮助。

于 2009-04-22T00:03:24.263 回答
1

我可以假设您在谈论 PHP 中缺少线程,因此该服务会停止您的程序流并停止调试器吗?有一些方法可以解决它,但它们很难,笨重和hackish。

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

您当然可以使用 fopen ( 'http://...' ) 并在循环中分块 fread ,这可以解决问题,但您需要打开流中的 http: 支持。

于 2009-04-23T13:27:07.957 回答
1

我对 PHP调试了解不多,而且我不确定我是否遵循“将环境推送到某种堆栈”,但我想知道 netcat + 一些 shell 脚本是否可以用于故障排除

您可以使用 netcat 来:

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

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

您可以使用它在一端存根伪造的 Web 服务:

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

...您当然可以使用它在端口上侦听以非常清楚地查看传入 Web 服务的请求是什么样的。

您可以使用带有 netcat 作为中间人的 shell 脚本,它就像您的 web 服务一样,立即返回一些通用的东西以使您的 PHP 快乐,然后将请求传递给您的实际应用服务器并记录结果?

超级简单。

netcat 网络服务器 http://img240.imageshack.us/img240/791/netcat.jpg

于 2009-04-24T16:56:52.660 回答
1

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

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

于 2009-04-25T16:09:06.277 回答
0

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

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

于 2013-04-04T06:59:36.710 回答