Продолжить обработку Drupal после отправки страницы - PullRequest
1 голос
/ 23 мая 2010

Мне нужно выполнить дополнительную обработку после отправки страницы Drupal.

Я знаю, что могу запустить команду фоновой оболочки, но мне нужно сохранить текущий контекст выполнения Drupal.

Я потратил много времени на поиск, но не могу найти никаких документов по этому вопросу. Это удивительно, потому что это наверняка является общим требованием.

Единственная реальная идея, которую я имею, - это запустить Drupal (снова) с помощью команды оболочки (exec и т. Д.) И предоставить ему псевдо-путь, который вызовет продолжение обработки. Но это кажется излишне сложным / расточительным.

Любые указатели очень ценятся, ткс.

ОБНОВЛЕНИЕ: Основываясь на ответах Googletorp и Мэтта, я просто хочу отметить, что я не занимаюсь домашним хозяйством с этой дополнительной обработкой. Не вдаваясь в подробности, у меня есть несколько страниц, содержание которых основано на нескольких узлах. Если один из этих дочерних узлов изменяется, то страница должна быть немедленно обновлена, но нет причины, по которой пользователь, который обновил дочерний узел, должен ждать, пока это произойдет.

Итак, поток управления будет:

ОБНОВЛЕНИЕ ДЕТСКОГО УЗЛА
ВЕРНУТЬ ОБНОВЛЕННЫЙ ВИД НА УЗЕЛ РЕБЕНКА ДЛЯ ПОЛЬЗОВАТЕЛЯ (именно здесь Drupal обычно завершается)
РЕГЕНЕРАЦИЯ РОДИТЕЛЯ СТРАНИЦА
EXIT

Ни Cron, ни модуль правил не обладают необходимой мне непосредственностью - но спасибо за ваш вклад.

Ответы [ 5 ]

2 голосов
/ 23 мая 2010

Это то, что вы должны делать, используя http://drupal.org/project/job_queue, и cron для завершения всего, что вам нужно. Однако, если вы хотите быстро исправить и просто хотите, чтобы страница появлялась и что-то продолжалось, вы можете использовать функцию PHP flush ()

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

1 голос
/ 23 мая 2010

Для фоновых процессов я рекомендую cron, который встроен в drupal API с hook_cron.

Ваше обновление означает, что вам требуется немедленное выполнение. Поэтому вам требуется разветвление или асинхронный процесс. Одним из вариантов является pcntl_fork (), но у меня были проблемы, потому что (по крайней мере, с mod_php) вы не хотите, чтобы процесс веб-сервера разветвлялся.

Ваш лучший вариант, вероятно, состоит в том, чтобы настроить страницу для конкретного обновления, а затем вызвать ее с помощью раздвоенного процесса скручивания с помощью popen (). Например,

popen('curl http://localhost/update_parent_nodes &');
0 голосов
/ 23 мая 2010

ОП здесь. Просто чтобы поделиться своим решением с людьми для дальнейшего использования:

Я использовал второй шаблон оболочки Drupal, выделенный здесь здесь

Это загружает Drupal из командной строки. Я немного изменил его, чтобы я мог указать свою собственную функцию и аргументы из CL.

Затем я вызвал вышеуказанный скрипт, используя системный вызов PHP () в сочетании с оператором фона (&) - не забудьте перенаправить вывод, или & не имеет значения.

Это немного грязно, но делает именно то, что мне нужно.

0 голосов
/ 23 мая 2010

Взгляните на hook_exit() - он вызывается из drupal_page_footer(), сразу после того, как основное содержимое было отправлено клиенту (что происходит косвенно через page_set_cache() вызов).

Имейте в виду, что обычно не будет вызываться для обратных вызовов JavaScript / AHAH, так как в большинстве случаев они сами прекращают обработку раньше, но для описанного вами сценария это должен быть правильный путь. .

0 голосов
/ 23 мая 2010

Вы можете взглянуть на модуль правил, который позволяет запускать код всякий раз, когда происходят определенные события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...