Длинный скрипт умирает тихо...

akxxiv

Новичок
Ситуация такая: есть отчет, который обрабатывает много данных. Примерно 60000 накладных, по каждой из которых нужно сосчитать доход по накладной, по каждой из которых могут быть запросы к БД + логика расчета.
Скрипт на локальном сервере работает примерно 40 сек. На боевом сказал что израсходовал лимит памяти, выбрав все 60000 накладных из БД, и упал. "Хорошо..." - сказал я ему, и сделал выборку по 1000 записей, которые обрабатывались, а результат сохранялся в итоговом массиве.

Все здорово. От лимита памяти избавился. На локалке все по прежнему работает. На боевом - отрабатывает 25 сек. и тихо так умирает. Ни тебе ФаталЕрроров, ни нотайсов, ни чего!! Тихо-мирно лег и умер, хотя указано что
PHP:
ini_set('display_errors',1);
error_reporting(E_ALL);
Думал в max_execution_time дело. Поставил set_time_limit(0); - ноль реакции.

Увеличил выборку до 10000 накладных за раз. Проблемы не решило, но скрипт теперь работает около 15 сек. Затем благополучно умирает. Так же тихо-мирно. Единственное что в обоих случаях он успевает обработать 40-45тыщ накладных.

Нужны идеи куда капать. И чем лечить.
У меня пока одна идея - это какое-то ограничение со стороны БД на количество запросов за ед. времени. Но есть ли такое и если есть, то как называется я не знаю.

В общем, люди добрые, если есть какие-нибудь идеи по данному поводу, буду признателен.
 

AnrDaemon

Продвинутый новичок
Запускай скрипт из крона через консольный PHP. У него в принципе нет этого лимита.
И, да, зачем выбирать в память сразу все накладные? Используй курсор.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Можно прокинуть ssh туннель к базе, и выбрать все, на локалке и посчитать. Курсор + 1
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Щас окажется, что он на шареде запускает, и его убивает какой-то обходчик жирдяйских процессов у хостера.
 

akxxiv

Новичок
Запускай скрипт из крона через консольный PHP. У него в принципе нет этого лимита.
И, да, зачем выбирать в память сразу все накладные? Используй курсор.
Так, с памятью как раз уже нет проблем. Это я решил через покусочную выборку )) в смысле по 1000 накладных за проход.

Можно прокинуть ssh туннель к базе, и выбрать все, на локалке и посчитать. Курсор + 1
На локалке я отчет разрабатываю. Юзать его будут не на локалке. Или я не правильно понял? Кроме того у меня нет удаленного доступа к базе.

Щас окажется, что он на шареде запускает, и его убивает какой-то обходчик жирдяйских процессов у хостера.
Там не шаред конечно, но и доступа к настройкам у меня нет, только через общение с админами, а это долго... ))

Или процесс php падает в segfault
Не совсем понял что это значит?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@akxxiv, да, ты нифига не понял) Но считать "отчеты" на продакшене - не очень хорошее решение, надо изолировать считалку от продакшна. Иначе у тебя такие отчеты от частых запросов менеджерами могут положить твой "продакшн".
 

akxxiv

Новичок
@akxxiv, да, ты нифига не понял) Но считать "отчеты" на продакшене - не очень хорошее решение, надо изолировать считалку от продакшна. Иначе у тебя такие отчеты от частых запросов менеджерами могут положить твой "продакшн".
Они ни такие уж частые, и за 10 лет ни разу не положили ))) По крайнем мере на другом серваке, где нагрузка гораздо больше и данных тоже больше.
 

AmdY

Пью пиво
Команда форума
Посмотри всё же в логи, там обязана быть информация, если ты её не заткнул в другом собакой или уровнем репортинга.
 

akxxiv

Новичок
Проблема была в переполнении памяти. Но она переполнялась не там где я искал. Хотя почему мне он не говорил об этом, в смысле не отдавал ошибку, я так и не понял, но в логи записал. Админ мне их скинул все-же )) Всем спасибо.
 
Сверху