2009-12-11 5 views
0

J'ai une fonction qui calcule certaines données à partir d'une table, un put est dans un autre, il faut un certain temps pour tout le processus, environ 30 minutes ou quelque chose comme ça. La fonction calcule les statistiques pour chaque jour pour une période de deux mois, mais après environ 10 jours, elle commence un autre thread tout en continuant une autre, puis une autre, et une autre, donc j'obtiens une table pleine de merde aléatoire à la fin .plusieurs instances de la fonction php

Pourquoi lance-t-il une autre instance de la fonction alors que l'autre n'est pas terminée?

est ici la fonction:

function build_fill_array() { 

$sql = db_fetch_object(db_query("SELECT min(timestamp) as min FROM {accesslog}")); 
$nids = db_query("SELECT nid FROM {node} WHERE type='raamat'"); 
while($nid_array = db_fetch_array($nids)) { 
    $nid[] = $nid_array['nid']; 
} 
$start_ts = $sql->min; 
$end_ts = mktime(0,0,0, date('m'), date('d'), date('Y')); 
$start_ts = mktime(0,0,0, date('m', $start_ts), date('d', $start_ts), date('Y', $start_ts)); 

while($start_ts != $end_ts) { 
    $day = date('d.m.Y', $start_ts); 
    $range_from = mktime(0,0,0, date('m', $start_ts), date('d', $start_ts), date('Y', $start_ts)); 
    $range_to = mktime(23,59,59, date('m', $start_ts), date('d', $start_ts), date('Y', $start_ts)); 
    foreach($nid as $n) { 
    $results = db_fetch_object(db_query("SELECT count(hostname) as total, count(distinct hostname) as visits FROM {accesslog} WHERE timestamp BETWEEN %d AND %d AND path = 'node/%d'", $range_from, $range_to, $n)); 
    $sql_insert = "INSERT INTO {statistics_view} (`id`, `nid`, `total`, `unique`, `timestamp`, `date`) VALUES (NULL, $n, $results->total, $results->visits, ".mktime().", '$day');"; 
    db_query($sql_insert); 
    } 


    $start_ts = mktime(0,0,0, date('m', $start_ts), date('d', $start_ts)+1, date('Y', $start_ts)); 
} 

} 

Edit: ne me dérange pas les {} autour des noms table, il est une chose drupal.

+1

Quelle est votre question? –

+1

Pourquoi démarre-t-il une autre instance de la fonction alors que l'autre n'est pas terminée – djeux

+1

Je ne sais pas ce que signifie "démarrer une autre instance de la fonction". S'il vous plaît élaborer. – johannes

Répondre

0

Remplacer

while($start_ts != $end_ts) { 

avec:

while($start_ts <= $end_ts) { 
+0

n'a pas aidé, maintenant il faut attendre une heure pour qu'il se termine :) – djeux

1

Pourquoi faut-il commencer une autre instance de la fonction alors que l'autre ne soit pas terminé?

Vous devriez regarder où la fonction est appelée, pas la fonction elle-même.

Questions connexes