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, отправка сообщений в беседу, получение даты регистрации конкретного человека и всё работает без нареканий, то есть технически моя конструкция работоспособна. Я не знаю, как мне быть с этим, поэтому нуждаюсь в советах старших