【发布时间】:2011-04-30 00:58:33
【问题描述】:
我将重定向代码放在下面有引导代码的页面顶部。重定向会产生一个不同的进程,使重定向页面进程成为后台进程,还是完全杀死当前进程?
我正在使用 header() 进行重定向,但令人惊讶的是,header() 下面需要数据库连接的剩余代码也被执行了。这让我很好奇。
【问题讨论】:
标签: linux drupal drupal-6 process operating-system
我将重定向代码放在下面有引导代码的页面顶部。重定向会产生一个不同的进程,使重定向页面进程成为后台进程,还是完全杀死当前进程?
我正在使用 header() 进行重定向,但令人惊讶的是,header() 下面需要数据库连接的剩余代码也被执行了。这让我很好奇。
【问题讨论】:
标签: linux drupal drupal-6 process operating-system
首先,你永远不应该这样打电话给header(),除非你非常确定 Drupal 助手不合适(在我 10 多年的 Drupal 开发中,我从未遇到过这种情况)
header()不会在 Drupal 中调用 shutdown 和其他关闭函数,从而可能导致会话中断、错误统计和模块损坏(取决于调用的关闭)。在这种情况下,套接字和其他低级资源没有关闭的事实,甚至可能在某些时候使您的 apache 服务器(或其他服务器)崩溃。
如果您想设置标题,请致电drupal_set_header()。十分之九的时候你想要一个重定向头,在这种情况下你最好调用drupal_goto(),它会完成所有的关闭,甚至支持要遵循的目标参数。
在 drupal_goto 上,所有进程都被杀死(参见底部的exit()),因此不会保留正在运行的进程。 module_invoke_all('exit') 将确保所有模块轮流关闭其套接字、连接等等。
【讨论】:
据我了解,一个进程同时处理原始请求和重定向请求。一旦原始请求完成,就会处理重定向请求。
由于 URL 重定向技术有很多,除非您让我们知道您正在使用的特定 URL 重定向技术,否则我们无法确定。
【讨论】:
据我所知,如果您直接从 apache htaccess 文件重定向,则不会创建新进程。如果使用 header() 函数,它会向 apache 服务器发送响应,并且 apache 会重定向页面。在这两种情况下,都没有创建新进程;但后者在重定向之前运行 php 脚本(成本更高?)。
【讨论】: