【发布时间】:2014-04-05 12:35:01
【问题描述】:
<?php
header('Content-Type: text/html; charset=UTF-8');
$con = mysqli_connect("localhost", "*******", "******", '*****');
$result = mysqli_query($con, "SELECT * FROM mybb_streams");
while ($row = mysqli_fetch_array($result)) {
$json_array = json_decode(file_get_contents('https://api.twitch.tv/kraken/streams/' . strtolower($row['channel']) . '?client_id=' . $clientId), true);
if ($json_array['stream'] != NULL) {
// turn them into variables to prevent outside SQL injection
$displayname = mysqli_real_escape_string($con, $json_array['stream']['channel']['display_name']);
$title = mysqli_real_escape_string($con, $json_array['stream']['channel']['status']);
$game = mysqli_real_escape_string($con, $json_array['stream']['channel']['game']);
$viewers = mysqli_real_escape_string($con, $json_array['stream']['viewers']);
$preview = mysqli_real_escape_string($con, $json_array['stream']['preview']['medium']);
$followers = mysqli_real_escape_string($con, $json_array['stream']['channel']['followers']);
mysqli_query($con, "SET NAMES utf8mb4");
mysqli_query($con, "UPDATE mybb_streams SET `online` = '1', `title` = '$title', `viewers` = '$viewers', `game` = '$game', `preview` = '$preview', `followers` = '$followers' WHERE `channel` = '" . strtolower($row['channel']) . "'") or die("A MySQL error has occurred.<br />Your Query: UPDATE `streams` SET `online` = `1`, `title` = `$title`, `viewers` = `$viewers`, `game` = `$game`, `preview` = `$preview` WHERE channel = '" . strtolower($row['channel']) . "'<br /> Error: (" . mysqli_errno($con) . ") " . mysqli_error($con));
} else {
mysqli_query($con, "UPDATE mybb_streams SET `online` = '0', `viewers` = '0' WHERE `channel` = '" . strtolower($row['channel']) . "'") or die("A MySQL error has occurred.<br />Your Query: UPDATE streams SET `online` = '0', `viewers` = '0' WHERE `channel` = '" . strtolower($row['channel']) . "'<br /> Error: (" . mysqli_errno($con) . ") " . mysqli_error($con));
}
}
?>
这是我用来更新数据库上的流列表的代码。问题是,数据库越来越大,这段代码开始运行缓慢+占用我的带宽。此脚本每 3 分钟自动运行一次,有时不会更新。那么对这段代码有什么建议吗?所以它可以运行得更快、更高效?
【问题讨论】:
-
通过在不同位置获取
microtime()几次并比较值来分析您的代码。除了从远程服务器读取之外,很可能一切都运行得很好。您也可能无能为力。 -
为什么不为
mybb_streams设置一个到期列?然后,您可以在该表中查询一段时间内未更新的流 - 并跳过已经轮询的流。 -
尝试并行化循环。目前,您正在连续执行许多网络请求。
-
“并行化”循环是什么意思?可以给我看看吗?