Php 在页面发送后继续Drupal处理

Php 在页面发送后继续Drupal处理,php,drupal,Php,Drupal,在发送Drupal页面之后,我需要做一些额外的处理 我知道我可以启动后台shell命令,但我需要维护当前的Drupal执行上下文 我花了很多时间查找,但找不到这方面的任何文档。这是令人惊讶的,因为这肯定是一个共同的要求 我唯一真正的想法是(再次)通过shell命令(exec等)启动Drupal,并为其提供一个调用继续处理的伪路径。但这似乎是不必要的复杂/浪费 非常感谢您的指点,tks 更新:根据Google Torp和Matt的回复,我只想指出,我并不是在做额外处理的家务活。在不深入太多细节的情

在发送Drupal页面之后,我需要做一些额外的处理

我知道我可以启动后台shell命令,但我需要维护当前的Drupal执行上下文

我花了很多时间查找,但找不到这方面的任何文档。这是令人惊讶的,因为这肯定是一个共同的要求

我唯一真正的想法是(再次)通过shell命令(exec等)启动Drupal,并为其提供一个调用继续处理的伪路径。但这似乎是不必要的复杂/浪费

非常感谢您的指点,tks

更新:根据Google Torp和Matt的回复,我只想指出,我并不是在做额外处理的家务活。在不深入太多细节的情况下,我有许多页面的内容是基于多个节点的。如果这些子节点中的一个发生更改,则需要立即更新页面,但在这种情况下,没有理由让更新子节点的用户等待

因此,控制流应为:

更新子节点
将更新的子节点视图返回给用户(这是Drupal通常终止的位置)
重新生成父页面
退出


Cron和rules模块都没有我所需要的即时性,但是感谢您的输入

对于后台进程,我建议使用cron,它与hook_cron一起内置到drupal API中

您的更新表明您需要立即执行。因此,您需要分叉或异步进程。一个选项是pcntl_fork(),但我遇到了一些问题,因为(至少使用mod_php)您并不真的希望分叉web服务器进程

最好的选择可能是设置一个专门执行更新的页面,然后通过popen()通过forked curl进程调用它。比如说,

popen('curl http://localhost/update_parent_nodes &');

您可以查看规则模块,该模块允许您在发生某些事件时运行代码。

查看-在将主要内容发送到客户端(通过调用间接发生)之后,从内部调用它


请注意,JavaScript/AHAH回调通常不会调用它,因为在大多数情况下,这些回调会提前终止处理,但对于您描述的场景,这应该是正确的方法。

这是您应该使用的方法,而cron可以完成您需要的任何操作。但是,如果您希望快速修复,并且只希望页面显示并且事情继续发生,那么可以使用PHP函数flush()


请点击这里。仅与其他人分享我的解决方案,以供将来参考:

我使用了第二个Drupal shell模板

这将从命令行引导Drupal。我对它做了一些修改,以便可以从CL中指定我自己的函数和参数

然后,我使用PHP system()调用和后台操作符(&)调用了上面的脚本,记住重定向输出,否则&是不相关的


这有点混乱,但它正是我需要的。

谢谢谷歌,我更新了问题的更多细节。我做了一些快速测试,不幸的是页面等待hook_退出终止。没关系,那太容易了!谢谢我以前在使用flush()时遇到过问题,所以我希望避免使用这种方法。此外,我认为在cron中添加一个作业,然后立即调用cron似乎很不雅观。看起来我将继续我最初的想法,启动一个后台shell脚本,从命令行调用一个新的Drupal实例。这与我解决它的方式非常相似(见下文),不同之处在于我使用CLI路由而不是创建新的http请求。干杯