Улучшено логирование и увеличены таймауты в ParseAndCreateEvent.php

- Увеличен таймаут cURL с 60 до 180 секунд (3 минуты)
- Добавлен таймаут соединения 30 секунд
- Детальное логирование ошибок cURL с кодами и описанием
- Добавлено логирование времени выполнения каждого этапа
- Добавлено логирование использования памяти
- Улучшена обработка ошибок JSON с выводом проблемных данных
- Добавлена статистика общего времени выполнения скрипта
This commit is contained in:
Fedor
2025-10-29 10:21:41 +03:00
parent 9245768987
commit cfe586182a

View File

@@ -21,7 +21,9 @@ function log_wrapper($level, $message) {
}
try {
$scriptStartTime = microtime(true);
log_wrapper('INFO', '=== НАЧАЛО ОБРАБОТКИ ===');
log_wrapper('DEBUG', "Память на старте: " . round(memory_get_usage() / 1024 / 1024, 2) . " МБ");
// Получаем параметры (из POST, GET или argv)
$params = array_merge($_GET, $_POST);
@@ -73,24 +75,50 @@ try {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parscourtParams));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_TIMEOUT, 180); // Увеличен таймаут до 3 минут
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // Таймаут на установку соединения
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Для production HTTPS
log_wrapper('DEBUG', "Отправляем cURL запрос к parscourt.php...");
$startTime = microtime(true);
$output = curl_exec($ch);
$execTime = round(microtime(true) - $startTime, 2);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
$curlErrno = curl_errno($ch);
$curlInfo = curl_getinfo($ch);
curl_close($ch);
log_wrapper('DEBUG', "cURL выполнен за {$execTime} сек, HTTP код: $httpCode");
if ($curlErrno !== 0) {
log_wrapper('ERROR', "cURL ошибка #{$curlErrno}: {$curlError}");
log_wrapper('DEBUG', "cURL info: " . json_encode($curlInfo, JSON_UNESCAPED_UNICODE));
throw new Exception("Ошибка cURL при вызове parscourt.php: [{$curlErrno}] {$curlError}");
}
if ($httpCode !== 200) {
log_wrapper('ERROR', "Неожиданный HTTP код: $httpCode");
log_wrapper('DEBUG', "Первые 500 символов ответа: " . substr($output, 0, 500));
throw new Exception("Ошибка вызова parscourt.php: HTTP $httpCode");
}
$outputSize = strlen($output);
log_wrapper('DEBUG', "Получен ответ от parscourt.php (размер: {$outputSize} байт)");
log_wrapper('DEBUG', "Ответ от parscourt.php: $output");
// Парсим JSON ответ
$parscourtResponse = json_decode($output, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('Ошибка декодирования JSON от parscourt.php: ' . json_last_error_msg());
$jsonError = json_last_error_msg();
log_wrapper('ERROR', "Ошибка декодирования JSON: {$jsonError}");
log_wrapper('DEBUG', "Первые 1000 символов проблемного ответа: " . substr($output, 0, 1000));
throw new Exception('Ошибка декодирования JSON от parscourt.php: ' . $jsonError);
}
log_wrapper('DEBUG', "Распарсенный ответ: " . json_encode($parscourtResponse, JSON_UNESCAPED_UNICODE));
@@ -167,20 +195,41 @@ try {
// Передаём данные через временный файл
$tempFile = tempnam(sys_get_temp_dir(), 'event_data_');
file_put_contents($tempFile, $eventDataJson);
log_wrapper('DEBUG', "Временный файл создан: $tempFile");
log_wrapper('DEBUG', "Запускаем команду: cat $tempFile | $createEventCommand");
$startTimeEvent = microtime(true);
$createEventOutput = shell_exec('cat ' . escapeshellarg($tempFile) . ' | ' . $createEventCommand . ' 2>&1');
$execTimeEvent = round(microtime(true) - $startTimeEvent, 2);
log_wrapper('DEBUG', "CreateCourtEvent_v2.php выполнен за {$execTimeEvent} сек");
// Удаляем временный файл
unlink($tempFile);
log_wrapper('DEBUG', "Временный файл удалён");
log_wrapper('DEBUG', "Ответ от CreateCourtEvent_v2.php: $createEventOutput");
log_wrapper('DEBUG', "Ответ от CreateCourtEvent_v2.php (длина: " . strlen($createEventOutput) . " байт): $createEventOutput");
// Фильтруем PHP Notice из ответа
$cleanOutput = preg_replace('/^PHP Notice:.*$/m', '', $createEventOutput);
$cleanOutput = trim($cleanOutput);
log_wrapper('DEBUG', "Очищенный ответ (длина: " . strlen($cleanOutput) . " байт)");
$createEventResponse = json_decode($cleanOutput, true);
if (json_last_error() !== JSON_ERROR_NONE || empty($createEventResponse['success'])) {
throw new Exception('Ошибка создания события: ' . ($createEventResponse['error'] ?? 'Неизвестная ошибка'));
if (json_last_error() !== JSON_ERROR_NONE) {
$jsonError = json_last_error_msg();
log_wrapper('ERROR', "Ошибка декодирования JSON от CreateCourtEvent_v2.php: {$jsonError}");
log_wrapper('DEBUG', "Проблемный ответ: $cleanOutput");
throw new Exception('Ошибка декодирования JSON от CreateCourtEvent_v2.php: ' . $jsonError);
}
if (empty($createEventResponse['success'])) {
$errorMsg = $createEventResponse['error'] ?? 'Неизвестная ошибка';
log_wrapper('ERROR', "CreateCourtEvent_v2.php вернул ошибку: $errorMsg");
throw new Exception('Ошибка создания события: ' . $errorMsg);
}
log_wrapper('SUCCESS', "Событие создано: " . $createEventResponse['event_id']);
@@ -197,7 +246,13 @@ try {
'project_id' => $projectId
];
log_wrapper('SUCCESS', '=== ОБРАБОТКА ЗАВЕРШЕНА УСПЕШНО ===');
$totalTime = round(microtime(true) - $scriptStartTime, 2);
$memoryUsed = round(memory_get_usage() / 1024 / 1024, 2);
$memoryPeak = round(memory_get_peak_usage() / 1024 / 1024, 2);
log_wrapper('SUCCESS', "=== ОБРАБОТКА ЗАВЕРШЕНА УСПЕШНО ===");
log_wrapper('INFO', "Общее время выполнения: {$totalTime} сек");
log_wrapper('DEBUG', "Память использовано: {$memoryUsed} МБ (пик: {$memoryPeak} МБ)");
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
@@ -206,13 +261,23 @@ try {
} catch (Exception $e) {
$error_message = $e->getMessage();
log_wrapper('ERROR', "Ошибка: $error_message");
log_wrapper('ERROR', "Стек: " . $e->getTraceAsString());
$totalTime = isset($scriptStartTime) ? round(microtime(true) - $scriptStartTime, 2) : 0;
$memoryUsed = round(memory_get_usage() / 1024 / 1024, 2);
log_wrapper('ERROR', "=== ОШИБКА ОБРАБОТКИ ===");
log_wrapper('ERROR', "Сообщение: $error_message");
log_wrapper('ERROR', "Файл: " . $e->getFile() . " (строка " . $e->getLine() . ")");
log_wrapper('ERROR', "Стек вызовов:");
log_wrapper('ERROR', $e->getTraceAsString());
log_wrapper('INFO', "Время до ошибки: {$totalTime} сек");
log_wrapper('DEBUG', "Память использовано: {$memoryUsed} МБ");
log_wrapper('ERROR', '=== КОНЕЦ ЛОГА ОШИБКИ ===');
$response = [
'success' => false,
'error' => $error_message,
'timestamp' => date('Y-m-d H:i:s')
'timestamp' => date('Y-m-d H:i:s'),
'execution_time' => $totalTime
];
header('Content-Type: application/json; charset=utf-8');