gpt4 book ai didi

php - 创建节省时间和内存的 php 脚本

转载 作者:行者123 更新时间:2023-11-29 09:22:50 25 4
gpt4 key购买 nike

我必须重写我的代码,以便它在内存和执行时间方面变得有效..

该脚本的作用是创建一个 mysql 转储,其中数据被放入巨大的数据表中并插入到另一个数据库中。

这里处理的数据大约是 17 MB 的表数据,占用大约 62 MB 的内存。有什么建议如何降低内存使用量,因为将来它会变得越来越大?

<?php
ini_set("max_execution_time", "28800");
error_reporting(E_ALL);

include(dirname(__FILE__)."/includes/prepend.php");

$table = "source_table";
$target = "destination_table";

echo 'Initial: ' . number_format((memory_get_usage()/ 1024) / 1024 , 0, '.', ',') . " MB <br>";

$db = new DB_cms();
$db->beginTransaction();

$return.= 'DELETE FROM '.$target.'; '. "\n\n";

if($db->query('SELECT * FROM '.$table)){
$i=0;
$itemList = array();

while($db->next_record()){

$itemList[$i]["guid"] = $db->f("guid");
$itemList[$i]["title"] = $db->f("title");
$itemList[$i]["description"] = $db->f("description");
$itemList[$i]["copyright"] = $db->f("copyright");
$itemList[$i]["mediaType"] = $db->f("wapMediaType");
$itemList[$i]["price"] = $db->f("displayPrice");
$itemList[$i]["category"] = $db->f("category");
$itemList[$i]["thumbnail"] = $db->f("thumbnail");

//begin json data
$json = new Services_JSON();
$keywords_arr = $json->decode($db->f("keywords"));

foreach($keywords_arr as $key => $value){
$itemList[$i][$key] = $value;
}

$credit_arr = $json->decode($db->f("credit"));
foreach($credit_arr as $c => $credit){
$itemList[$i][str_replace(' ','',$c)] = $credit;
}
$i++;
}

$toInsert = array();

foreach($itemList as $items => $item){
$guid = mysql_real_escape_string($item["guid"]);
$title = mysql_real_escape_string($item["title"]);
$description = mysql_real_escape_string(ereg_replace('"', "",$item["description"]));
$copyright = mysql_real_escape_string($item["copyright"]);
$mediaType = mysql_real_escape_string($item["mediaType"]);
$price = mysql_real_escape_string($item["price"]);
$keywords = mysql_real_escape_string(ereg_replace('"', "",$item["keywords"]));
$category = mysql_real_escape_string(ereg_replace('"', "",$item["category"]));
$thumbnail = mysql_real_escape_string($item["thumbnail"]);
$date = date("Y-m-d H:i:s");
//json decoded data
$artist = mysql_real_escape_string($item["artist"]);
$label = mysql_real_escape_string($item["label"]);
$genre = mysql_real_escape_string($item["genre"]);
$media_format = mysql_real_escape_string($item["mediaformat"]);
$country = mysql_real_escape_string($item["country"]);
$album_title = mysql_real_escape_string(ereg_replace('"', "",$item["albumtitle"]));

$toInsert[] = "('0', $guid, 'NULL', '".$mediaType."', '".$category."', '".$keywords."', '".$title."', '".$artist."', '".$album_title."', '".$genre."', '".$label."', '".$media_format."', '".$country."', '".$description."', '".$thumbnail."', '".$price."', '".$copyright."', '".$date."', '0', '".$date."', '0', 'active')";
}

$sqlStart = "INSERT INTO `".$target ."` (`SortVar`, `Guid`, `Space`, `MediaType`, `Category`, `Keywords`, `Title`, `Artist`, `Album`, `Genre`, `Label`, `Mediaformat`, `Country`, `Description`, `Thumbnail`, `Price`, `Copyright`, `DateCreated`, `CreatedBy`, `DateModified`, `ModifiedBy`, `Status`) VALUES";

foreach (array_chunk($toInsert, 100) as $insertSet) {
$return.= $sqlStart . implode(', ', $insertSet);
$return.="; \n";
}

//save file
$handle = fopen(ABSOLUTE_DUMP_PATH.'file'.'.sql','w+');
if(fwrite($handle,$return)){
fclose($handle);
$ret = true;
} else {
$ret = false;
}

$usage = memory_get_usage();
$total_usage = ($usage / 1024) / 1024;
echo 'Peak: ' . number_format($total_usage, 0, '.', ',') . " MB<br>";
echo 'End: ' . number_format($total_usage, 0, '.', ',') . " MB<br>";
}
?>

最佳答案

如果您要在 1 个数据库中的两个表之间执行此操作(这就是您当前的代码似乎要做的事情),请在一个 SQL 语句中完成所有操作。如果没有必要,切勿将数据提交给 PHP。您将需要使用 MySQL 的 insert...select syntax 。该查询看起来应该与此并不完全不同:

INSERT INTO `target_table` (`SortVar`, `Guid`, `Space`, `MediaType`, `Category`, `Keywords`, `Title`, `Artist`, `Album`, `Genre`, `Label`, `Mediaformat`, `Country`, `Description`, `Thumbnail`, `Price`, `Copyright`, `DateCreated`, `CreatedBy`, `DateModified`, `ModifiedBy`, `Status`)
SELECT *
FROM `source_table`;

关于php - 创建节省时间和内存的 php 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1079073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com