我需要在发送Drupal页面后进行一些额外的处理。
我知道我可以触发后台shell命令,但我需要维护当前的Drupal执行上下文。
我花了很多时间看,但在这方面我找不到任何文件。这是令人惊讶的,因为它肯定是一个普遍的要求。
我唯一真正的想法是通过shell命令(exec等)启动Drupal(再次)并为其提供一个伪路径,该路径将调用继续处理。但这似乎不必要地复杂/浪费。
任何指针都非常感谢,tks。
更新:基于Googletorp和Matt的回复,我只是想指出我没有通过这个额外的处理做家务。在没有太多细节的情况下,我有许多页面,其内容基于多个节点。如果其中一个子节点发生更改,则需要立即更新页面,但没有理由更新子节点的用户在发生这种情况时需要等待。
因此,控制流程将是:
更新儿童节点
向用户返回更新的儿童节点视图(这是Drupal通常会终止的地方)
再生父母页面
EXIT
Cron和规则模块都没有我所要求的即时性 - 但感谢您的意见。
答案 0 :(得分:2)
这是你应该使用http://drupal.org/project/job_queue做的事情,而cron可以完成你需要的任何事情。但是,如果您想快速修复并只想显示页面并继续发生事情,可以使用PHP函数flush()
答案 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()调用与后台运算符(&)一起调用上面的脚本 - 记得重定向输出或&是无关紧要的。
它有点乱,但它完全符合我的需要。