PHP脚本运行速度极慢 - 分批写入文件

时间:2011-11-28 18:05:23

标签: php append

我有一个脚本,可以1000个批次抽出大约5000行数据并附加到文件中。然而,它需要一个多小时,我注意到生成的文件中的行数超过$ countProds,因此必须在某处做错。任何想法?

$startTime = time();    
$productLimit = 5000; 

//if file already exists then delete file so can write new file
if (file_exists($file)){
    unlink($file);
}           

$datafeed_separator = "|";          

$productsObj = new Products($db, $KeeperID);                    

//find out how many items keeper has
$countProds = $productsObj->countShopKeeperProducts();

//limit the amount of products
if ($countProds > $productLimit){$countProds = $productLimit; }     

$productBatchLimit = 500;   

//create new file
$fh = fopen($file, 'a');        

$counter = 1;
for ($i = 0; $i < $countProds; $i += $productBatchLimit) {

    $limit = $productBatchLimit*$counter;

    $products = $productsObj->getShopKeeperProducts($i, $limit);

    foreach($products as $product){
        $prod_id = $product['prod_id'];
        $prod_name = str_replace("|", " ", $product['productName']);
        $prod_desc = trim($product['productDescription']);
        $prod_image = $productsObj->getImageURL();  

        $txt .= 
        $prod_id . $datafeed_separator . 
        $prod_name . $datafeed_separator . 
        $prod_desc . $datafeed_separator . 
        $prod_image . $datafeed_separator . 

    }   
    fwrite($fh, $txt);
    $counter++;     
}
fclose($fh);

header ("Content-Type:text/plain;charset=utf-8");
include ($file);    
$endTime = time();
echo  "Total time to generate results: ".($endTime - $startTime)." seconds.\n"; 

2 个答案:

答案 0 :(得分:2)

如果没有看到你的其他方法(getShopKeeperProducts / getImageURL),很难找出确切的问题......但是当我遇到这些问题时,我总是会做的是我代码的每个部分的时间...试试这个:

// before a method
echo "Starting method a".PHP_EOL;
$start = time();
// do something
// after your method
echo "Done processing method a, time = " . (time() - $start) .PHP_EOL;

这将输出处理// do something的时间(以秒为单位) - 这应该为您提供一个很好的时间列表,您可以快速查看问题所在,而不仅仅是计时整个方法/类/文件

答案 1 :(得分:0)

您的for()循环最多可以运行500次($productBatchLimit = 500;)。

for()循环中,您有一个foreach()循环。 foreach()循环最多可以运行$products内的值。

$products内的值(假设getShopKeepProducts()方法正常工作)取决于您的以下代码行: $limit = $productBatchLimit*$counter

我们知道$productBatchLimit = 500;$counter =启动for()循环时foreach()循环运行的次数。

完成for()循环1次将使foreach()循环内的代码运行最多500次。

经过for()循环500次将运行foreach()循环内的代码,最多为62.625.500次。

要解决此问题,您可以将$products = $productsObj->getShopKeeperProducts($i, $limit);更改为$products = $productsObj->getShopKeeperProducts($i, $productLimit);并删除$limit = $productBatchLimit*$counter。每次for()循环开始时,foreach()循环现在限制为运行5000次。

完成for()循环500次,现在将foreach()循环内的代码运行到最多2.500.000次(500 for() * 5000 foreach() )而不是当前最大值62.625.500次。