Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Помогите, знающие люди, сами мы не местные.. упс.. не от туда:)
В двух словах о проблеме(надеюсь экстрасенсы не потребуются).
Загружаю данные в xml со стороннего сервера
$xml=simplexml_load_file($conectionStr);
там порядка 2К..4К строк каждая с ~30 параметрами
далее в цикле
foreach($xml->row as $item){
appartments::firstOrCreate([id'=> $item->id,
'objtypes_Id'=>$item->objtypes_Id,
'RoomTtl'=>$item->RoomTtl,
'RoomSale'=>$item->RoomSale,
'PartTtl' =>$item->PartTtl, ]);
там больше параметров, но для примера сойдет и так,
пытаюсь вставить в таблицу только те которых записи, которых еще нет.
Но выхожу за пределы 180 сек отпущенных на работу скрипта.
Вопрос: Что делать и кто виноват... опять не то
Как можно этот скрипт разбить на несколько этапов. Например, обрабатывать 10 строк, потом следующие 10 и.тд
Всем, заранее, спасибо.
Изменено ewgenm (28.09.2017 21:27:34)
Примус. Признание Америки. МОСКВОШВЕЯ. Примус.
Не в сети
Может вы и не местные, но как использовать [CОDE] в курсе?
Вопрос: Что делать и кто виноват... опять не то
Можно увеличить лимит времени работы через set_time_limit(0) (0 = отключить лимит). В данном случае это проще и лучше, т.к. скрипт явно консольный и вряд ли потребляет столько ресурсов, чтобы его работу нужно было приостанавливать.
Либо можно разбить выполнение на несколько этапов. К примеру, вначале сохранить весь ответ во временный файл, начать его обрабатывать, сохраняя текущую позицию (последнюю обработанную строку, например) в БД или в другой файл. Дальше при каждом новом запуске скрипта просто перезапускать цикл с последней позиции. Когда все строки обработаны - стирать оба временных файла, таким образом следующий запуск снова скачает данные и начнет с нуля.
Не в сети
Можно увеличить лимит времени работы через set_time_limit(0)
не всегда этого достаточно. nginx и апач тоже имеют обычно настроенные таймауты ожидания, плюс php-fpm в настройках пула также может иметь ограничения, на которые time_limit не влияет
Как можно этот скрипт разбить на несколько этапов. Например, обрабатывать 10 строк, потом следующие 10 и.тд
долгий процессинг лучше вообще не выполнять в контексте веб-запроса. даже если эта выгрузка прилетает через какой-то http-запрос, можно сохранить xml в файл, и запустить обработку в фоне. обычно это делается через Queue и правильно настроенные обработчики очереди. в крайнем случае можно выкрутиться через крон – добавление крон-задач поддерживается даже совсем дубовыми шаред-хостингами… соответственно в браузер ты отдаёшь уже только идентификатор задачи и по нему отображаешь статус – в работе или завершено…
очереди задач как и крон-задачи запускаются через artisan команднострочным пхп-интерпретатором, на нём всегда set_time_limit = 0
Не в сети
не всегда этого достаточно. nginx и апач тоже имеют обычно настроенные таймауты ожидания, плюс php-fpm в настройках пула также может иметь ограничения, на которые time_limit не влияет
если апач как веб-сервер, а не cgi, то он понимает установленные в райнтайме лимиты/конфиги.
просто хотел дополнить.
за консоль и очередь - подписываюсь
Но, никто не посоветовал не юзать appartments::firstOrCreate, а сделать алгоритм оптимальней
Во первых - собрать все нужные значения
[id'=> $item->id,
'objtypes_Id'=>$item->objtypes_Id,
'RoomTtl'=>$item->RoomTtl,
'RoomSale'=>$item->RoomSale,
'PartTtl' =>$item->PartTtl, ]
Отсеять, что уже есть в базе - досоздать недостающее (длиннющий where)
Во вторых - покрыть составным индексом (возможно только это уже поможет).
Если будешь выходить за лимиты максимального запроса mysql - можно существенно сократить фильтрацию where, сгруппировав условия по objtypes_Id.
При очень больших объемах - вопрос решается только отложенной обработкой, т.е. очереди и т.п.
Изменено covobo (29.09.2017 12:04:45)
Не в сети
не всегда этого достаточно. nginx и апач тоже имеют обычно настроенные таймауты ожидания, плюс php-fpm в настройках пула также может иметь ограничения, на которые time_limit не влияет
Если это консольный скрипт (а судя по всему это так), то таймаутов сверху таймаута PHP на выполнение нет. Ну, а выполнять такие задачи в ответ на запрос (т.е. через веб-сервер), конечно, не стоит, для этого используются очереди, как уже было сказано.
Не в сети
Всем спасибо, помогли.
Консольный скрипт справился.
Примус. Признание Америки. МОСКВОШВЕЯ. Примус.
Не в сети
Страницы 1