Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中调试webservice的最佳方法?_Php_Debugging_Phped - Fatal编程技术网

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

在php中调试webservice的最佳方法?,php,debugging,phped,Php,Debugging,Phped,我有一个n层系统,其中前端模板层调用后端应用程序服务器。例如,我需要检索一些搜索结果,前端调用后端以获取结果 模板引擎和appserver都是用PHP编写的。我目前使用PHPed启动模板引擎的调试会话,但是,当http请求发送到远程服务时,我的调试器只是坐在那里等待IO完成 我想做的是模拟HTTP调用,但实际上只是停留在我的PHP进程中,将环境推到某种堆栈上,然后让我的appserver环境加载并处理调用。调用完成后,我执行一个env pop,并在var中获得http调用的结果(例如,通过输出缓

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

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


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

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

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


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

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

    debugBreak(); 
在你所谓的例行程序的入口点?(假设两个进程在同一台机器上运行)


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

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

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

不幸的是,你的问题并不清楚你想达到什么目的,所以这些只是猜测。您可能应该更清楚地说明您正试图解决的问题

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


希望这会有所帮助。

我可以假设您所说的是PHP中缺少线程,因此该服务会停止程序流并停止调试器吗?有很多方法可以解决这个问题,但它们很难,很麻烦,而且很老练

例如,如果您对HTTP通信使用Zend这样的框架,您可以攻击HTTP类,使用原始套接字来进行服务读/写,而不是使用内置的东西,并创建一个小型任务切换器(loop:)来跟踪正在发生的事情


你当然可以用fopenhttp://...)和fread在循环中分块运行,这也可以做到,但您需要启用流中的http:支持。

我对PHP调试了解不多,我也不确定是否遵循“将环境推送到某种堆栈上”的方法,但我想知道netcat+一些shell脚本是否有助于故障排除

您可以使用netcat来:

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

您可以使用它在一端删除一个假的Web服务:

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

echo“这不是开源的,但请检查。它作为代理工作,是迄今为止我见过的最好的调试代理。它在linux、os/x和windows上工作

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

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


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

好主意……至少在PHPed中,调试引擎会传递一个调试ID,以便调用的进程可以“呼叫总部”“到IDE。我将看看是否能找到一种方法在第二次调用时传递debugID,也许我能让调试程序触发一个新的会话。