2014-11-02 85 views
2

我已经在PHP中完成了一些项目,但我仍然远没有成为专家。我现在正在尝试调试其他人编写的应用程序。PHP难以理解的控制流程

在代码中有一点我不能理解,而且我没有想法。这里是一些背景信息。

代码应该检索PDF文件并使用 内部div中显示的PDF文件来呈现页面。对于某些文件这可以工作。对于其他文档,将PDF文件发送到客户端(浏览器下载对话框打开)并且不显示页面。

我已经添加了很多fwrite以在页面呈现时将某些操作记录到日志文件中。令我惊讶的是,我有以下情况:

fwrite($fh, "HERE3\n"); 

$templateMgr =& TemplateManager::getManager(); 

fwrite($fh, "HERE4\n"); 

页面时正确地呈现,两条线(“HERE3”和“HERE4”)被记录。 当页面完全不呈现并且PDF文件被发送下载时,仅记录“HERE3”。

令我百思不解的是如何也可能会发生:没有如果两个日志行之间的回报!对于没有记录第二行的代码,我唯一的解释是它在记录“HERE3”后崩溃。但后来,我希望两者中任选一种:

  1. 代码记录两条线,并持续到年底,并呈现页面(OK),或
  2. 的代码只记录的第一行,然后死机不生产任何输出。相反,该程序会向客户端发送一个PDF文件。

我也记录了getManager()的调用,并且它没有崩溃地返回。

所以,我的问题是,这个代码如何在函数调用后中断执行,然后产生有意义的输出?

+0

如果不知道getManager是干什么的,就不能给出答案。 – 2014-11-02 21:30:18

+0

@WvanRij:但是子程序是否可以跳过脚本的其余部分并仍然产生响应?无论如何,getManager()首先会尝试从注册表中检索一个对象,如果它找不到它,它会创建一个新对象。构造函数非常复杂,我仍然试图理解它。但是,一个子程序如何跳过脚本的其余部分并仍然产生输出? – Giorgio 2014-11-02 21:33:27

+0

@Giorgio php脚本中的任何地方都可以调用'die;'或'exit;'并且执行将在那一刻停止。 – 2014-11-02 21:42:45

回答

2

Template::getManager背后的代码是什么? 您的代码中某处可能有exit;

在发送http下载输出与header()之后调用exit;是一种常见用法,它知道此功能不会停止脚本,但它具有重定向行为。通常你不需要执行其余的部分。所以一定要检查退出功能;)

+0

谢谢,这似乎是一个合理的事情,寻找。我真的没有触及PHP多年。 – Giorgio 2014-11-02 21:43:26

+0

它比简单的退出()更复杂,但你给了我正确的提示。 +1并被接受。 – Giorgio 2014-11-02 22:11:40

+0

经过更多调试后,我发现在'HERE3'执行之前头部已经发送。然后'getManager()'检测到这个(或者一些等价的条件),并决定退出。我还没有找到确切的点,但是这让我通过查看发送头文件的代码来追溯错误的根源。 – Giorgio 2014-11-03 08:25:43