Php 如何使此脚本运行得更快

Php 如何使此脚本运行得更快,php,mysql,json,cron,Php,Mysql,Json,Cron,这是我用来更新数据库中的流列表的代码。问题是,数据库越来越大,而这段代码开始运行缓慢,占用了我的带宽。此脚本每3分钟自动运行一次,有时不会更新。对这个代码有什么建议吗?因此,它可以运行得更快、更高效?我发现了两个问题: 1数据库访问 我认为您应该使用mysqli\u multi\u查询,而不是一个循环一个查询 2 HTTP请求-文件获取内容- 你只能用这个打一个电话 <?php header('Content-Type: text/html; charset=UTF-8'); $con

这是我用来更新数据库中的流列表的代码。问题是,数据库越来越大,而这段代码开始运行缓慢,占用了我的带宽。此脚本每3分钟自动运行一次,有时不会更新。对这个代码有什么建议吗?因此,它可以运行得更快、更高效?

我发现了两个问题:

1数据库访问

我认为您应该使用mysqli\u multi\u查询,而不是一个循环一个查询

2 HTTP请求-文件获取内容-

你只能用这个打一个电话

<?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));
    }

}
?>
这样,您就可以一次获得所有ID的所有数据

然后将数组解析到循环中

试试这个->是的,它正在工作

https://api.twitch.tv/kraken/streams/' . strtolower($row['channel']) . '?client_ids=' . implode(',',$array_clientId)

通过在不同的地方获取几次microtime并比较这些值来分析代码。很可能除了从远程服务器读取数据外,其他一切都运行得很好。您也可能对此无能为力。为什么不为mybb_流设置一个到期列呢?然后,您可以查询该表中一段时间内未更新的流,并跳过已轮询的流。尝试并行化循环。目前,您正在处理许多串联的网络请求。将循环并行化是什么意思?你能告诉我吗?问题是,我从数据库中获得信息的用户提交了他们的流在数据库中。所以我是通过通道名而不是ID来获取它们的。
$con    = mysqli_connect("localhost", "*******", "******", '*****');
$result = mysqli_query($con, "SELECT * FROM mybb_streams");
$array_ids;
while ($row = mysqli_fetch_array($result)) {
  $array_ids[] = $row;
}
$json_array = json_decode(file_get_contents('https://api.twitch.tv/kraken/streams/' . strtolower($row['channel']) . '?client_ids=' . implode(',',$array_ids)), true);
foreach($json_array as $user){ /* do your stuff */}