Error: Timeout was reached при долгом выполнении

Начну с того, что у меня довольно часто возникали синтаксические ошибки в коде php из-за чего, при их исправлении, vk api начинал по несколько раз выполнять скрипт. Это очень мешало, поэтому я сделал промежуточный скрипт. Он принимает callback-вызов на себя, пересылает post-запрос на мой основной php-файл и отвечает 'ok', чтобы вк больше не ругался. Я точно не уверен, но казалось, что всё работало прекрасно. У меня чат-менеджер, выполняющий базовые команды по типу /kick /ban /info и т.п. Среди них есть команда, которая проходится по списку пользователей беседы и выводит в чат тех, у кого дата регистрации меньше определённого значения. Вот, собственно его код:

// ответить
$repl = $data->object->reply_message;
if ($repl) {
    array_push($users, $repl->from_id);
}

// переслать
$repl = $data->object->fwd_messages;
if ($repl) {
    foreach ($repl as $user) {
        array_push($users, $user->from_id);
    }
}
switch($cmd) {
    case '/regdate':
    case '+regdate':
        if (empty($users)) { break; }
        foreach ($users as $id) {
            $numid = getUserInfo(substr($id, 1), 'id');
            $str = file_get_contents("http://vk.com/foaf.php?id=$numid");
            $res = preg_match('/<ya:created dc:date=".{25}"\/>/', $str, $found);
            if ($res !== 0) {
                preg_match('/".{25}/', $found[0], $found);
                $regdate = substr($found[0], 1);
                // разница
                $interval = date_diff((new DateTime($regdate)), (new DateTime(date('c'))));
                $years = $interval->y;
                $month = $interval->m;
                $day = $interval->d;
                date_default_timezone_set('UTC');
                $date = (new DateTime($regdate))->getTimestamp();
                $startTimeStamp = (new DateTime())->setTimestamp($date);
                $detail = $startTimeStamp->format('m.d.Y \в H:i');
                send("@id$numid (Пользователь) зарегистрировался: $detail\nС момента регистрации прошло " . convDays($years, $month, $day));
            } else {
                send("Невозможно получить информацию. Страница пользователя заблокирована.");
            }
        }
        $executed = true;
        break;
}

И тут у меня возникает проблема. ВК говорит: Error: Timeout was reached (ну и 5 повторов), хотя 'ok' ему отвечают при пересылке. Код выполняется 5 раз (что понятно). Я грешу на то, что код выполняется долго и из-за этого появляется ошибка. Пересылаю запрос я при помощи curl и скорее всего после отправки скрипт ждёт завершения работы того скрипта, хотя это под вопросом. Кстати, вот сама переадресация:

if (!isset($_REQUEST)) { 
    return; 
}

$content = file_get_contents('php://input');
$data = json_decode($content);
include_once('../conf.php');

switch ($data->type) {
    case 'confirmation':
        echo $conf['callback_token'];
        break;
    default:
        $url = "http://example.com/index.php";
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        curl_close($ch);

        echo "ok";
        break;
}

Напоследок хочу добавить, что в основном php-файле есть и другие команды, такие как /kick, /warn, отправка сообщений в беседу, получение даты регистрации конкретного человека и всё работает без нареканий, то есть технически моя конструкция работоспособна. Я не знаю, как мне быть с этим, поэтому нуждаюсь в советах старших


Ответы (0 шт):