我对 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_setopt与CURLOPT_ENCODING
。如果远程服务器可以压缩数据,请请求它这样做。
B) 数据库性能。至于MySQL
,您可以选择MyISAM
或InnoDB
引擎。使用 InnoDB 和事务插入数千条记录可以更好地工作,一旦所有查询成功,您就可以提交该事务。调整 PHP
和 MySQL
是一个严肃的话题,这里无法全面介绍。
关于php - 提高性能、PHP/JSON 解析和 MySQL 编写的建议 - 多个 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49428471/