そのため、Cron ジョブを介して実行される PHP スクリプトがあり、時間がかかりすぎて (毎回約 25 秒)、最適化する必要があります。スクリプトの実行中、サーバーに遅延が発生し (スクリプトが終了するまで他のページにアクセスできません)、遅延時間を短縮するか、遅延がほぼゼロになるように最適化したいと考えています。 .
スクリプトが何をしているのかを最適化するのは難しいことはわかっていますが、私のコードは以下に概説されています:
- データベースからすべてのユーザーを選択し、トークンを取得します (LIMIT 0, 200)
- すべてのユーザーをループし、そのトークンを配列に格納します
- 配列内のトークンごとに
- API オブジェクトを作成する
- API から新しいユーザーの詳細を取得するための http 要求を作成します
- 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();
}
}
?>