0

所以我有一个通过 Cron Job 执行的 PHP 脚本,它花费的时间太长(每次大约 25 秒),我需要优化它。脚本运行时,它滞后于我的服务器(在脚本完成之前不允许任何人访问任何其他页面),我想减少它滞后的时间或优化它,使其接近零滞后.

我知道很难优化,因为脚本在做什么,但我的代码概述如下:

  1. 从数据库中选择所有用户并获取他们的令牌 (LIMIT 0, 200)
  2. 遍历所有用户并将该令牌存储在数组中
  3. 对于数组中的每个标记
    1. 创建 API 对象
    2. 发出 http 请求以从 API 获取新的用户详细信息
    3. 检查接收来自 HTTP 请求的响应时是否发生错误
      1. 如果没有错误,则使用来自 API 的最新数据的 http 响应更新用户
      2. 如果出现错误,则将用户帐户设置为非活动状态

这个逻辑的问题是我正在发送一个 HTTP 请求,然后等待响应,然后我继续循环。我想做的是一次发送所有请求,然后有一个回调函数可以在收到数据时处理数据并相应地进行更新。但是我遇到了麻烦。

PHP代码:

<?php
require('functions.php');

global $mysqli;

$select = $mysqli->prepare("SELECT `token` FROM `users` ORDER BY `last_updated` ASC LIMIT 0, 200");
$select->execute();
$select->bind_result($cur_token);

$tokens = array();

while($select->fetch())
{
    array_push($tokens, $cur_token);
}

foreach($tokens as $token)
{
    $api = Instaphp\Instaphp::Instance();
    $api = Instaphp\Instaphp::Instance($token);
    $info = $api->Users->Info();

    if(empty($info->error))
    {
        $info->data->token = $token;
        $update = $mysqli->prepare("UPDATE `users` SET `a` = ?, `b` = ?, `c` = ?, `d` = ?, `e` = ?, `f` = ?, `g` = ?, `h` = ?, `i` = ?, `j` = NOW() WHERE `k` = ?");
        $update->bind_param('isssssiiii', $info->data->id, $info->data->username, $info->data->bio, $info->data->website, $info->data->profile_picture, $info->data->full_name, $info->data->counts->media, $info->data->counts->followed_by, $info->data->counts->follows, $info->data->id);

        $update->execute();

    } else if($info->error->code == 400) {
        $update = $mysqli->prepare("UPDATE `users` SET `active` = 0, `last_updated` = NOW() WHERE `token` = ?");
        $update->bind_param('s', $token);
        $update->execute();
    }
}

?>
4

0 回答 0