Вот в чем проблема.
Я написал фрагмент кода на Laravel, который получает данные из API, извлекает нужные данные из ответа и затем сохраняет это в базу данных. (По сути, импортер продуктов)
Поначалу у меня был весь код в одной функции, и казалось, что все работает нормально. Весь импорт занял около 45 минут (из-за ограничений запросов API). Я ни разу не получил фатальную ошибку «Превышено максимальное время выполнения 60 секунд».
Затем, когда все заработало, я решил начать рефакторинг своего кода и разбить его на небольшие отдельные функции. Логика импортера осталась прежней, ничего не было добавлено, просто вынесено в отдельные функции. Как только я это сделал и снова запустил импортер, вуаля, я получил старую добрую ошибку «Превышено максимальное время выполнения 60 секунд». Это меня очень сбивает с толку, потому что природа импортера осталась прежней, он был просто разделен на более мелкие понятные функции.
Более того, я не мог понять, что вызывает проблему, поэтому решил попытать счастья. здесь. Моя цель не в том, чтобы решить проблему, потому что я могу сделать это, просто выполнив set_time_limit(n); в начале каждого цикла.
Меня больше интересует, что могло вызвать проблему и как именно работает и ведет себя максимальное время выполнения. Буду очень благодарен за любую документацию или пояснение.
Заранее спасибо.
P.S Я бы поместил сюда оба фрагмента кода, но в то время я не использовал контроль версий (глупый я).
Код: Выделить всё
public function importItems(): void
{
$totalRequests = 1;
$totalItems = 0;
$start = 0;
$errorCount = 0;
Log::info('IMPORTER: Started');
$apiConnector = new APIConnector();
for ($i = 1; $i getData('1', $start, 100, $this->Id, 'price', 'asc');
if (!$this->responseValidation($response)) {
if ($errorCount >= 3) {
continue;
}
$errorCount++;
$i--;
continue;
} else {
$errorCount = 0;
}
$response = $response->json();
$start = $response['start'] + $response['pagesize'];
if ($i == 1) {
$totalItems = $response['total_count'];
$totalRequests = $this->calculateTotalRequests($totalItems);
}
$this->saveItemsToDatabase($this->extractItemsData($response['results']));
Log::info('IMPORTER: ' . $start . '/' . $totalItems . ' imported');
//Needs to sleep due to request limit
usleep(12000000 - ((microtime(true) - $requestStartTime) * 1000000) + 1000000);
//usleep($this->calculateSleepTime($this->calculateRequestTime($requestStartTime, microtime(true))));
}
Log::info('IMPORTER: Complete');
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... s-exceeded