Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 28.09.2017 21:19:45

Тайм аут работы скрипта 180 сек. выхожу за пределы

Помогите, знающие люди, сами мы не местные.. упс.. не от туда:)

В двух словах о проблеме(надеюсь экстрасенсы не потребуются).
Загружаю данные в 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 сек отпущенных на работу скрипта.

Вопрос: Что делать и кто виноват... опять не то smile
Как можно этот скрипт разбить на несколько этапов. Например, обрабатывать 10 строк, потом следующие 10 и.тд

Всем, заранее, спасибо.

Изменено ewgenm (28.09.2017 21:27:34)


Примус. Признание Америки. МОСКВОШВЕЯ. Примус.

Не в сети

#2 28.09.2017 22:42:52

Re: Тайм аут работы скрипта 180 сек. выхожу за пределы

Может вы и не местные, но как использовать [CОDE] в курсе?

Вопрос: Что делать и кто виноват... опять не то

Можно увеличить лимит времени работы через set_time_limit(0) (0 = отключить лимит). В данном случае это проще и лучше, т.к. скрипт явно консольный и вряд ли потребляет столько ресурсов, чтобы его работу нужно было приостанавливать.

Либо можно разбить выполнение на несколько этапов. К примеру, вначале сохранить весь ответ во временный файл, начать его обрабатывать, сохраняя текущую позицию (последнюю обработанную строку, например) в БД или в другой файл. Дальше при каждом новом запуске скрипта просто перезапускать цикл с последней позиции. Когда все строки обработаны - стирать оба временных файла, таким образом следующий запуск снова скачает данные и начнет с нуля.

Не в сети

#3 29.09.2017 07:12:58

Re: Тайм аут работы скрипта 180 сек. выхожу за пределы

Можно увеличить лимит времени работы через set_time_limit(0)

не всегда этого достаточно. nginx и апач тоже имеют обычно настроенные таймауты ожидания, плюс php-fpm в настройках пула также может иметь ограничения, на которые time_limit не влияет

Как можно этот скрипт разбить на несколько этапов. Например, обрабатывать 10 строк, потом следующие 10 и.тд

долгий процессинг лучше вообще не выполнять в контексте веб-запроса. даже если эта выгрузка прилетает через какой-то http-запрос, можно сохранить xml в файл, и запустить обработку в фоне. обычно это делается через Queue и правильно настроенные обработчики очереди. в крайнем случае можно выкрутиться через крон – добавление крон-задач поддерживается даже совсем дубовыми шаред-хостингами… соответственно в браузер ты отдаёшь уже только идентификатор задачи и по нему отображаешь статус – в работе или завершено…

очереди задач как и крон-задачи запускаются через artisan команднострочным пхп-интерпретатором, на нём всегда set_time_limit = 0

Не в сети

#4 29.09.2017 11:58:01

Re: Тайм аут работы скрипта 180 сек. выхожу за пределы

не всегда этого достаточно. 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)

Не в сети

#5 29.09.2017 12:31:02

Re: Тайм аут работы скрипта 180 сек. выхожу за пределы

не всегда этого достаточно. nginx и апач тоже имеют обычно настроенные таймауты ожидания, плюс php-fpm в настройках пула также может иметь ограничения, на которые time_limit не влияет

Если это консольный скрипт (а судя по всему это так), то таймаутов сверху таймаута PHP на выполнение нет. Ну, а выполнять такие задачи в ответ на запрос (т.е. через веб-сервер), конечно, не стоит, для этого используются очереди, как уже было сказано.

Не в сети

#6 01.10.2017 22:05:20

Re: Тайм аут работы скрипта 180 сек. выхожу за пределы

Всем спасибо, помогли.
Консольный скрипт справился.


Примус. Признание Америки. МОСКВОШВЕЯ. Примус.

Не в сети

Подвал раздела