From b56ff0c31ce0c753eb5be5ca34fc42a274ff0833 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Mon, 8 Mar 2021 18:28:04 +0200 Subject: [PATCH] Improve memory management for flex --- .../Flex/Types/Pages/Storage/PageStorage.php | 21 ++++-- .../Framework/Flex/Storage/FileStorage.php | 1 + .../Framework/Flex/Storage/FolderStorage.php | 67 +++++++++---------- .../Framework/Flex/Storage/SimpleStorage.php | 1 + 4 files changed, 48 insertions(+), 42 deletions(-) diff --git a/system/src/Grav/Common/Flex/Types/Pages/Storage/PageStorage.php b/system/src/Grav/Common/Flex/Types/Pages/Storage/PageStorage.php index a23517456..262161302 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/Storage/PageStorage.php +++ b/system/src/Grav/Common/Flex/Types/Pages/Storage/PageStorage.php @@ -110,6 +110,9 @@ class PageStorage extends FolderStorage } } catch (RuntimeException $e) { $frontmatter = 'ERROR: ' . $e->getMessage(); + } finally { + $file->free(); + unset($file); } return $frontmatter; @@ -127,6 +130,9 @@ class PageStorage extends FolderStorage $raw = $file->raw(); } catch (RuntimeException $e) { $raw = 'ERROR: ' . $e->getMessage(); + } finally { + $file->free(); + unset($file); } return $raw; @@ -439,16 +445,19 @@ class PageStorage extends FolderStorage } else { $debugger->addMessage('Page content has not been changed, do not update the file', 'debug'); } - - /** @var UniformResourceLocator $locator */ - $locator = Grav::instance()['locator']; - if ($locator->isStream($newFolder)) { - $locator->clearCache(); - } } catch (RuntimeException $e) { $name = isset($file) ? $file->filename() : $newKey; throw new RuntimeException(sprintf('Flex saveRow(%s): %s', $name, $e->getMessage())); + } finally { + /** @var UniformResourceLocator $locator */ + $locator = Grav::instance()['locator']; + $locator->clearCache(); + + if (isset($file)) { + $file->free(); + unset($file); + } } $row['__META'] = $this->getObjectMeta($newKey, true); diff --git a/system/src/Grav/Framework/Flex/Storage/FileStorage.php b/system/src/Grav/Framework/Flex/Storage/FileStorage.php index b8e2169d3..eabd658fe 100644 --- a/system/src/Grav/Framework/Flex/Storage/FileStorage.php +++ b/system/src/Grav/Framework/Flex/Storage/FileStorage.php @@ -84,6 +84,7 @@ class FileStorage extends FolderStorage $file = $this->getFile($path); $file->delete(); $file->free(); + unset($file); return true; } diff --git a/system/src/Grav/Framework/Flex/Storage/FolderStorage.php b/system/src/Grav/Framework/Flex/Storage/FolderStorage.php index 27e60ce3c..b8ebe06f2 100644 --- a/system/src/Grav/Framework/Flex/Storage/FolderStorage.php +++ b/system/src/Grav/Framework/Flex/Storage/FolderStorage.php @@ -377,13 +377,14 @@ class FolderStorage extends AbstractFilesystemStorage $file = $this->getFile($path); try { $data = (array)$file->content(); - $file->free(); if (isset($data[0])) { throw new RuntimeException('Broken object file'); } - unset($file); } catch (RuntimeException $e) { $data = ['__ERROR' => $e->getMessage()]; + } finally { + $file->free(); + unset($file); } $data['__META'] = $this->getObjectMeta($key); @@ -426,17 +427,19 @@ class FolderStorage extends AbstractFilesystemStorage $file = $this->getFile($path); $file->save($row); - $file->free(); - /** @var UniformResourceLocator $locator */ - $locator = Grav::instance()['locator']; - if ($locator->isStream($path)) { - $locator->clearCache(); - } } catch (RuntimeException $e) { throw new RuntimeException(sprintf('Flex saveFile(%s): %s', $path ?? $key, $e->getMessage())); + } finally { + /** @var UniformResourceLocator $locator */ + $locator = Grav::instance()['locator']; + $locator->clearCache(); + + if (isset($file)) { + $file->free(); + unset($file); + } } - unset($file); $row['__META'] = $this->getObjectMeta($key, true); @@ -455,14 +458,14 @@ class FolderStorage extends AbstractFilesystemStorage if ($file->exists()) { $file->delete(); } - - /** @var UniformResourceLocator $locator */ - $locator = Grav::instance()['locator']; - if ($locator->isStream($filename)) { - $locator->clearCache($filename); - } } catch (RuntimeException $e) { throw new RuntimeException(sprintf('Flex deleteFile(%s): %s', $filename, $e->getMessage())); + } finally { + /** @var UniformResourceLocator $locator */ + $locator = Grav::instance()['locator']; + $locator->clearCache(); + + $file->free(); } return $data; @@ -477,14 +480,12 @@ class FolderStorage extends AbstractFilesystemStorage { try { Folder::copy($this->resolvePath($src), $this->resolvePath($dst)); - - /** @var UniformResourceLocator $locator */ - $locator = Grav::instance()['locator']; - if ($locator->isStream($src) || $locator->isStream($dst)) { - $locator->clearCache(); - } } catch (RuntimeException $e) { throw new RuntimeException(sprintf('Flex copyFolder(%s, %s): %s', $src, $dst, $e->getMessage())); + } finally { + /** @var UniformResourceLocator $locator */ + $locator = Grav::instance()['locator']; + $locator->clearCache(); } return true; @@ -499,14 +500,12 @@ class FolderStorage extends AbstractFilesystemStorage { try { Folder::move($this->resolvePath($src), $this->resolvePath($dst)); - - /** @var UniformResourceLocator $locator */ - $locator = Grav::instance()['locator']; - if ($locator->isStream($src) || $locator->isStream($dst)) { - $locator->clearCache(); - } } catch (RuntimeException $e) { throw new RuntimeException(sprintf('Flex moveFolder(%s, %s): %s', $src, $dst, $e->getMessage())); + } finally { + /** @var UniformResourceLocator $locator */ + $locator = Grav::instance()['locator']; + $locator->clearCache(); } return true; @@ -520,17 +519,13 @@ class FolderStorage extends AbstractFilesystemStorage protected function deleteFolder(string $path, bool $include_target = false): bool { try { - $success = Folder::delete($this->resolvePath($path), $include_target); - - /** @var UniformResourceLocator $locator */ - $locator = Grav::instance()['locator']; - if ($locator->isStream($path)) { - $locator->clearCache(); - } - - return $success; + return Folder::delete($this->resolvePath($path), $include_target); } catch (RuntimeException $e) { throw new RuntimeException(sprintf('Flex deleteFolder(%s): %s', $path, $e->getMessage())); + } finally { + /** @var UniformResourceLocator $locator */ + $locator = Grav::instance()['locator']; + $locator->clearCache(); } } diff --git a/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php b/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php index 4475a27ad..49bf1892b 100644 --- a/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php +++ b/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php @@ -415,6 +415,7 @@ class SimpleStorage extends AbstractFilesystemStorage $file->save($content); $this->modified = (int)$file->modified(); // cast false to 0 $file->free(); + unset($file); } catch (RuntimeException $e) { throw new RuntimeException(sprintf('Flex save(): %s', $e->getMessage())); }