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";
  }
}


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]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki