是否可以查询带有许多项目的蒸汽,而蒸汽只响应一个请求所有价格的 json?
不,不可能使用许多项目查询 Steam,这会导致包含所有数据的单个响应,但是可以使用 cURL 的 multiget 发送多个请求,每个请求都命中 Steam API,在单个 cURL 调用中返回多个响应。
curl multi exec 示例:
function curl_get_contents($data) {
$curly = array();
$mh = curl_multi_init();
foreach ($data as $urlArray) {
$curly[$urlArray['name']] = curl_init();
curl_setopt($curly[$urlArray['name']], CURLOPT_URL, $urlArray['url']);
curl_setopt($curly[$urlArray['name']], CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curly[$urlArray['name']], CURLOPT_HEADER, false);
curl_setopt($curly[$urlArray['name']], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $curly[$urlArray['name']]);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
foreach ($curly as $id => $c) {
curl_multi_remove_handle($mh, $c);
}
curl_multi_close($mh);
}
我写了一个很像这个的函数(删除了额外的代码,因为我不希望你只是复制/粘贴 - 改为学习)来获取一个数组数组,其中每个内部数组包含一个名称和一个 URL,并返回一个数组相应的数据 - 例如:
$curlyUrls = array(
array(
'name' => 'Item1 Response',
'url' => 'http://steamcommunity.com/market/priceoverview/?country=ZA¤cy=3&appid=730&market_hash_name=Item1'
),
array(
'name' => 'Item2 Response',
'url' => 'http://steamcommunity.com/market/priceoverview/?country=ZA¤cy=3&appid=730&market_hash_name=Item2'
)
);
$curlyItemResponse = curl_get_contents($curlyUrls);
绝对不建议对 100+ 项使用此方法。我使用它的调用不超过 10 次 - 过于频繁地访问 Steam API 可能会导致您的连接受到某种限制,更不用说,如果调用过于频繁,您的 100K 每日 API 阈值将很快用完。
有一些解决方法,但我可以推荐的最佳方法是将已知项目的列表存储在数据库中并创建一个 cronjob 以偶尔更新每个项目的价格,同时避免大量 API 调用——这样你就有了缓存每个项目的价格。