我对PHP / MySQL编码非常陌生,为了好玩,我一直在从他们的API下载一些World of Worldcraft数据来测试我对PHP的了解。
很抱歉这篇长篇文章,我试图尽可能多地提供信息,同时简明扼要:)
简短的版本是“我的代码需要25分钟才能运行。我可以做更好的事情(事情)来加快速度吗?
以下版本
暴雪有很多关于他们服务器的数据,采用JSON格式和每个服务器都有一个JSON文件(我总共列出了123个服务器)。 我写了一个基本的JSON文件,其中包含名称& 123服务器的URL(serv_gb.json)。代码应如下运行: -
JSON文件中的数据比我需要的多。我尝试了两种方法来过滤它。
a)尝试发送JSON&中的所有数据。如果它没有&通常会出错,用“error_reporting(0);”隐藏它。 (懒惰,是的,因为 这是一个适合我的宠物项目,我想我会尝试一下!)。
b)在SQL周围添加以下If循环,仅将正确的数据发送到数据库。
foreach($auctions as $val)
if ($val['item'] == 82800) {
{
$sql = "INSERT INTO `petshop`.`ah` (datedatacollected, seller, petSpeciesId, server, buyout, region, realrealm) VALUES('".$cTime."','".$val['owner']."','".$val['petSpeciesId']."', '".$servername."', '".$val['buyout']."','gb','".$val['ownerRealm']."')";
$mysqli->query($sql);
}
}
创意A比创意B慢约15%。创意B花了25分钟来完成所有123个JSON。
我在运行Apache2.4,MySQL57&的本地机器(我自己的台式机)上运行它。 PHP版本5.6.32
任何建议都表示赞赏,我认为以下是我需要帮助了解更多信息的好问题。
如果你在这篇文章中有这么远的话。非常感谢您花时间阅读它,我希望它很清楚并且有意义!
我的PHP代码
$servjson = '../servers/serv_gb.json';
$servcontents = file_get_contents($servjson);
$servdata = json_decode($servcontents,true);
$jrc = count($servdata['servers']);
echo "Json Row Count: ".$jrc."<p>";
$sTime = (new \DateTime())->format('Y-m-d H:i:s');
for($i=0; $i<$jrc; $i++){
$json = $servdata['servers'][$i]['url'];
$contents = file_get_contents($json);
$data = json_decode($contents,true);
$servername = $data['realms'][0]['slug'];
$auctions = $data['auctions'];
foreach($auctions as $val)
{
$sql = "INSERT INTO `petshop`.`ah` (datedatacollected, seller, petSpeciesId, server, buyout, region, realrealm) VALUES('".$cTime."','".$val['owner']."','".$val['petSpeciesId']."', '".$servername."', '".$val['buyout']."','gb','".$val['ownerRealm']."')";
$mysqli->query($sql);
}
}
$eTime = (new \DateTime())->format('Y-m-d H:i:s');
$dTime = abs(strtotime($eTime) - strtotime($sTime));
答案 0 :(得分:1)
这里至少有两个主题:
A)您正在从远程服务器下载源到本地计算机。这可能需要一些时间。如果可能,应使用服务器压缩内容。这限制了需要转移到客户端的数据量。但是,内置PHP
函数并不简单。您需要使用PHP cURL
查看CURLOPT_ENCODING
:curl_setopt。如果远程服务器可以压缩数据,请求它执行此操作。
B)数据库性能。至于MySQL
,您可以选择MyISAM
或InnoDB
引擎。插入数千条记录可以更好地与InnoDB
和事务一起使用,只要所有查询都成功,您就会提交。调整PHP
和MySQL
是一个严肃的主题,此处无法完全涵盖。
答案 1 :(得分:0)
请echo
样本INSERT
声明。它可能存在一些问题。
在INSERT
循环周围,添加BEGIN
和COMMIT
。这会将所有插入放入单个事务中,从而使其更快。
我更喜欢microtime(true)
来衡量时间。
INSERTs
需要多长时间?这是为了看它是不是MySQL。