Batch api, depurando proceso

Events happening in the community are now at Drupal community events on www.drupal.org.
oskar_calvo's picture

este es el código.
el código es muy parecido a un módulo que he hecho de prueba para dominar definitivamente la batch api, en el de prueba me funciona perfectamente, en este el bucle me ejecta todo el rato _cargar_usuarios.

Una vez resuelto gracias a Jonhattan el tema del bucle me encuentro que la función de batch no me ejecuta la función _cacular_tiempo_usuario();

Gracias de antemano.

Oskar

<?php
function proyecto_estadisticas_menu(){
 
$items['admin/settings/proyecto_estadisticas/batchapi'] = array(
   
'title' => t('Proceso batchapi para calcular tiempo medio en la página'),
   
'page callback' => '_proyecto_estadisticas_tiempo',

   
'access arguments' => array('administer site configuration'),
   
'file'  => 'proyecto_estadisticas.batch.inc',
   
'type'  => MENU_NORMAL_ITEM
  );
  return
$items;
  }


//archivo de php para los procesos de batch.api



/<strong>
*
Esta función es la que empieza montando todo el proceso de batch api.
*
*
name proyecto_comienzo_batch
*
*/
function
proyecto(){
 
//dpm('hola mundo');
  //llamamos a la función de batch
 
batch_set(_cargar_usuarios());
 
 
batch_process('node');
 
 
//return 'función';
}





function
_cargar_usuarios(){
 
//$date = date('Y-m-d',strtotime('yesterday'));
 
$date = '2011-09-12';
 
$valoresfechas = _get_valores_fechas($date);
 
$usuarios = array();
 
//se ejecuta correctamente. se ha comprobado.
 
$usuarios = _crear_array_usuarios_tiempos( $valoresfechas);
 
 
$operations = array();
  foreach(
$usuarios as $key => $value){
   
$operations[] = array('_cacular_tiempo_usuario', array($key, $value, $valoresfechas));
  }

 
$batch = array(
   
'operations' => $operations,
   
'finished' => 'funcion_final',
   
'title' => t('Calculando tiempo de usuarios'),
   
'init_message' => t('Comienza el cálculo de tiempos.'),
  );
  return
$batch;
}
  
 

/</
strong>
*
*
Esta función es parte de la batch api que llama a todos los usuarios para recorrer el resultado y hacer el sumatorio.
*
_cacular_tiempo_usuario
* 151 (Array, 8 elements)
*  
0 (String, 17 characters ) opened 1315836623
*   1 (String, 17 characters ) closed 1315836924
*
*
name _cacular_tiempo_usuario
* @param $usuario es un array con todos los resultados de opened y closed del usuario que se pasas
* @return el resultado de la suma.
*
*/

function
_cacular_tiempo_usuario($uid, $usuario, $valoresfechas, &$context){
 
//contamos la cantidad de elementos del array para los for.
 
$cantidad = count($usuario);

 
//Comprobamos cual es el primer elemento, opened or closed
 
if(preg_match("/^opened/", $usuario[0])){
   
$si = 0;
  }else {
   
$si = 1;
  }
 
//si $si == 1, quiere decir que el array empiza con un cloused, y el segundo valor(1) es un opened.
 
if($si == 1){
   
//calculamos el primer valor que es un cloused
   
$suma +=  str_replace('closed','',$usuario[0])- $valoresfechas['antes'] ;
   
//recorremos el bucle para sacar todas las relaciones
   
for($si; $si <= $cantidad; $si=$si+2){
      if(
$usuario[$si+1]){
       
$suma += str_replace('closed','',$usuario[$si+1])-str_replace('opened','',$usuario[$si]);
      }
      if( !(
$usuario[$si+1]) && (preg_match("/^opened/", $usuario[$si])) ){
       
//el ultimo registro, si es open, quiere decir que la sesión ha permanecido abierta all llegar a la media noche, por lo
        //tanto el close es fecha hasta.
       
$suma += $valoresfechas['despues'] -str_replace('opened','',$usuario[$si]);
      }
    }
  }
 
//si $si== 0 es que la primera entrada es opened
 
if($si == 0){
   
//recorremos el bucle para sacar todas las relaciones
   
for($si; $si <= $cantidad; $si=$si+2){
      if(
$usuario[$si+1]){
       
$suma += str_replace('closed','',$usuario[$si+1])-str_replace('opened','',$usuario[$si]);
      }
      if( !(
$usuario[$si+1]) && (preg_match("/^opened/", $usuario[$si])) ){
       
//el ultimo registro, si es open, quiere decir que la sesión ha permanecido abierta all llegar a la media noche, por lo
        //tanto el close es fecha hasta.
       
$suma += $valoresfechas['despues'] -str_replace('opened','',$usuario[$si]);
      }
    }
  }
   
// Store some result for post-processing in the finished callback.
 
$context['results'][] = $uid ;

 
// Optional message displayed under the progressbar.
 
$context['message'] = t('Loading @name', array('@name' => $uid));
 
 
$context['results']['metricas'][$uid]= $suma;
}



/<
strong>
*
Batch 'finished' callback
*/
function
funcion_final($success, $results, $operations) {
  if (
$success) {
   
// Here we could do something meaningful with the results.
    // We just display the number of nodes we processed...
   
$message = count($results) . ' processed.';
  }
  else {
   
// An error occurred.
    // $operations contains the operations that remained unprocessed.
   
$error_operation = reset($operations);
   
$message = 'An error occurred while processing ' . $error_operation[0] . ' with arguments :' . print_r($error_operation[0], TRUE);
  }
 
drupal_set_message($message);
 
$_SESSION($results['metricas']);
 
}




/</
strong>
*
Esta función crea un gran array con todos los usuarios y sus registros
* de aperturas y cierres de sesión.
*
*
name: _crear_array_usuarios_tiempos
* @param $valoresfechas
* @return un array con todos los usuarios, menos administradores, y
* sus aperturas y cierras de sesión
*
*/

function
_crear_array_usuarios_tiempos( $valoresfechas){

   
$sql = db_query("
  SELECT DISTINCT(wid), type, message, uid, timestamp
        FROM watchdog
        WHERE type = 'user'
        AND timestamp > %d
        AND timestamp < %d    
        AND ( message like '%%Session opened for%%' OR message like '%%Session closed for%%')
        AND uid NOT IN ("
.db_placeholders(ADMINISTRADORES,'int').")
        ORDER BY timestamp ASC"
,
       
$valoresfechas['antes'],
       
$valoresfechas['despues'], ADMINISTRADORES 
       
);
    while (
$result = db_fetch_object($sql)){

     
$usuarios[$result->uid][] = limpiar_mensaje($result->message). $result->timestamp;

    }

  return
$usuarios;


}





?>

Comments

batch_process('admin/settings

jonhattan's picture

batch_process('admin/settings/neomed_estadisticas/batchapi'); hace que el batch vuelva a empezar tras terminar.

Que grande eres Jonhattan, y

oskar_calvo's picture

Que grande eres Jonhattan, y que machacado voy yo y es solo martes, menos mal que tengo 20 días de vacaciones para diciembre.

Te debo el jueves.

Oskar

Madrid

Group organizers

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: