Contadores usando PostgreSQL
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";
}
}
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);
?>
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]