Cuando se hacen contadores de noticias, por ejemplo en END, debido a que cada visita a una pagina es INSERT o UPDATE, se consumen bastantes recursos del servidor de bases de datos. Una solución implementada en END fue crear un archivo de texto con todos los INSERT's y UPDATE's que se requieren, y cada 5 minutos (usando el cron) ejecutar estos comandos con un BEGIN y un COMMIT, como es recomendado en varios tips sobre performance para
PostgreSQL.
tips∞
El codigo para guardar en el archivo las transacciones pendientes:
function counter
($idedicion,
$idnoticia) {
global $counter_data;
// re-usar: #$counter_data = new Data();
if ($counter_data->
getVar("SELECT idnoticia FROM counter WHERE idedicion='".
$idedicion.
"' AND idnoticia='".
$idnoticia.
"'")) {
#$counter_data->execSql("UPDATE counter SET counter=counter+1 WHERE idedicion='".$idedicion."' AND idnoticia='".$idnoticia."'");
$sql =
"UPDATE counter SET counter=counter+1 WHERE idedicion='".
$idedicion.
"' AND idnoticia='".
$idnoticia.
"';\n";
$handle =
fopen(SQL_TRANS,
'a');
fwrite($handle,
$sql);
fclose($handle);
} else {
$counter_data->
execSql("INSERT INTO counter VALUES ('".
$idedicion.
"','".
$idnoticia.
"', 1)");
#$sql = "INSERT INTO counter VALUES ('".$idedicion."','".$idnoticia."', 1);\n";
}
}
El script ejecutado cada 5 minutos debe leer los datos a memoria, poner en blanco el archivo, y agregar BEGIN y COMMIT para poceder a ejecutar los comandos en un solo bloque transaccional:
<?
require('../classes/app.class.php');
$counter_data =
new Data
();
$handle =
fopen(SQL_TRANS,
"r");
$contents =
fread($handle,
filesize(SQL_TRANS
));
fclose($handle);
$sql =
"BEGIN;\n" .
$contents .
"COMMIT;\n";
$handle =
fopen(SQL_TRANS,
"w");
fclose($handle);
pg_query($counter_data->
database->
connection,
$contents);
?>
Nota: no usamos execSql, porque almidon no acepta multiples transacciones por comando (para evitar injections, entre otras cosas)
CategoryAlmidon CategoryEND
There are no comments on this page. [Add comment]