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

标签 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 文件,它被解析并保存在数组中。在网络浏览器中打开该 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 的本地计算机(我自己的台式电脑)上运行此程序

感谢任何建议,我认为以下是很好的问题,我需要帮助我了解更多信息。

  • 有什么方法可以使循环或读取速度更快(或者我是否受到暴雪服务器的摆布)?
  • 是否是对数据库的写入造成了流程的瓶颈?
  • 拆分网址并同时触发多个 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:curl_setoptCURLOPT_ENCODING。如果远程服务器可以压缩数据,请请求它这样做。

B) 数据库性能。至于MySQL,您可以选择MyISAMInnoDB引擎。使用 InnoDB 和事务插入数千条记录可以更好地工作,一旦所有查询成功,您就可以提交该事务。调整 PHPMySQL 是一个严肃的话题,这里无法全面介绍。

关于php - 提高性能、PHP/JSON 解析和 MySQL 编写的建议 - 多个 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49428471/

相关文章:

javascript - 如何从 REST 响应渲染对象

php - 从 session ID 为 0 的购物车中删除项目

php - 如何将字符串拆分为单词对?

java - 从 java swing 导出和导入数据库 mysql

HDD上的Mysql表大小

mysql - 授予/撤销权限的 SQL 触发器

ios - NSXMLParser 与 JSON 解析器

php - Laravel 验证从列中获取值并将其与另一个表列进行比较

php - 使用 Symfony 2 CLI 工具,如何为子类生成具有正确类型提示的 getter 和 setter?

jquery - jQuery UI 自动完成的 JSON 格式