diff --git a/docs/en/00_Getting_Started/03_Environment_Management.md b/docs/en/00_Getting_Started/03_Environment_Management.md
index ea8abeedd..869ed26e0 100644
--- a/docs/en/00_Getting_Started/03_Environment_Management.md
+++ b/docs/en/00_Getting_Started/03_Environment_Management.md
@@ -122,6 +122,4 @@ Silverstripe core environment variables are listed here, though you're free to d
| `SS_DATABASE_SSL_CA` | Absolute path to SSL Certificate Authority bundle file |
| `SS_DATABASE_SSL_CIPHER` | Optional setting for custom SSL cipher |
| `SS_FLUSH_ON_DEPLOY` | Try to detect deployments through file system modifications and flush on the first request after every deploy. Does not run "dev/build", but only "flush". Possible values are `true` (check for a framework PHP file modification time), `false` (no checks, skip deploy detection) or a path to a specific file or folder to be checked. See [DeployFlushDiscoverer](api:SilverStripe\Core\Startup\DeployFlushDiscoverer) for more details.
False by default. |
-
-Note: A few additional PHP constants can be configured through a custom `index.php` rather than environment variables - see [constants.php](https://github.com/silverstripe/silverstripe-framework/blob/4/src/includes/constants.php) for details.
-Most notably, `TEMP_PATH` can be set as file storage used for the default cache adapters in [Manifests](/developer_guides/execution_pipeline/manifests), [Object Caching](/developer_guides/performance/caching) and [Partial Template Caching](/developer_guides/templates/partial_template_caching). It defaults to PHP's built-in `sys_get_temp_dir()`.
+| `SS_TEMP_PATH` | File storage used for the default cache adapters in [Manifests](/developer_guides/execution_pipeline/manifests), [Object Caching](/developer_guides/performance/caching) and [Partial Template Caching](/developer_guides/templates/partial_template_caching). It defaults to creating a sub-directory of PHP's built-in `sys_get_temp_dir()`. Can be an absolute path (with a leading `/`), or a path relative to the project root. |
diff --git a/docs/en/04_Changelogs/4.10.0.md b/docs/en/04_Changelogs/4.10.0.md
index 9d3c4d310..120375a10 100644
--- a/docs/en/04_Changelogs/4.10.0.md
+++ b/docs/en/04_Changelogs/4.10.0.md
@@ -10,7 +10,7 @@
## Regression test and Security audit{#audit}
-This release has been comprehensively regression tested and passed to a third party for a security-focused audit.
+This release has been comprehensively regression tested and passed to a third party for a security-focused audit.
While it is still advised that you perform your own due diligence when upgrading your project, this work is performed to ensure a safe and secure upgrade with each recipe release.
@@ -24,6 +24,17 @@ We've recently updated our [PHP support policy](/Getting_Started/Server_Requirem
## Features and enhancements {#features-and-enhancements}
+### New `SS_TEMP_PATH` environment variable
+
+This release adds support for a new `SS_TEMP_PATH` environment variable, which allows developers to control where a series of “temporary” files are created. These include [Manifests](/developer_guides/execution_pipeline/manifests), [Object Caching](/developer_guides/performance/caching) and [Partial Template Caching](/developer_guides/templates/partial_template_caching).
+
+The environment variable can be set to either an absolute path which must have a leading `/` (e.g. `SS_TEMP_PATH='/tmp/silverstripe/cachedir'`), or a path relative to the project root (e.g. `SS_TEMP_PATH='silverstripe-cache'`). See the [environment management](/getting_started/environment_management) section for more information.
+
+**Please note:** setting this environment variable will impact both requests served by a webserver (i.e. a typical website pageview) and command-line execution. If your webserver user and command-line user are different, or have different filesystem permissions, you may encounter problems when using this setting.
+
+The new `SS_TEMP_PATH` environment variable replaces the similarly-named `TEMP_PATH` environment variable, which only ever offered partial support for adjusting the temporary files' location. This is because setting a `TEMP_PATH` _environment variable_ would affect [Injector](/developer_guides/extending/injector) service definitions, but would **not** affect code that referenced the `TEMP_PATH` _PHP constant_. The confusion with both environment variables and PHP constants having the same name is why the environment variable has been renamed and prefixed with `SS_`, in-keeping with other environment variables.
+
+The functionality of the `TEMP_PATH` and `TEMP_FOLDER` PHP constants remains unchanged.
## Bugfixes {#bugfixes}
diff --git a/src/Core/CoreKernel.php b/src/Core/CoreKernel.php
index 595a60cb6..885fb50a8 100644
--- a/src/Core/CoreKernel.php
+++ b/src/Core/CoreKernel.php
@@ -497,7 +497,7 @@ class CoreKernel implements Kernel
{
return new ManifestCacheFactory([
'namespace' => 'manifestcache',
- 'directory' => TempFolder::getTempFolder($this->basePath),
+ 'directory' => TEMP_PATH,
]);
}
diff --git a/src/includes/constants.php b/src/includes/constants.php
index 17b67166a..58275ce7f 100644
--- a/src/includes/constants.php
+++ b/src/includes/constants.php
@@ -15,9 +15,9 @@ use SilverStripe\Core\TempFolder;
* - BASE_URL: Full URL to the webroot, e.g. "http://my-host.com/my-webroot" (no trailing slash).
* - BASE_PATH: Absolute path to the webroot, e.g. "/var/www/my-webroot" (no trailing slash).
* See Director::baseFolder(). Can be overwritten by Config::modify()->set(Director::class, 'alternate_base_folder', ).
- * - TEMP_PATH: Absolute path to temporary folder, used as base for $TEMP_FOLDER. Example: "/var/tmp"
- * - TEMP_FOLDER: folder name for manifest and template caches. Example: "silverstripe-cache-php7.2"
- * See getTempFolder(). No trailing slash.
+ * - TEMP_PATH: Path to temporary folder for manifest and template caches. May be relative to project root or an
+ * absolute path. No trailing slash. Can be set with the SS_TEMP_PATH environment variable.
+ * - TEMP_FOLDER: DEPRECATED. Same as TEMP_PATH.
* - ASSETS_DIR: Dir for assets folder. e.g. "assets"
* - ASSETS_PATH: Full path to assets folder. e.g. "/var/www/my-webroot/assets"
* - THEMES_DIR: Path relative to webroot, e.g. "themes"
@@ -199,6 +199,13 @@ if (defined('CUSTOM_INCLUDE_PATH')) {
if (!defined('TEMP_PATH')) {
if (defined('TEMP_FOLDER')) {
define('TEMP_PATH', TEMP_FOLDER);
+ } elseif ($path = Environment::getEnv('SS_TEMP_PATH')) {
+ // If path is relative, rewrite it to be relative to BASE_PATH - as web requests are relative to
+ // public/index.php, and we don't want the TEMP_PATH to be inside the public/ directory by default
+ if (ltrim($path, DIRECTORY_SEPARATOR) === $path) {
+ $path = BASE_PATH . DIRECTORY_SEPARATOR . $path;
+ }
+ define('TEMP_PATH', $path);
} else {
define('TEMP_PATH', TempFolder::getTempFolder(BASE_PATH));
}