在发送页面后继续Drupal处理
在发送Drupal页面之后,我需要做一些额外的处理。在发送页面后继续Drupal处理
我知道我可以触发后台shell命令,但我需要维护当前的Drupal执行上下文。
我花了很多时间寻找,但在这方面我找不到任何文档。这是令人惊讶的,因为它肯定是一个共同的要求。
我唯一真正想到的是通过shell命令(exec等)激活Drupal并为其提供一个将调用继续处理的伪路径。但这看起来不必要的复杂/浪费。
任何指针非常感谢,tks。
更新:基于Googletorp和马特的回复,我只想指出,我没有做这个额外的处理家务。没有太多细节,我有许多页面,其内容基于多个节点。如果其中一个子节点发生变化,那么该页面需要立即更新,但没有理由更新子节点的用户在发生这种情况时需要等待。
因此,控制流程将是:
UPDATE子节点
RETURN UPDATED子节点VIEW TO USER(这是哪里的Drupal通常会终止)
REGENERATE父页
EXIT
Cron和rules模块都没有我需要的直接性 - 但是感谢您的意见。
对于后台进程,我推荐使用hook_cron构建到drupal API中的cron。
您的更新表明您需要立即执行。因此您需要分叉或异步进程。一种选择是pcntl_fork(),但是我遇到了问题,因为(至少使用mod_php)你并不想分叉web服务器进程。
您最好的选择是设置一个页面来专门执行更新,然后通过popen()通过分叉curl过程调用它。例如,
popen('curl http://localhost/update_parent_nodes &');
您可以查看规则模块,该模块允许您在发生某些事件时运行代码。
感谢googletorp,我更新了更详细的问题 – 2010-05-23 09:32:47
看看hook_exit()
- 在主内容发送给客户端(通过page_set_cache()
调用间接发生)之后,它将从drupal_page_footer()
内部调用。
要知道,它通常会不调用对JavaScript/AHAH回调,那些终止在大多数情况下,处理自己前面,但你描述的场景,应该是正确的方式去。
感谢Henrik,看起来很有希望... – 2010-05-23 11:50:40
我做了一些快速测试,不幸的是页面等待hook_exit终止。没关系,那简直太简单了! – 2010-05-23 12:03:13
这是你应该正在使用http://drupal.org/project/job_queue和cron完成任何你需要的东西。但是,如果你想速战速决,只是想在页面出现,事情持续下去。你可以使用PHP函数flush()
谢谢。我之前遇到过flush()问题,所以我想避开那条路线。另外,我认为给cron添加一项工作然后立即调用cron似乎很不雅观。看起来我会用我最初的想法启动一个后台shell脚本,它从命令行调用一个新的Drupal实例。 – 2010-05-23 17:04:44
对于Drupal作业队列模块+1。 – 2010-11-23 23:48:08
OP这里。只是分享我的人以供将来参考的解决方案:
我用概括here
第二Drupal的壳模板此命令行自举的Drupal。我修改了一下,所以我可以指定我自己的函数和来自CL的参数。
然后,我使用PHP系统()调用与后台运算符(&)一起调用上述脚本 - 请记住重定向输出或&是无关紧要的。
这有点乱,但它确实是我需要的。
谢谢马特,我更新了更详细的问题 – 2010-05-23 09:32:24
根据您的更新更新了我的答案。 – 2010-05-23 18:13:08
尼斯更新马特。这与我解决它的方式非常相似(见下文),区别在于我使用了CLI路由而不是创建新的http请求。干杯。 – 2010-05-23 19:32:46