2016-03-14 2 views
2

Итак, я разработал систему генерации отчетов в Laravel. Мы используем php 7 (opcache enabled)/apache/mysql/в поле centos 7. С одним отчетом, захват всей информации заканчивается занятием около 15 секунд, но затем мне нужно пройти через и сделать кучу фильтрации на коллекциях и т. Д. И т. Д. Я оптимизировал это сверху донизу в течение недели и получил весь отчет генерация займет около 45 секунд (работа с несколькими таблицами с более чем 1 миллионом записей). Это максимизирует мой процессор до его завершения, конечно.LAMP/Laravel - Генерация отчетов, максимизирующая один процессор

Моя проблема в том, когда мы подтолкнули ее к клиенту, что их процессор не соответствует задаче. У них есть 4 процессора с 8 ядрами каждый @ 2.2ghz. Тем не менее, поскольку php - это единственный процесс, он работает только на одном процессоре и максимизирует его, и поскольку он настолько медленный, для выполнения отчета требуется более 10 минут.

Есть ли способ получить apache/php/linux ... что угодно .... использовать все 4 процессора для одного процесса php? Единственный другой вариант - рассказать клиенту, что им нужен лучший сервер ... не вариант. Пожалуйста помоги.

+0

Какой отчет вы делаете? Это HTML-страница, электронная почта, лист Excel или какой-либо другой документ? – silkfire

+0

im с использованием wkhtmltopdf через https://github.com/barryvdh/laravel-snappy –

+0

Вы уверены, что если процессор получит максимальную или память? –

ответ

0

Итак, я перестал пытаться найти способ лучше справиться с моим кодом и нашел несколько способов оптимизации моего кода.

Во-первых, я использовал коллекцию метода groupBy() для группировки моей коллекции, чтобы у меня была куча суб-массивов с идентификатором в качестве ключа. Когда я зациклился на них, я просто захватил этот субмассив, вместо того, чтобы использовать метод коллекции filter(), который ДЕЙСТВИТЕЛЬНО медленный при работе с этим множеством элементов. Это спасло меня от вычислительной мощности.

Во-вторых, каждый раз, когда я использовал суб-массив, я удалял его из основного массива. Таким образом, массив становился все меньше и меньше каждый раз, когда он проходил через foreach.

Эти оптимизации в конечном итоге сэкономили мне много вычислительной мощности, и теперь мои отчеты работают нормально. После нескольких дней поиска способа разрешить php обрабатывать параллельную обработку и т. Д. Я пришел к выводу, что его просто невозможно.

Надеюсь, это поможет.