2010-05-22 63 views
1

在發送Drupal頁面之後,我需要做一些額外的處理。在發送頁面後繼續Drupal處理

我知道我可以觸發後臺shell命令,但我需要維護當前的Drupal執行上下文。

我花了很多時間尋找,但在這方面我找不到任何文檔。這是令人驚訝的,因爲它肯定是一個共同的要求。

我唯一真正想到的是通過shell命令(exec等)激活Drupal併爲其提供一個將調用繼續處理的僞路徑。但這看起來不必要的複雜/浪費。

任何指針非常感謝,tks。

更新:基於Googletorp和馬特的回覆,我只想指出,我沒有做這個額外的處理家務。沒有太多細節,我有許多頁面,其內容基於多個節點。如果其中一個子節點發生變化,那麼該頁面需要立即更新,但沒有理由更新子節點的用戶在發生這種情況時需要等待。

因此,控制流程將是:

UPDATE子節點
RETURN UPDATED子節點VIEW TO USER(這是哪裏的Drupal通常會終止)
REGENERATE父頁
EXIT

Cron和rules模塊都沒有我需要的直接性 - 但是感謝您的意見。

回答

1

對於後臺進程,我推薦使用hook_cron構建到drupal API中的cron。

您的更新表明您需要立即執行。因此您需要分叉或異步進程。一種選擇是pcntl_fork(),但是我遇到了問題,因爲(至少使用mod_php)你並不想分叉web服務器進程。

您最好的選擇是設置一個頁面來專門執行更新,然後通過popen()通過分叉curl過程調用它。例如,

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

謝謝馬特,我更新了更詳細的問題 – 2010-05-23 09:32:24

+0

根據您的更新更新了我的答案。 – 2010-05-23 18:13:08

+0

尼斯更新馬特。這與我解決它的方式非常相似(見下文),區別在於我使用了CLI路由而不是創建新的http請求。乾杯。 – 2010-05-23 19:32:46

0

您可以查看規則模塊,該模塊允許您在發生某些事件時運行代碼。

+0

感謝googletorp,我更新了更詳細的問題 – 2010-05-23 09:32:47

0

看看hook_exit() - 在主內容發送給客戶端(通過page_set_cache()調用間接發生)之後,它將從drupal_page_footer()內部調用。

要知道,它通常會調用對JavaScript/AHAH回調,那些終止在大多數情況下,處理自己前面,但你描述的場景,應該是正確的方式去。

+0

感謝Henrik,看起來很有希望... – 2010-05-23 11:50:40

+0

我做了一些快速測試,不幸的是頁面等待hook_exit終止。沒關係,那簡直太簡單了! – 2010-05-23 12:03:13

2

這是你應該正在使用http://drupal.org/project/job_queue和cron完成任何你需要的東西。但是,如果你想速戰速決,只是想在頁面出現,事情持續下去。你可以使用PHP函數flush()

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

+0

謝謝。我之前遇到過flush()問題,所以我想避開那條路線。另外,我認爲給cron添加一項工作然後立即調用cron似乎很不雅觀。看起來我會用我最初的想法啓動一個後臺shell腳本,它從命令行調用一個新的Drupal實例。 – 2010-05-23 17:04:44

+0

對於Drupal作業隊列模塊+1。 – 2010-11-23 23:48:08

0

OP這裏。只是分享我的人以供將來參考的解決方案:

我用概括here

第二Drupal的殼模板此命令行自舉的Drupal。我修改了一下,所以我可以指定我自己的函數和來自CL的參數。

然後,我使用PHP系統()調用與後臺運算符(&)一起調用上述腳本 - 請記住重定向輸出或&是無關緊要的。

這有點亂,但它確實是我需要的。