我有一个脚本,可以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";
答案 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次。