是否可以查询带有许多商品的 steam,而 steam 只响应一个包含所有请求价格的 json?
不,不可能使用许多项目查询 Steam,从而产生包含所有数据的单个响应,但是可以使用 cURL 的 multiget 发送多个请求,每个请求都会命中 Steam API,在单个 cURL 调用中返回多个响应。
卷曲多重执行的示例:
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 调用 - 这样您就可以缓存每件商品的价格。