PHP循环没有完成?

时间:2012-08-11 06:37:09

标签: php loops

我正在检查我们的系统是否有死产品。由于项目数量(100.000+件连衣裙),我在整个DB-Table中循环100个。

检查一组100个项目后,我输出一条消息,显示已经过去的时间。

问题:不知怎的,它总是停在2400-2500(见下文)。

你知道问题出在哪里吗?

也许增量是问题?

以下是代码:

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

这是我的脚本所做的:

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))

1 个答案:

答案 0 :(得分:3)

使用&#34; set_time_limit(0)&#34;

更多信息: http://ca2.php.net/manual/en/function.set-time-limit.php

另外,为什么要在每次迭代时创建与数据库的新连接?没有必要,只需创建一个连接并使用它。

此外,您还可以使用error_reporting(E_ALL);

了解自己的疑难解答提示