2012-08-11 1 views
1

Je vérifie notre système pour les produits morts. En raison de la quantité d'éléments (100.000+ robes), je parcourt toute la table DB par 100.La boucle PHP n'est pas terminée?

Après avoir vérifié un ensemble de 100 éléments, je génère un message qui affiche l'heure qui s'est écoulée.

Problème: D'une manière ou d'une autre, il s'arrête toujours à 2400-2500 (voir ci-dessous).

Savez-vous où le problème pourrait être?

Peut-être que l'incrément est le problème?

Voici le code:

// get the amount of all rows to enable pagination later 
$AllRowsResponse = mysql_query("SELECT COUNT(*) AS Count FROM ".$targettablename." WHERE 1") or die ("Error #111231".mysql_error()); 
mysql_close($conn); 

// write amount of rows into variable 
$AllRows = mysql_fetch_array($AllRowsResponse) or die (mysql_error()); 
$RowCount = $AllRows["Count"]; 
//print "<br>all rows in table: " . $RowCount ;flush(); 
print "<br><h1>CHECKING ".$TargetTable." FOR DEAD PRODUCTS</h1><br>"; 

$deletedprods = 0; // set up counter for deleted product 
$i = 0; // counter 
$increment = 100; // increment steps 
$timetotalstart = microtime(true); // variable to measure each requests time. this is the beginning time 
$md5deadimage1 = md5(file_get_contents("www.mydomain.com/dead1.jpg")); // get md5 of "not available" pic ONCE 
$RowsMinusDeleted = $RowCount - $deletedprods; // when deleting a prod, dont look for rows that arent there anymore 

while ($i <= $RowsMinusDeleted) { // as long as the counter is below the rowcount, there are still rows to check 

    $limitstart = $i; 
    $limitend = $i + $increment; //MAYBE PROBLEM IS HERE??? 

    $conn = ConnectToDB(); 

    $ProductIds = mysql_query("SELECT ProductId,Image,Deeplink FROM ".$targettablename." WHERE 1 LIMIT " . $limitstart . "," . $limitend) or die ("Error #11124".mysql_error()); 
    mysql_close($conn);  

    $i = $i + $increment; // increase the counter by the above defined increment 


    //print " DEAD-MD5:" & $md5deadimage1;flush(); 

    print "<br>(Checking items " . $limitstart . "-" . $limitend . "(of ". $RowCount . " total))";flush(); 
    //$rowCount = mysql_num_rows($ProductIds); 
    //print "<br>amount of ids etc in array: " . count($rowCount) ;flush(); 
    $timeloopstart = microtime(true); 
    // write every productId into an array 
    while ($row = mysql_fetch_array ($ProductIds)) { 

     // get md5 of current product image 
     $md5deadimage2 = md5(file_get_contents($row['Image'])); 
     if ($md5deadimage1 == $md5deadimage2) { // if current file md5 is equal to any "dead picture", show it/delete it 

      $deletedprods++; 
      $conn = ConnectToDB(); 

      print "<a href=\"".$row['Deeplink']."\" target='_blank'><img src=\"".$row['Image']."\"></a>";flush(); 

      mysql_query("DELETE FROM ".$targettablename." WHERE `ProductId`=".$row['ProductId']."") or die ("Error #11125".mysql_error()); 

      mysql_close($conn); 
     } 
     //} // end if 
     $RowsMinusDeleted = $RowCount - $deletedprods; 
    } // end while 
    $timeloopend = microtime(true); 
    $timelooptotal = $timeloopend - $timeloopstart; 
    print "<-- above took " . floor($timelooptotal) . " seconds"; 
} 

$timetotalend = microtime(true); 
$timetotal = $timetotalend - $timetotalstart; 
print "<h2> whole request took " . floor($timelooptotal/60) . " minutes"; 
print "\n<h2>Updated ".$TargetTable.". Deleted <b>".$deletedprods."</b> old products</h2>"; 

Voici ce que fait mon script:

CHECKING dresses FOR DEAD PRODUCTS 



(Checking items 0-100(of 134902 total))<-- above took 17 seconds 

(Checking items 100-200(of 134902 total))<-- above took 34 seconds 

(Checking items 200-300(of 134902 total))<-- above took 48 seconds 

(Checking items 300-400(of 134902 total))<-- above took 68 seconds 

(Checking items 400-500(of 134902 total))<-- above took 82 seconds 

(Checking items 500-600(of 134902 total))<-- above took 94 seconds 

(Checking items 600-700(of 134902 total))<-- above took 109 seconds 

(Checking items 700-800(of 134902 total))<-- above took 125 seconds 

(Checking items 800-900(of 134902 total))<-- above took 136 seconds 

(Checking items 900-1000(of 134902 total))<-- above took 146 seconds 

(Checking items 1000-1100(of 134902 total))<-- above took 162 seconds 

(Checking items 1100-1200(of 134902 total))<-- above took 185 seconds 

(Checking items 1200-1300(of 134902 tota l))<-- above took 199 seconds 

(Checking items 1300-1400(of 134902 total))<-- above took 212 seconds 

(Checking items 1400-1500(of 134902 total))<-- above took 237 seconds 

(Checking items 1500-1600(of 134902 total))<-- above took 277 seconds 

(Checking items 1600-1700(of 134902 total))<-- above took 287 seconds 

(Checking items 1700-1800(of 134902 total))<-- above took 292 seconds 

(Checking items 1800-1900(of 134902 total))<-- above took 304 seconds 

(Checking items 1900-2000(of 134902 total))<-- above took 305 seconds 

(Checking items 2000-2100(of 134902 total))<-- above took 337 seconds 

(Checking items 2100-2200(of 134902 total))<-- above took 393 seconds 

(Checking items 2200-2300(of 134902 total))<-- above took 368 seconds 

(Checking items 2300-2400(of 134902 total))<-- above took 375 seconds 

(Checking items 2400-2500(of 134902 total)) 
+6

votre script pourrait être hors délai - Avez-vous essayé votre script avec set_time_limit (0); ? – MimiEAM

+0

-4 vote en baisse \t Wahooo - Beaucoup de code et nulle part où commencer. Veuillez coller un peu la zone de problème. –

+0

Veuillez utiliser [MySQLi] (http://php.net/manual/fr/book.mysqli.php) ou [PDO] (http://php.net/manual/fr/book.pdo.php). Les fonctions 'mysql_ *' sont obsolètes. –

Répondre

3

utilisation "set_time_limit(0)"

Plus d'infos ici: http://ca2.php.net/manual/en/function.set-time-limit.php

De plus, pourquoi sont vous créez une nouvelle connexion aux données base à chaque itération? Ce n'est pas nécessaire, créez simplement une connexion et utilisez-la.

aussi une astuce pour vous dépanner à l'avenir, utilisez error_reporting(E_ALL);

+0

Hey @Evan, merci pour votre réponse. J'essaierai error_reporting (E_ALL). Au fait: j'utilise un cronjob pour faire ce travail de temps en temps. Peut-être que c'est aussi un problème du cronjob? – ItsMeDom

+0

@DoJoChi: Avez-vous essayé de définir la limite de temps? –

+0

Vous pouvez configurer le cronjob pour vous envoyer également la sortie :) – Eva

Questions connexes