页面发送后继续Drupal处理

时间:2010-05-22 21:39:33

标签: php drupal

我需要在发送Drupal页面后进行一些额外的处理。

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

我花了很多时间看,但在这方面我找不到任何文件。这是令人惊讶的,因为它肯定是一个普遍的要求。

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

任何指针都非常感谢,tks。

更新:基于Googletorp和Matt的回复,我只是想指出我没有通过这个额外的处理做家务。在没有太多细节的情况下,我有许多页面,其内容基于多个节点。如果其中一个子节点发生更改,则需要立即更新页面,但没有理由更新子节点的用户在发生这种情况时需要等待。

因此,控制流程将是:

更新儿童节点 向用户返回更新的儿童节点视图(这是Drupal通常会终止的地方)
再生父母页面
EXIT

Cron和规则模块都没有我所要求的即时性 - 但感谢您的意见。

5 个答案:

答案 0 :(得分:2)

这是你应该使用http://drupal.org/project/job_queue做的事情,而cron可以完成你需要的任何事情。但是,如果您想快速修复并只想显示页面并继续发生事情,可以使用PHP函数flush()

http://php.net/manual/en/function.flush.php

答案 1 :(得分:1)

对于后台进程,我推荐一个cron,它使用hook_cron内置到drupal API中。

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

您最好的选择可能是设置一个专门执行更新的页面,然后通过popen()通过分叉卷曲过程调用它。例如,

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

答案 2 :(得分:0)

您可以查看规则模块,它可以让您在发生特定事件时运行代码。

答案 3 :(得分:0)

查看hook_exit() - 在主要内容发送到客户端之后(drupal_page_footer()间接发生),从page_set_cache()内调用它。

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

答案 4 :(得分:0)

OP在这里。只是为了与人分享我的解决方案以供将来参考:

我使用了第二个Drupal shell模板here

这从命令行引导Drupal。我修改了一下,所以我可以从CL中指定我自己的函数和args。

然后我使用PHP system()调用与后台运算符(&)一起调用上面的脚本 - 记得重定向输出或&是无关紧要的。

它有点乱,但它完全符合我的需要。