提高性能,PHP / JSON解析和建议的建议MySQL编写 - 多个JSON

时间:2018-03-22 12:15:28

标签: php mysql json performance parsing

我对PHP / MySQL编码非常陌生,为了好玩,我一直在从他们的API下载一些World of Worldcraft数据来测试我对PHP的了解。

很抱歉这篇长篇文章,我试图尽可能多地提供信息,同时简明扼要:)

简短的版本是“我的代码需要25分钟才能运行。我可以做更好的事情(事情)来加快速度吗?

以下版本

暴雪有很多关于他们服务器的数据,采用JSON格式和每个服务器都有一个JSON文件(我总共列出了123个服务器)。 我写了一个基本的JSON文件,其中包含名称& 123服务器的URL(serv_gb.json)。

代码应如下运行: -

  • 读取serv_gb.json以计算For循环中使用的行数。
  • 记录我自己的支票的开始时间。
  • For循环开始,它读取&访问serv_gb.json中的URL。
  • 该URL包含该服务器的JSON文件,它被解析并保存在一个数组中。在Web浏览器中打开时,URL平均需要20秒才能加载&持有大约10万行。
  • 然后使用foreach来阅读&将数据发送到我的数据库。
  • 记录结束时间&持续时间计算。

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

任何建议都表示赞赏,我认为以下是我需要帮助了解更多信息的好问题。

  • 有没有办法让循环或读取更快(或者我受暴雪服务器的支配)?
  • 写入数据库的过程中是否存在瓶颈?
  • 将URL拆分为&同时触发多个JSON读取会加快这个速度吗?

如果你在这篇文章中有这么远的话。非常感谢您花时间阅读它,我希望它很清楚并且有意义!

我的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));

2 个答案:

答案 0 :(得分:1)

这里至少有两个主题:

A)您正在从远程服务器下载源到本地计算机。这可能需要一些时间。如果可能,应使用服务器压缩内容。这限制了需要转移到客户端的数据量。但是,内置PHP函数并不简单。您需要使用PHP cURL查看CURLOPT_ENCODINGcurl_setopt。如果远程服务器可以压缩数据,请求它执行此操作。

B)数据库性能。至于MySQL,您可以选择MyISAMInnoDB引擎。插入数千条记录可以更好地与InnoDB和事务一起使用,只要所有查询都成功,您就会提交。调整PHPMySQL是一个严肃的主题,此处无法完全涵盖。

答案 1 :(得分:0)

echo样本INSERT声明。它可能存在一些问题。

INSERT循环周围,添加BEGINCOMMIT。这会将所有插入放入单个事务中,从而使其更快。

我更喜欢microtime(true)来衡量时间。

25分钟?如果你发表评论INSERTs需要多长时间?这是为了看它是不是MySQL。