App Engine Standard上的Laravel:/ srv / bootstrap / cache目录必须存在且可写

时间:2019-07-07 10:26:30

标签: php laravel google-app-engine google-app-engine-php

我已经在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文件夹是否存在。

无论如何,我们非常感谢所有帮助。如果您需要更多代码段,请询问。我很乐意提供它们。

4 个答案:

答案 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.yamlbootstrap/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