Hacker código de mensagens interna do Moodle para evitar sobrecarga de acesso ao banco

Hacker código de mensagens interna do Moodle para evitar sobrecarga de acesso ao banco

por Lino Vaz Moniz -
Número de respostas: 0

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.