所以我有一个通过 Cron Job 执行的 PHP 脚本,它花费的时间太长(每次大约 25 秒),我需要优化它。脚本运行时,它滞后于我的服务器(在脚本完成之前不允许任何人访问任何其他页面),我想减少它滞后的时间或优化它,使其接近零滞后.
我知道很难优化,因为脚本在做什么,但我的代码概述如下:
- 从数据库中选择所有用户并获取他们的令牌 (LIMIT 0, 200)
- 遍历所有用户并将该令牌存储在数组中
- 对于数组中的每个标记
- 创建 API 对象
- 发出 http 请求以从 API 获取新的用户详细信息
- 检查接收来自 HTTP 请求的响应时是否发生错误
- 如果没有错误,则使用来自 API 的最新数据的 http 响应更新用户
- 如果出现错误,则将用户帐户设置为非活动状态
这个逻辑的问题是我正在发送一个 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();
}
}
?>