@devidwm

Сайт не загружается во время отработки php скрипта, как решить проблему?

Коллеги, всем привет!

Есть вопрос. Существует сайт, каталог которого заполняется через парсинг данных через фраймворк прямо с другого сайта. Учитывая, что скрипту приходится открыть более 3000 страниц и собирать с них данные, отрабатывает он очень долго. В момент работы скрипта сайт висит.
Подскажите, есть ли какой-то способ, к примеру, выделить скрипту только часть ресурсов сервера? Чтобы сайт мог загружаться во время отработки скрипта? Или единственный вариант только запускать скрипт на отдельном сервере?
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
martin74ua
@martin74ua Куратор тега Системное администрирование
Linux administrator
не запускать скрипт из сайта. Запускать например планировщиком
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
babarun
@babarun Куратор тега 1С-Битрикс
Безумный план моих идей в руках больных людей
Или единственный вариант только запускать скрипт на отдельном сервере?
Не единственный путь, но единственный правильный.
приходится открыть более 3000 страниц
Он же открывает их не одновременно? Делайте sleep между запросами. Не пытайтесь отпарсить всё за один проход, загружайте "сырой" html во временную таблицу, а парсинг по этим временным данным запускайте отдельно.
В идеале делайте через очередь RabbitMQ на отдельном сервере. Вот очень хороший пример.
Ответ написан
@lolhunter
Что значит "сайт висит"?
Если проблема в том, что висит вход (сессии в БД) - ошибка захвата сессии висит он только у пользователя, который запустил скрипт - так как сессии хранятся в БД. Храните в файлах проблемы не будет.
Если проблема в том, что ресурсов не хватает - надо запускать скрипт на кроне с nice (если проблема в процессоре) и ionice (если проблема в дисках)
типичный запуск скрипта с минимальным приоритетом:

0 3 * * * nice -n 19 ionice -c2 -n7 /usr/bin/php -f /home/bitrix/www/bitrix/cron/test/opt_price_gen.php" > /home/bitrix/www/bitrix/cron/test/logs/opt_price_gen.log
Ответ написан
Хотелось бы еще добавить к ответу lolhunter :
Есть еще проблема в том, что при парсинге идет слишком интенсивная работа с БД и висит сервер БД. Тут причин может быть несколько:
1 Просто интенсивная запись - сделайте слип между записями, объединяйте много записей в одну транзакцию.
2 Во время записи извлекаются какие-то данные из БД - эта такая нелепая ошибка, что встречается почти всегда. Код примерно выглядит так:
foreach ($arElementsForUpdate as $arElm) {
// а тут какой-нибудь GetList с извлечением скажем цветов товаров из ИБ-справочника
// тут запись
}

Однажды вынесением вот таких косяков из цикла ускорил работу скрипта импорта с 2,5 часов до 17 секунд. И все перестало висеть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы