【发布时间】:2012-01-08 04:06:36
【问题描述】:
我有一个脚本,可以分 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";
【问题讨论】:
-
你从哪里得到数据?
-
Products::getShopKeeperProducts和Products::getImageUrl内部发生了什么?这几乎肯定会成为您的瓶颈。 -
你应该从跟踪一个周期foreach $products和一个周期for $i所花费的时间开始,然后你应该能够估计出哪个部分是耗时的
-
我正在从 mssql 数据库中获取数据。 Products::getShopKeeperProducts运行mssql查询批量拉取数据。例如。 $prod_qry = "SELECT * FROM (SELECT id, productName, ROW_NUMBER() OVER (ORDER BY id) as row FROM products WITH(NOLOCK) WHERE shopkeeper='$this->shopkeeper') A WHERE row > $start and row