【发布时间】:2018-07-13 17:59:53
【问题描述】:
我将运行一个脚本来检查是否通过 Steam 的 Web API 接受了一些交易报价。我将每 15 秒使用一次 cronjob 运行它。但是我希望它能够尽可能快地优化和运行,我觉得我在这方面做得很糟糕。
如您所见,我放置了一些 cmets 来说明脚本在做什么。但我也会在这里尝试。
- 它从数据库中收集所有新的交易报价
- 它检查交易报价是否已被取消
- 如果没有取消,也就是接受。然后它会收集有关优惠的信息。
- 如果 bot-inventory 包含玩家存放的物品。数据库将设置 status = 1
- 然后它会删除交易,因为它已经完成了
感觉这个脚本运行慢,要不要换成mysqli?或者也许用 assoc 替换 mysql_fetch_array?我能做些什么来优化它。运行速度非常重要,快于 15 秒。
<?php
require('xxxxxx/xx.php');
//Getting bot-items
$jsonInventory = file_get_contents('https://steamcommunity.com/profiles/76561xxxxx8959977/inventory/json/730/2');
$data = json_decode($jsonInventory, true);
//Getting tradeoffers
$tradeoffers = mysql_query("SELECT * FROM tradeoffers");
while($trade = mysql_fetch_array($tradeoffers)) {
//Getting information about trade-offer
$url = file_get_contents("https://api.steampowered.com/IEconService/GetTradeOffer/v1/?key=3593xxxxxB6FFB8594D8561374154F7&tradeofferid=".$trade['tradeofferid']."&language=en_us");
$json = json_decode($url, true);
//Checking if trade has been completed
if (isset($json['response']) && isset($json['response']['offer'])) {
if($json['response']['offer']['trade_offer_state'] == 1 || $json['response']['offer']['trade_offer_state'] == 5 || $json['response']['offer']['trade_offer_state'] == 6 || $json['response']['offer']['trade_offer_state'] == 7 || $json['response']['offer']['trade_offer_state'] == 8 || $json['response']['offer']['trade_offer_state'] == 10 || $json['response']['offer']['trade_offer_state'] == 11) {
mysql_query("DELETE FROM tradeoffers WHERE tradeofferid = '".$trade['tradeofferid']."'");
mysql_query("DELETE FROM items WHERE tradeofferid = '".$trade['tradeofferid']."'");
}
if($json['response']['offer']['trade_offer_state'] == 3) {
if(isset($data['rgDescriptions'])) {
$itemsinfo = mysql_query("SELECT * FROM items WHERE tradeofferid = '".$trade['tradeofferid']."'");
while($item = mysql_fetch_array($itemsinfo)) {
foreach($data['rgInventory'] as $inv) {
$desc = $data['rgDescriptions'][ $inv['classid'] .'_'. $inv['instanceid'] ];
if($desc['icon_url'] == $item['iconurl']) {
mysql_query("UPDATE items SET assetid = '".$inv['id']."' WHERE iconurl = '".$item['iconurl']."'");
mysql_query("UPDATE items SET status = 1 WHERE iconurl = '".$item['iconurl']."'");
}
}
}
}
//Deleting the trade-offer from the database.
mysql_query("DELETE FROM tradeoffers WHERE tradeofferid = '".$trade['tradeofferid']."'");
}
} else {
mysql_query("DELETE FROM tradeoffers WHERE tradeofferid = '".$trade['tradeofferid']."'");
mysql_query("DELETE FROM items WHERE tradeofferid = '".$trade['tradeofferid']."'");
}
}
echo 'Finished';
?>
【问题讨论】:
-
mysql 已弃用,不应再使用。用户 mysqli 或 PDO。见php.net/manual/en/function.mysql-query.php
-
是的,我知道如何使用 mysqli,但是由于一位老开发人员,该站点的其余部分在 mysql 上运行。但是我可以使用 mysqli 运行这个脚本,对吗?不打扰其余代码?
-
从 mysql 更改为 mysqli 不太可能有助于提高性能。
-
@Karldrakar 是的,如果这是孤立的。此外,蒸汽 API 似乎有一个
GetTradeOffers路由,因此您可以批量获取它们并从数据库中批量删除/更新内容(可能我不知道 API 是否会为您提供足够的信息以在批量请求)。 -
您的内部
file_get_contents()总是访问相同的 URL。没有必要重复做。在脚本开头执行一次。