У меня не хватает памяти при копировании (дублировании) Продукта, и у меня возникли проблемы с освобождением памяти. Я использую фреймворк Flow с Neos. Я создал деструкторы для объекта таким образом, что деструктор в объекте вызывает деструктор его переменных.
После уничтожения я хочу получить продукт из базы данных, которая не содержит встроенных объектов (они выбираются из базы данных по запросу).
Это то, с чем я пришел до сих пор:
$memoryLimit = $this->getMemoryLimit() * 0.5;
$upperMemoryLimit = $this->getMemoryLimit() * 0.6;
$clonedProduct = new Product();
foreach ($product->getSuperStructures() as $superStructure) {
if (!$superStructure->isSupported()) {
continue;
}
if ($isConverting && !$superStructureType->hasMountingForm($superStructure->getPlatform()->getMountingForm())) {
continue;
}
$clonedSuperStructure = $this->superStructureRepository->copySimple($superStructure);
$clonedProduct->addSuperStructure($clonedSuperStructure);
error_log('Memory: ' . memory_get_peak_usage() . ' > ' . $memoryLimit);
if (memory_get_peak_usage() > $memoryLimit && memory_get_peak_usage() < $upperMemoryLimit) {
//updateing the product
$this->update($clonedProduct);
$this->persistenceManager->persistAll();
$pid = $clonedProduct->getPid();
//getting smaller object from db
error_log('Cloned Product PID: ' . $pid);
//destructing the old one
error_log('Memory - before unset: ' . memory_get_peak_usage());
$clonedProduct->__destruct();
error_log('Memory - after unset: ' . memory_get_peak_usage());
$clonedProduct = $this->findByIdentifier($clonedProduct->getPid());
error_log('Retrived Product PID: ' . $clonedProduct->getPid());
}
}
образец __desctruct метод — Продукт
public function __destruct()
{
error_log('destructing product');
$this->picture = null;
$this->defaultInsideDimensions = null;
$this->defaultOutsideDimensions = null;
$this->company = null;
$this->snippet = null;
$this->pdfSnippet = null;
$this->superStructureType = null;
if ($this->superStructures instanceof ArrayCollection) {
foreach ($this->superStructures as $superStructure) {
$superStructure->__destruct();
}
}
error_log('product destructed');
}
В журнале ошибок я вижу, что память до «unset» такая же, как и после.
Есть идеи?
Большое спасибо.
Михал.
Задача ещё не решена.
Других решений пока нет …