我已经在Google App Engine标准环境中挣扎了一天。
错误如下:
PHP Notice: Exception: The /srv/bootstrap/cache directory must be present and writable. in /srv/vendor/laravel/framework/src/Illuminate/Foundation/PackageManifest.php:168
我知道/tmp
文件夹是App Engine标准环境的唯一可写文件夹。因此,我的app.yaml
具有以下附加的env_variables
:
APP_STORAGE: "/tmp"
VIEW_COMPILED_PATH: "/tmp"
...我的bootstrap/app.php
包含以下行:
$app->useStoragePath(env('APP_STORAGE', base_path() . '/tmp'));
...并且我的composer.json
使用以下脚本来说明配置的更改:
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump"
],
"post-install-cmd": [
"composer dump-autoload",
"php artisan config:clear",
"php artisan cache:clear",
"php artisan view:clear",
"php artisan cache:clear",
"php artisan regenerate:schoolCSS"
]
这些是我在app.yaml
中配置的驱动程序:
SESSION_DRIVER: database
BROADCAST_DRIVER: log
CACHE_DRIVER: database
QUEUE_DRIVER: sync
由于某种原因,我似乎找不到一种方法来将/tmp
文件夹设置为放置缓存的视图和配置的文件夹。实际上,我怀疑...:clear
命令根本没有正确运行。
无论路径如何,我的应用程序现在只是一张白纸。这是公平的,因为由于缓存不可写,因此无法在其中呈现和存储视图。
以上配置应与在https://cloud.google.com/community/tutorials/run-laravel-on-appengine-standard这样的Google App Engine标准上安装Laraval的教程相匹配。
在云控制台中,我检查了/tmp
文件夹是否存在。
无论如何,我们非常感谢所有帮助。如果您需要更多代码段,请询问。我很乐意提供它们。
答案 0 :(得分:1)
我找到了解决此问题的简单方法。 Google App Engine标准为只读。因此,您必须将缓存文件写入/tmp
。
您可以通过简单地将此环境变量添加到app.yaml
APP_SERVICES_CACHE: /tmp/services.php
APP_PACKAGES_CACHE: /tmp/packages.php
APP_CONFIG_CACHE: /tmp/config.php
APP_ROUTES_CACHE: /tmp/routes.php
答案 1 :(得分:1)
您的app.yaml
和bootstrap/app.php
看起来不错。
但是您还需要做一件事:
如果您使用Laravel 6或更高版本,请删除facade/ignition
依赖项:
composer remove --dev facade/ignition
或
如果您使用的是Laravel 5或更早的版本,请删除beyondcode/laravel-dump-server
:
composer remove --dev beyondcode/laravel-dump-server
这是您提到的社区文档对此要说的:
这是一个错误修复程序,该错误是由于Laravel在bootstrap / cache / services.php中进行缓存而导致的。
Community tutorial on setting up Laravel in App Engine Standard Environment.
答案 2 :(得分:0)
部署之前,请尝试:
php artisan route:clear
php artisan view:clear
php artisan config:clear
php artisan cache:clear
php artisan optimize:clear
对我来说是optimize:clear
答案 3 :(得分:-1)
这可能与以下事实有关:在Illuminate \ Foundation \ Application.php中,路径在正常执行时是从$ this-> bootstrapPath()(返回绝对路径)解析的,但似乎是从运行测试时APP_CONFIG_CACHE变量和其他变量?
/**
* Get the path to the configuration cache file.
*
* @return string
*/
public function getCachedConfigPath()
{
return Env::get('APP_CONFIG_CACHE', $this->bootstrapPath().'/cache/config.php');
}
Replacing it like this seems to do the job on my side.
/**
* Get the path to the cached services.php file.
*
* @return string
*/
public function getCachedServicesPath()
{
return $this->basePath(Env::get('APP_SERVICES_CACHE', 'bootstrap/cache/services.php'));
}
/**
* Get the path to the cached packages.php file.
*
* @return string
*/
public function getCachedPackagesPath()
{
return $this->basePath(Env::get('APP_PACKAGES_CACHE', 'bootstrap/cache/packages.php'));
}
/**
* Get the path to the configuration cache file.
*
* @return string
*/
public function getCachedConfigPath()
{
return $this->basePath(Env::get('APP_CONFIG_CACHE', 'bootstrap/cache/config.php'));
}
/**
* Get the path to the routes cache file.
*
* @return string
*/
public function getCachedRoutesPath()
{
return $this->basePath(Env::get('APP_ROUTES_CACHE', 'bootstrap/cache/routes.php'));
}
/**
* Get the path to the events cache file.
*
* @return string
*/
public function getCachedEventsPath()
{
return $this->basePath(Env::get('APP_EVENTS_CACHE', 'bootstrap/cache/events.php'));
}
然后 给予许可
sudo chmod -R 775 bootstrap/cache/
运行波纹管命令
php artisan config:cache