Что может привести к зависанию сайта при удалении пользователя?
Когда я пытаюсь удалить пользователей, весь сайт зависает, т.Е. Drupal больше не отвечает. Что может быть причиной этого?
На сайте не установлены какие-либо специальные модули профилей пользователей.
Редактировать:
Существует только один пользовательский (самодельный) модуль с hook_user, который включает $op
. Случай "удалить" выглядит подозрительно:
case 'delete':
$sql = "DELETE FROM {mynewsletter_users} WHERE uid = %d";
db_query($sql, $account->uid);
break;
На мой взгляд, выглядит неплохо. Не следует вызывать hook_user-круг.
Редактировать:
Проблема исчез сам по себе. Понятия не имею, что случилось.
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 этого модуля должна дать вам хорошее представление о том, в чем заключается основная проблема. Скорее всего, один из модулей вызывает какую-то другую службу, которая не реагирует.
Самое первое, что я бы сделал, это настроил локальную виртуальную машину с копией реального сервера для локального тестирования. В идеале это была бы копия, сделанная с помощью dd
или аналогичной.
Посмотрите, реализуется ли что-нибудь hook_user
. Для сайтов D5-D6 я использую рекурсивный grep (используя ack) из корневого каталога сайта, чтобы найти их. Удалите этот код и посмотрите, по-прежнему ли сайт зависает.
Используйте журнал медленных запросов MySQL , чтобы узнать, есть ли в нем какие-либо подсказки. Используйте ps и top, чтобы увидеть, что происходит на самом деле на веб-сервере.
Я не думаю, что у D5 есть блокировка (у D6 есть lock_acquire в lock.inc)
Также было бы полезно, если бы вы могли объяснить, как вам удается восстановить сервер после того, как он /заблокирован/.