如何优化这个PHP脚本?

时间:2012-09-18 04:00:22

标签: php mysql

所以我有一个PHP脚本通过Cron作业执行,它花了太长时间(每次约25秒),我需要优化它。当脚本运行时,它滞后于我的服务器(在脚本完成之前不允许任何人访问任何其他页面)并且我想要减少它滞后的时间量或者在零滞后的地方优化它。

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

  1. 从数据库中选择所有用户并获取其令牌(LIMIT 0,200)
  2. 遍历所有用户并将该令牌存储在数组中
  3. 对于数组中的每个标记
    1. 创建API对象
    2. 发出http请求以从API
    3. 获取新用户详细信息
    4. 检查从HTTP请求接收响应时是否发生错误
      1. 如果没有错误,则使用http响应更新用户,http响应是API的最新数据
      2. 如果出现错误,请将用户帐户设置为无效
  4. 这个逻辑的问题是我发送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();
        }
    }
    
    ?>
    

0 个答案:

没有答案