Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提高性能、PHP/JSON解析和MySQL编写的建议-多个JSON_Php_Mysql_Json_Performance_Parsing - Fatal编程技术网

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

提高性能、PHP/JSON解析和MySQL编写的建议-多个JSON,php,mysql,json,performance,parsing,Php,Mysql,Json,Performance,Parsing,我对使用PHP/MySQL进行编码非常陌生,为了好玩,我从他们的API下载了一些World of Worldcraft数据,以测试我对PHP的了解 很抱歉,这篇文章太长,我尽量提供所需的信息,同时要简洁: 简短的版本是我的代码需要25分钟才能运行。我能做些更好的事情来加快速度吗 下面是详细的版本 暴雪有很多关于他们服务器的数据,是JSON格式的&每台服务器有一个JSON文件,我总共列出了123台服务器。 我已经编写了一个基本的JSON文件,其中包含123个服务器的名称和URL serv_gb.J

我对使用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时,加载和保存大约10万行平均需要20秒。 然后它使用foreach读取数据并将其发送到我的数据库。 记录结束时间并计算持续时间。 JSON文件中的数据比我需要的多。我试过两种方法来过滤这个

a只要尝试发送JSON中的所有数据&如果失败&通常会出现错误,请使用error_reporting0;将其隐藏;。懒惰,是的,因为 这是一个只适合我的宠物项目,我想我应该试试看

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

感谢您的建议,我认为以下是我需要帮助了解更多的好问题

有没有办法让循环或读取速度更快,或者我是在受暴雪服务器的摆布? 是向DB的写入阻碍了整个过程吗? 将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));

这里至少有两个主题:

A您正在将源从远程服务器下载到本地计算机。当然,这可能需要一些时间。如果可能,应使用服务器压缩内容。这限制了需要传输到客户端的数据量。但是,对于内置PHP函数来说,这并不简单。您需要看看PHP cURL:with CURLOPT_编码。若远程服务器可以压缩数据,请请求它这样做

B数据库性能。至于MySQL,您可以选择MyISAM或InnoDB引擎。插入数千条记录可以更好地处理InnoDB和事务,只要所有查询成功,您就可以提交事务。调整PHP和MySQL是一个严肃的话题,这里无法完全介绍。

请重复一个示例INSERT语句。它可能有一些问题

围绕INSERT循环,添加BEGIN和COMMIT。这将把所有插入放在一个事务中,从而使它更快

我更喜欢用microtimetrue来测量时间


25分钟?如果你把插页注释掉需要多长时间?这是为了查看它是否是MySQL。

创建一个工作队列会更好,因为您可以在多个实例之间分割工作,但您可以从使用curl multi、prepared query开始,并将数据查找移动到生成器中。从那123*100k排的公寓需要一段时间。我喜欢这些想法,谢谢!我一点也不熟悉你所建议的任何东西,但凭借搜索引擎的力量,我相信我会学到新的有用的东西。谢谢!插入到petshop.ah datedatacollected、卖家、petSpeciesId、服务器、收购、地区、RealRealRealm值'2018-03-23 18:45:46','Ilmago','55','nemesis','1290099','it','nemesis'是插入语句。至于Begin&Commit,我对它很陌生,我尝试使用$mysqli->Begin\u transactionMYSQLI\u TRANS\u START\u READ\u;&$mysqli->commit;,代码已运行,但我的数据库未填充。我需要阅读更多关于这方面的内容并学习它的正确用法。注释掉了插入持续时间=903秒,完整运行持续时间=2151秒Swell,READ_ONLY说您将不会写入插入。哦!哎呀,我想我会读取数据&提交仍然会发送到数据库。非常感谢。老实说,我正努力让自己开始工作。你能给我一个例子或一个链接,我可以阅读它请?谢谢你的答复!我将研究如何使用cURL并向您汇报。我正在为数据库使用InnoDB引擎。