A mensagen internas do Moodle gera uma carga enorme de log na mesma unidade de tempo (no mesmo segundo). O script faz um loop de leitura de mensagem quando o usuário acessa. Para cada mensagem, gera um log no banco. Se o usuário tiver 1000 mensagens na caixa, ao acessar, são geradas 1000 registros de log simultaneamente. Isso geralmente causa gargalo no sistema. É uma falha do Moodle. Para evitar isso, uma alternativa é hacker o código do core na parte que gera log de mensagens lidas, adicionando o comando sleep.
O camando sleep suspende o processamento par alguns segundos. Isso evita enormes quantidades de acesso ao banco simultaneamente.
Para efetuar o hacker, siga os seguintes passos:
a) Abra o arquivo
MOODLE_DIR_INSTALL/ message/lib.php
b) Localize a linha do arquivo que tenha o seguinte código: message_viewed::create que fica na função message_mark_message_read
Perto desse código em baixo, coloque o código sleep(3); depois de $event->trigger(); e antes de return $messagereadid;
Veja como fica o código adicionado:
function message_mark_message_read($message, $timeread, $messageworkingempty=false) {
[...]
// Trigger event for reading a message.
$event = \core\event\message_viewed::create(array(
'objectid' => $messagereadid,
'userid' => $message->useridto, // Using the user who read the message as they are the ones performing the action.
'context' => $context,
'relateduserid' => $message->useridfrom,
'other' => array(
'messageid' => $messageid
)
));
$event->trigger();
sleep(3);
return $messagereadid;
}
c) Salve o arquivo
Veja o trecho do código com alteração. O código adicionado está na cor vermelha.
O comando sleep suspende processamento por 3 segundos. Você pode ajustar isso para outros valores.
A linha exata desse código depende da versão do Moodle. Esse procedimento foi testado na versão 2.8 e 2.9. Mas funciona na família da versão 2 e 3 do Moodle.