Что может привести к зависанию сайта при удалении пользователя?


Когда я пытаюсь удалить пользователей, весь сайт зависает, т.Е. Drupal больше не отвечает. Что может быть причиной этого?

На сайте не установлены какие-либо специальные модули профилей пользователей.

Редактировать:
Существует только один пользовательский (самодельный) модуль с hook_user, который включает $op. Случай "удалить" выглядит подозрительно:

case 'delete':
    $sql = "DELETE FROM {mynewsletter_users} WHERE uid = %d";
    db_query($sql, $account->uid);
    break;

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

Редактировать:
Проблема исчез сам по себе. Понятия не имею, что случилось.

 5
Author: EricSchaefer, 2011-03-02

2 answers

Для меня это произошло, когда в пользовательском модуле произошла неправильная конфигурация hook_user. В частности, проверьте все ваши реализации hook_user, чтобы убедиться, что нет функций, которые приводят к дополнительным вызовам hook_user.

То есть, если у вас есть модуль, который вызывает foo_do_magic_to_user() в hook_user (или какую-либо другую функцию, которая выполняет hook_user), и foo_do_magic_to_user() вызывает user_save(), то у вас на руках бесконечный цикл.

Обновление

Если вы абсолютно уверены, что это не цикл hook_user, тогда может быть любое количество зависаний, связанных с модулем. Это часто связано с внешними службами, которые не реагируют (например, отправка электронного письма "До свидания", но sendmail (или эквивалент) не настроен должным образом).

На твоем месте я бы попробовал:

1) Отключите все неосновные модули и посмотрите, сохраняется ли проблема. Если это все еще происходит только с основными модулями, то у вас может возникнуть более глубокая и фундаментальная проблема (правильная версия PHP?)

2) Если не #1, затем повторно включите модули contrib один за другим и посмотрите, какой из них вызывает проблему. Проверка hook_user этого модуля должна дать вам хорошее представление о том, в чем заключается основная проблема. Скорее всего, один из модулей вызывает какую-то другую службу, которая не реагирует.

 4
Author: anschauung, 2011-03-04 13:12:54

Самое первое, что я бы сделал, это настроил локальную виртуальную машину с копией реального сервера для локального тестирования. В идеале это была бы копия, сделанная с помощью dd или аналогичной.

Посмотрите, реализуется ли что-нибудь hook_user. Для сайтов D5-D6 я использую рекурсивный grep (используя ack) из корневого каталога сайта, чтобы найти их. Удалите этот код и посмотрите, по-прежнему ли сайт зависает.

Используйте журнал медленных запросов MySQL , чтобы узнать, есть ли в нем какие-либо подсказки. Используйте ps и top, чтобы увидеть, что происходит на самом деле на веб-сервере.

Я не думаю, что у D5 есть блокировка (у D6 есть lock_acquire в lock.inc)

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

 2
Author: Richard Harrison, 2011-03-04 18:28:47