Код: Выделить всё
public function updateWarehouses()
{
$settlements = NovaPoshtaSettlement::all();
$timeout = 60;
$limit = 500;
foreach ($settlements as $settlement) {
$page = 1;
$hasMoreData = true;
while ($hasMoreData) {
$response = Http::timeout($timeout)->post('https://api.novaposhta.ua/v2.0/json/', [
'apiKey' => config('services.novaposhta.api_key'),
'modelName' => 'AddressGeneral',
'calledMethod' => 'getWarehouses',
'methodProperties' => [
'SettlementRef' => $settlement->ref,
'Page' => $page,
'Limit' => $limit,
],
]);
if ($response->successful()) {
$warehouses = $response->json()['data'];
if (count($warehouses) < $limit) {
$hasMoreData = false;
} else {
$page++;
}
foreach ($warehouses as $warehouse) {
NovaPoshtaWarehouse::updateOrCreate(
[
'ref' => $warehouse['Ref'],
],
[
'settlement_id' => $settlement->id,
'description' => $warehouse['Description'],
'short_address' => $warehouse['ShortAddress'],
'type_of_warehouse' => $warehouse['TypeOfWarehouse'],
'number' => $warehouse['Number'],
]
);
}
} else {
$hasMoreData = false;
\Log::error('Failed to update warehouses', ['response' => $response->body()]);
}
}
}
}
Из этого метода я выбираю все отделения, почтовые отделения, пункты выдачи и пишу себе в базу данных, потому что копия должна быть на линии клиента.
Вопрос вот в чем. Может кто знает, как ускорить запись этих данных в базу, ведь их 30 000?.
Я использую crontab, перед этим создаю команду UpdateNovaPoshtaWarehouseData и записываю ее в Kernel.php.
$schedule->command('novaposhta:warehouse-update-data')->daily();
И еще один вопрос у меня иногда выбивает ошибку. Ошибка cURL 28: тайм-аут операции истек через 10001 миллисекунду, получено 0 из 0 байтов. Как это можно исправить?
Спасибо всем.
Подробнее здесь: https://stackoverflow.com/questions/787 ... 0-000-reco