Проблема с памятью команд Laravel 4 Artisan ⇐ Php
Проблема с памятью команд Laravel 4 Artisan
Я написал ремесленную команду для экспорта упражнений из базы данных в автономные пакеты, которые можно использовать в системе электронного обучения, такой как Moodle, ...
Это огромное количество упражнений, и через некоторое время память утомляется.
Я пытался сбросить переменные, активировать сборщик мусора, отключить журнал запросов и выполнить некоторое профилирование, но до сих пор безуспешно
Я прикрепил свой сценарий ниже, с каждым выполняемым упражнением использование памяти увеличивается на 300 КБ. Есть идеи, что я могу сделать?
use Illuminate\Console\Command; используйте Illuminate\Filesystem\Filesystem; используйте Symfony\Component\Console\Input\InputOption; используйте Symfony\Component\Console\Input\InputArgument; set_time_limit (0); класс PracticeExportCommand расширяет команду { /** * Имя консольной команды. * * @var строка */ protected $name = 'упражнения:экспорт'; /** * Описание консольных команд. * * @var строка */ protected $description = 'Экспортировать все упражнения метода или конкретное упражнение.'; /** * Создайте новый экземпляр команды. * * @return void */ публичная функция __construct() { родитель::__construct(); } /** * Выполните консольную команду. * * @return void */ публичная функция fire() { пытаться { БД::disableQueryLog(); ini_set('memory_limit','1024M'); $this->info('Initial: ' . Number_format(memory_get_usage(), 0, '.', ',') . " bytes\n"); $base = базовый_путь(). "/экспорт/"; $playerPath = base_path(). "/public/preview/dist/"; $uploadsPath = base_path(). "/public/uploads/"; $methodId = $this->option('метод'); $categoryId = $this->option('категория'); $exercisionId = $this->option('упражнение'); $this->info("Качайтесь, детка..."); $this->info("Давайте экспортируем несколько упражнений, ладно?"); //мы создаем массив, содержащий все упражнения, которые нам нужно экспортировать $упражнения = массив(); if($methodId === NULL && $categoryId === NULL && $exercisionId === NULL){ //в любом случае, мы уже здесь, давайте сделаем все упражнения сразу... $this->comment("Ничего не указано, давайте выполним все упражнения"); $exercisions2 = Упражнение::all(); Еогеасп ($упражнения2 как $упражнения){ array_push($упражнения, $упражнения->id); } не установлено ($ упражнения2); } //получим все упражнения для данного идентификатора метода if($methodId !== NULL){ $method = Метод::with('categories.exercisions')->find($methodId); если ($ метод == NULL) перерыв; $this->comment("Мы готовы реализовать метод " . $method->code); foreach($method->категории как $category){ foreach($category->упражнения как $exersized->id){ array_push($упражнения, $упражнения); } } не установлено ($ метод); } //получим все упражнения для данного идентификатора категории если ($categoryId !== NULL){ $category = Категория::with('упражнения')->find($categoryId); если ($ категория == NULL) перерыв; $this->comment("Мы готовы обновить категорию " . $category->name_prefix . " " . $category->name); foreach($category->упражнения как $exersized->id){ array_push($упражнения, $упражнения); } не установлено ($ категория); } если ($exercisionId! = ноль) { $упражнение = Упражнение::найти($упражнениеId); if($упражнение!= NULL) { array_push($упражнения, $упражнения->id); $this->comment("Упражнение добавлено для экспорта: " . $exercision->name_prefix . " " . $exercision->name); } еще { } не установлено ($ упражнения); } если (пусто ($ упражнения)) { $this->error("Для данного метода/упражнения не найдено упражнений"); Выход(); } еще { $this->comment("В настоящее время подсчитывается " . count($exercisions) . " упражнений для экспорта"); } $fs = новая файловая система(); //зацикливаем упражнения и публикуем как положено foreach($упражнения как $exersizedId){ $упражнение = Упражнение::найти($упражнениеId); //определяем пункт назначения $путь = $база. $упражнение->getPath(); $this->comment("начинаем упражнение" . $exercision->id); //проверяем, существует ли путь, если есть, удаляем его if($fs->exists($path)){ $fs->deleteDirectory($path, true); $this->comment("стерто" . $путь); } //копируем файлы плеера //эхо «копирование». $путь. "
"; $fs->copyDirectory($playerPath, $path); $fs->cleanDirectory($path."styles/skins"); //копируем только необходимые файлы скинов для экономии места на диске $метод = $упражнение->метод(); if($fs->exists($playerPath."styles/skins/".$method->code)){ $fs->copyDirectory($playerPath."styles/skins/".$method->code, $path."styles/skins/".$method->code); } elseif($method->code == "kameleonspelling" || $method->code == "kameleontaalbeschouwing"){ $fs->copyDirectory($playerPath."styles/skins/kameleon", $path."styles/skins/kameleon"); } if($fs->exists($playerPath."styles/skins/".$method->code.".css")){ $fs->copy($playerPath."styles/skins/".$method->code.".css", $path."styles/skins/".$method->code.".css"); } $this->comment("файлы плеера скопированы в " . $path); //копируем ресурсы //echo «копирование ресурсов». $путь. "
"; $fs->copyDirectory($uploadsPath. $exercision->id. "/", $path); $this->comment("ресурсы скопированы в " . $path); //копируем ресурсы слайда $slides = Slide::where('exercisionID',"=",$exercision->id)->get(); mkdir($path."slides/"); foreach ($slides как $slide) { $image = $slide->image()->first(); если ($ изображение! = NULL) { $this->info($uploadsPath."slides/".$image->resourceUri); $this->info($path."slides/".$image->resourceUri); $fs->copy($uploadsPath."slides/".$image->resourceUri, $path."slides/".$image->resourceUri); } не установлено ($ изображение); } $this->comment("ресурсы слайдов скопированы в " . $path); //сохраняем XML-файл $content = Упражнение::getXmlContent($exercision->id); $fs->put($path. "exercision.xml", View::make('xml', $content)); $this->comment("xml сохранен в " . $path); $this->info("завершенное упражнение" . $exercision->id); не установлено ($ метод); не установлено ($ содержание); не установлено ($ слайды); gc_collect_cycles(); $this->info('Peak: ' . number_format(memory_get_peak_usage(), 0, '.', ',') . " bytes\n"); $this->info('End: ' . Number_format(memory_get_usage(), 0, '.', ',') . " bytes\n"); } $this->info("Удивительный опоссум => выполнил все упражнения "); $this->info('Peak: ' . number_format(memory_get_peak_usage(), 0, '.', ',') . " bytes\n"); $this->info('End: ' . Number_format(memory_get_usage(), 0, '.', ',') . "байты\n"); } catch(Исключение $e){ $this->error($e->getMessage()); $this->comment($e->getTraceAsString()); } } /** * Получите аргументы консольной команды. * * @return массив */ защищенная функция getArguments() { возвращаемый массив( //array('example', InputArgument::REQUIRED, 'Пример аргумента.'), ); } /** * Получите параметры консольной команды. * * @return массив */ защищенная функция getOptions() { возвращаемый массив( array('method', null, InputOption::VALUE_OPTIONAL, 'Идентификатор метода, для которого нужно экспортировать все упражнения.', null), array('category', null, InputOption::VALUE_OPTIONAL, 'Идентификатор категории, для которой нужно экспортировать все упражнения.', null), array('упражнение', null, InputOption::VALUE_OPTIONAL, 'Идентификатор упражнения для экспорта.', null), ); } } Это дамп моей команды трассировки xdebug с 20 операторами, потребляющими больше всего памяти:
Показаны 20 самых дорогостоящих вызовов, отсортированных по объему памяти. Инклюзивный Собственный функция #вызов памяти времени памяти времени -------------------------------------------------- -------------------------------------------------- --- debug_backtrace 646 0,0420 20353496 0,0420 20353496 Composer\Autoload\ClassLoader->loadClass 259 0,1911 17556224 0,1139 13953824 PDOStatement-> выполнить 743 0,1184 13729408 0,1184 13729408 array_merge 4051 0,1282 3894816 0,1282 3894816 Illuminate\Database\Eloquent\Model->newInstance 1534 0,4715 3806344 0,0791 3732712 PDOStatement->fetchAll 742 0,0323 2364264 0,0323 2364264 Illuminate\Database\Eloquent\Model->newBaseQueryBuilder 738 0,6625 2177352 0,0657 1688968 взорваться 3396 0,1026 1296960 0,1026 1296960 Illuminate\Database\Eloquent\Model->newFromBuilder 1534 0,6883 5139552 0,0944 1259576 str_replace 10254 0,3176 1228824 0,3176 1228824 компактный 920 0,0339 1181384 0,0339 1181384 PDO->подготовить 743 0,1403 816488 0,1403 816488 спринтф 2381 0,0741 802968 0,0741 802968 взорваться 5586 0,1722 536688 0,1722 536688 array_map 864 0,3164 588512 0,0386 477088 get_class_methods 15 0,0059 472296 0,0059 472296 Illuminate\Database\Eloquent\Model->newQuery 738 0,9783 3044352 0,0656 448488 включить 263 6,7525 5732672 0,0468 410416 call_user_func_array 1585 0,5734 3937936 0,0659 357056 SplFileInfo->getPathname 2724 0,0847 344768 0,0847 344768
Я написал ремесленную команду для экспорта упражнений из базы данных в автономные пакеты, которые можно использовать в системе электронного обучения, такой как Moodle, ...
Это огромное количество упражнений, и через некоторое время память утомляется.
Я пытался сбросить переменные, активировать сборщик мусора, отключить журнал запросов и выполнить некоторое профилирование, но до сих пор безуспешно
Я прикрепил свой сценарий ниже, с каждым выполняемым упражнением использование памяти увеличивается на 300 КБ. Есть идеи, что я могу сделать?
use Illuminate\Console\Command; используйте Illuminate\Filesystem\Filesystem; используйте Symfony\Component\Console\Input\InputOption; используйте Symfony\Component\Console\Input\InputArgument; set_time_limit (0); класс PracticeExportCommand расширяет команду { /** * Имя консольной команды. * * @var строка */ protected $name = 'упражнения:экспорт'; /** * Описание консольных команд. * * @var строка */ protected $description = 'Экспортировать все упражнения метода или конкретное упражнение.'; /** * Создайте новый экземпляр команды. * * @return void */ публичная функция __construct() { родитель::__construct(); } /** * Выполните консольную команду. * * @return void */ публичная функция fire() { пытаться { БД::disableQueryLog(); ini_set('memory_limit','1024M'); $this->info('Initial: ' . Number_format(memory_get_usage(), 0, '.', ',') . " bytes\n"); $base = базовый_путь(). "/экспорт/"; $playerPath = base_path(). "/public/preview/dist/"; $uploadsPath = base_path(). "/public/uploads/"; $methodId = $this->option('метод'); $categoryId = $this->option('категория'); $exercisionId = $this->option('упражнение'); $this->info("Качайтесь, детка..."); $this->info("Давайте экспортируем несколько упражнений, ладно?"); //мы создаем массив, содержащий все упражнения, которые нам нужно экспортировать $упражнения = массив(); if($methodId === NULL && $categoryId === NULL && $exercisionId === NULL){ //в любом случае, мы уже здесь, давайте сделаем все упражнения сразу... $this->comment("Ничего не указано, давайте выполним все упражнения"); $exercisions2 = Упражнение::all(); Еогеасп ($упражнения2 как $упражнения){ array_push($упражнения, $упражнения->id); } не установлено ($ упражнения2); } //получим все упражнения для данного идентификатора метода if($methodId !== NULL){ $method = Метод::with('categories.exercisions')->find($methodId); если ($ метод == NULL) перерыв; $this->comment("Мы готовы реализовать метод " . $method->code); foreach($method->категории как $category){ foreach($category->упражнения как $exersized->id){ array_push($упражнения, $упражнения); } } не установлено ($ метод); } //получим все упражнения для данного идентификатора категории если ($categoryId !== NULL){ $category = Категория::with('упражнения')->find($categoryId); если ($ категория == NULL) перерыв; $this->comment("Мы готовы обновить категорию " . $category->name_prefix . " " . $category->name); foreach($category->упражнения как $exersized->id){ array_push($упражнения, $упражнения); } не установлено ($ категория); } если ($exercisionId! = ноль) { $упражнение = Упражнение::найти($упражнениеId); if($упражнение!= NULL) { array_push($упражнения, $упражнения->id); $this->comment("Упражнение добавлено для экспорта: " . $exercision->name_prefix . " " . $exercision->name); } еще { } не установлено ($ упражнения); } если (пусто ($ упражнения)) { $this->error("Для данного метода/упражнения не найдено упражнений"); Выход(); } еще { $this->comment("В настоящее время подсчитывается " . count($exercisions) . " упражнений для экспорта"); } $fs = новая файловая система(); //зацикливаем упражнения и публикуем как положено foreach($упражнения как $exersizedId){ $упражнение = Упражнение::найти($упражнениеId); //определяем пункт назначения $путь = $база. $упражнение->getPath(); $this->comment("начинаем упражнение" . $exercision->id); //проверяем, существует ли путь, если есть, удаляем его if($fs->exists($path)){ $fs->deleteDirectory($path, true); $this->comment("стерто" . $путь); } //копируем файлы плеера //эхо «копирование». $путь. "
"; $fs->copyDirectory($playerPath, $path); $fs->cleanDirectory($path."styles/skins"); //копируем только необходимые файлы скинов для экономии места на диске $метод = $упражнение->метод(); if($fs->exists($playerPath."styles/skins/".$method->code)){ $fs->copyDirectory($playerPath."styles/skins/".$method->code, $path."styles/skins/".$method->code); } elseif($method->code == "kameleonspelling" || $method->code == "kameleontaalbeschouwing"){ $fs->copyDirectory($playerPath."styles/skins/kameleon", $path."styles/skins/kameleon"); } if($fs->exists($playerPath."styles/skins/".$method->code.".css")){ $fs->copy($playerPath."styles/skins/".$method->code.".css", $path."styles/skins/".$method->code.".css"); } $this->comment("файлы плеера скопированы в " . $path); //копируем ресурсы //echo «копирование ресурсов». $путь. "
"; $fs->copyDirectory($uploadsPath. $exercision->id. "/", $path); $this->comment("ресурсы скопированы в " . $path); //копируем ресурсы слайда $slides = Slide::where('exercisionID',"=",$exercision->id)->get(); mkdir($path."slides/"); foreach ($slides как $slide) { $image = $slide->image()->first(); если ($ изображение! = NULL) { $this->info($uploadsPath."slides/".$image->resourceUri); $this->info($path."slides/".$image->resourceUri); $fs->copy($uploadsPath."slides/".$image->resourceUri, $path."slides/".$image->resourceUri); } не установлено ($ изображение); } $this->comment("ресурсы слайдов скопированы в " . $path); //сохраняем XML-файл $content = Упражнение::getXmlContent($exercision->id); $fs->put($path. "exercision.xml", View::make('xml', $content)); $this->comment("xml сохранен в " . $path); $this->info("завершенное упражнение" . $exercision->id); не установлено ($ метод); не установлено ($ содержание); не установлено ($ слайды); gc_collect_cycles(); $this->info('Peak: ' . number_format(memory_get_peak_usage(), 0, '.', ',') . " bytes\n"); $this->info('End: ' . Number_format(memory_get_usage(), 0, '.', ',') . " bytes\n"); } $this->info("Удивительный опоссум => выполнил все упражнения "); $this->info('Peak: ' . number_format(memory_get_peak_usage(), 0, '.', ',') . " bytes\n"); $this->info('End: ' . Number_format(memory_get_usage(), 0, '.', ',') . "байты\n"); } catch(Исключение $e){ $this->error($e->getMessage()); $this->comment($e->getTraceAsString()); } } /** * Получите аргументы консольной команды. * * @return массив */ защищенная функция getArguments() { возвращаемый массив( //array('example', InputArgument::REQUIRED, 'Пример аргумента.'), ); } /** * Получите параметры консольной команды. * * @return массив */ защищенная функция getOptions() { возвращаемый массив( array('method', null, InputOption::VALUE_OPTIONAL, 'Идентификатор метода, для которого нужно экспортировать все упражнения.', null), array('category', null, InputOption::VALUE_OPTIONAL, 'Идентификатор категории, для которой нужно экспортировать все упражнения.', null), array('упражнение', null, InputOption::VALUE_OPTIONAL, 'Идентификатор упражнения для экспорта.', null), ); } } Это дамп моей команды трассировки xdebug с 20 операторами, потребляющими больше всего памяти:
Показаны 20 самых дорогостоящих вызовов, отсортированных по объему памяти. Инклюзивный Собственный функция #вызов памяти времени памяти времени -------------------------------------------------- -------------------------------------------------- --- debug_backtrace 646 0,0420 20353496 0,0420 20353496 Composer\Autoload\ClassLoader->loadClass 259 0,1911 17556224 0,1139 13953824 PDOStatement-> выполнить 743 0,1184 13729408 0,1184 13729408 array_merge 4051 0,1282 3894816 0,1282 3894816 Illuminate\Database\Eloquent\Model->newInstance 1534 0,4715 3806344 0,0791 3732712 PDOStatement->fetchAll 742 0,0323 2364264 0,0323 2364264 Illuminate\Database\Eloquent\Model->newBaseQueryBuilder 738 0,6625 2177352 0,0657 1688968 взорваться 3396 0,1026 1296960 0,1026 1296960 Illuminate\Database\Eloquent\Model->newFromBuilder 1534 0,6883 5139552 0,0944 1259576 str_replace 10254 0,3176 1228824 0,3176 1228824 компактный 920 0,0339 1181384 0,0339 1181384 PDO->подготовить 743 0,1403 816488 0,1403 816488 спринтф 2381 0,0741 802968 0,0741 802968 взорваться 5586 0,1722 536688 0,1722 536688 array_map 864 0,3164 588512 0,0386 477088 get_class_methods 15 0,0059 472296 0,0059 472296 Illuminate\Database\Eloquent\Model->newQuery 738 0,9783 3044352 0,0656 448488 включить 263 6,7525 5732672 0,0468 410416 call_user_func_array 1585 0,5734 3937936 0,0659 357056 SplFileInfo->getPathname 2724 0,0847 344768 0,0847 344768
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Android — в чем разница между оперативной памятью Android и оперативной памятью ПК
Anonymous » » в форуме Android - 0 Ответы
- 87 Просмотры
-
Последнее сообщение Anonymous
-